MCU中断处理的那些事(一)
扫描二维码
随时随地手机看文章
MCU在正常的运行中,总是会遇到一些突然发生的事情,这些事情往往是MCU的硬件驱动的,和MCU的运行是异步关系的一些高优先级事件,这些事件可以打断MCU的正常代码运行,从而去操作另外的事情,这个事件就是中断,它需要去做的事情就是中断服务程序ISR.打个比方,一个人正在工作,突然口渴了想喝水,那么"喝水"这个比"工作"更优先的事件就可以打断工作。本文主要针对16位MCU及DSC的中断处理系统进行一些讨论。
图1 中断向量的位置及执行示意图
首先我们简要介绍一下中断处理系统。16位MCU有一个中断向量系统,这个向量系统可以支持高达8个不可mask的Traps源,及高达246个普通中断源。有人会问,什么是Traps源?这里其实就是如前面所描述的那样,它是不可屏蔽的中断,这些中断可以表示一些硬件或者软件上的故障发生。
在这些芯片中,每一个中断源都可以指定为7个不同的优先级,即从0-7的优先级。大家都知道进到中断和出中断是需要时间的,一般而言,基本的进入中断的延时为3个指令周期,而出中断延时为四个指令周期。这就是16位MCU及DSC的中断处理系统的一个基本认识。
每一个中断源,都可以触发一个独立的代码段的执行,这个独立的代码段就称之为中断服务程序ISR,而每一个ISR代码的起始地址是存储在芯片Flash的主中断向量表中,即IVT中。这里需要注意的是,每一个中断向量都是一个24位的地址。
图2 芯片FLASH存储的中断向量表及辅助中断向量表
从上图2可以看出,在MCU内部,用户的代码是放在中断向量表之后的,同时,我们也可以看出,除了中断向量表IVT之外,有的芯片还存在一个辅助中断向量表AIVT.
图3 辅助中断向量的作用
辅助中断向量AIVT的主要作用是提供一种在不同应用之间切换的方式,这种切换不需要重新编程中断向量,另一种情况,比如说评估采用不同的软件算法的两个应用的切换等。
图4 辅助中断向量的定义和使能
当定义了Boot Segment后,并且AIVT使能之后,辅助中断向量AIVT才可以使用。除了在配置位AIVTDIS上使能AIVT之外,还需要在特殊功能寄存器INTCON2中的AIVTEN位来使能它。当使能AIVT后,所有的中断和中断处理过程都会使用AIVT而不是用IVT了,这一点需要注意。
图5 辅助中断向量表的FLASH位置
图6 辅助中断向量的位置
AIVT在FLASH中的位置起始于Boot Segment的最后一个PAGE的第一个半页,这个起始位置由BSLIM来定义(具体某一个中断向量的地址由页地址和偏移地址决定),如图5所示。第二个半页实际上是不可以使用的,这里需要注意BSLIM的单位是PAGE。
图7 Boot Segment和AIVT的关系
图8 BOOT Segment中AIVT的实现
这里我们举例说明,当我们设置三个PAGE作为BOOT Segment时,这里将设置BSLIM为0x1FFC,最低的两位是0,确保实现3个PAGE.具体的FLASH的位置在图7中可以了解。
总结,以上初步介绍了16位MCU的中断处理系统的一些基本的特性,后面我们将继续介绍这一话题。





