简介:PIC24HJ中断控制器模块将众多的中断请求简化成一个对CPU的中断,有如下的特点:
- 高达8个处理器异常和软件嵌套
- 7个优先级
- 126个中断向量表IVT
- 每个向量和异常源分配一个向量
- 用户优先级内的混合优先级
- 用于调试支持的交替向量表
- 固定的中断入口和返回
126个中断源的结构如下:
中断向量表:
126个向量表包括了8个未掩膜的向量号,以及118个中断源。每一个向量包括了24位宽度的地址,指向中断服务程序。
辅向量表:
在INTCON2中定义了此位,该向量表用于调试,如果不需要用,可以关掉。
复位序列:
器件复位不是一个真正的异常,以为复位以后,PC从0开始执行,所以不需要中断程序来执行支持复位的操作。
中断向量号的细节如下:
可以看出,每一个地址已经固定了一个中断向量号。
CPU的优先级状态:
CPU可以工作在16个优先级状态下,中断和陷阱源必须比现有的CPU的优先级更高,可以设置外设或者外部中断的中断源在0~7,而CPU设置优先级在8~15.
未掩膜的中断源用于检测硬件和软件的问题,优先级是固定的。
中断源的优先级不能设置为0,以为优先级不能比CPU优先级更高。?
可以功过IPL2~0和IPL3来设计CPU的优先级,比如设置CPU的优先级IPL2~0为3,则0123的优先级中断服务程序将不再有效。
IPL3用来设置陷阱中断,显然,可以清零,而不能置位。
如果设置IPL为111,则所有的用户中断都被关掉。
中断优先级:
每一个外设源可以设计0~7的一个优先级。
每一个IPC寄存器中包含4个3位的优先级设置值,可以设置成0~7.优先级可以在1~7中间进行设置,如果设置成0,则不会被执行到。在配置优先级的时候,一定要注意先关掉中断,否则会产生意外的结果。
一个优先级,可以对应很多不同的中断源,如果优先级相同,则按照IVT上的顺序来排队,更低的向量号有更高的优先级。
也就是说,先看优先级设置,再查找IVT的列队顺序来决定谁的优先级更高。
无掩膜的陷阱中断
有如下几种陷阱中断:
振荡器错误
堆栈错误
地址错误
算法错误
DMAC错误
他们的优先级顺序见上表
上面的几种陷阱分为两种,一种是软陷阱,一种是硬陷阱。
DMAC陷阱(优先级为10),算法错误陷阱(优先级为11)和堆栈陷阱(优先级为12)成为软陷阱源。
软陷阱的处理方式和IVT中的中断一样处理,在异常处理之前需要两个周期的采样和响应,因此,软陷阱响应之前,还会继续执行执行指令。
堆栈错误陷阱:
复位的时候,堆栈的位置在0X0800,如下:
如果堆栈指针指向了比0X0800更低的地址,将干涉SFR,另外有一个堆栈指针限制寄存器SPLIM。
如果堆栈指针超出了SPLIM,也产生一个堆栈陷阱中断。
算法错误陷阱:
这个很简单,除数不能是0,如果是0,则触发这个陷阱,在软件里面必须清零这个陷阱,否则将一直循环下去。
DMAC错误陷阱:
RAM写冲突和准备RAM写冲突,也就是当CPU和DMA都打算写目标地址,CPU胜出,DMA错误陷阱。
硬陷阱:
硬陷阱的优先级更高,地址错误(优先级为13),振荡器错误(优先级14)。
硬陷阱的优先级不能设置,与软陷阱不同的是,硬陷阱强制CPU停止执行代码,直到陷阱被清除。
如果有低优先级中断程序在执行,则必须先处理硬陷阱,并处理完成以后,低优先级程序才能继续进行。
如果多个硬陷阱发生,只能复位器件了。
器件会自动复位硬陷阱的条件,陷阱复位标志中可以查看到复位的类型,如下:
TRAPR=1:陷阱冲突复位发生。
振荡器失败陷阱:
如下原因可以导致振荡器失败陷阱:
- 时钟监视器打开,发现没有时钟
- 正常使用PLL时,发现PLL丢失。
- 监视打开,在上电复位时发现PLL异常
这里注意,在陷阱处理函数中,要记得清零,否则将一直循环。
地址错误陷阱:
如下情况会导致地址错误陷阱:
- 取数据失败
- 位篡改
- 数据获取位置错误
- 执行跳转指令,没有发现该地址
- PC指向不知名地址
同样,处理完陷阱,要记得清零,避免一直循环。
关中断指令:
在时间要求很高的代码中,可以插入高达16384条指令的关中断。
当然,只能关1~6的中断,如果设置为7或者陷阱中断,则关中断无效。
并且,既然有一个关掉的时间限制,当然有一个响应的计数器,DISICNT,其中有14位有效,每执行一条指令,减一。
直到减完后,中断自动打开。
此寄存器还可以读写,在关掉中断之前,必须先写入一个稳定的数值进去。
中断操作:
中断使能后,如果中断标志指示有中断请求,则优先级开始评估要处理哪一个中断函数。
如果IPL中设置的处理器优先级低于用户的优先级,则开启启动响应中断,开始压栈:
PC,状态寄存器,IPL3状态。
PC自不用说,IPL则保存刚刚执行的优先级值。
中断返回:
RETFIE指令返回,并将刚刚压入的数据解出来。
嵌套:
INTCON1的NSTDIS可以设置中断的嵌套,如果设置此位为1,则设置有,强制CPU=7,不再执行其他程序。
从睡眠和闲置模式下唤醒:
中断是单独使能的,任何使能的中断源将处理器从睡眠和闲置模式下唤醒。当处理器唤醒,会发生:
- 如果优先级高于当前CPU的优先级,则开始处理中断。
- 级别不够?继续睡觉……
ADC转换请求和外部中断支持。
关于中断处理的时间和步骤,以及各个中断相关寄存器,见下文。
文章评论(0条评论)
登录后参与讨论