ICC,即Interrupt Compare Controller,中断比较控制器,作用便是设定中断优先级,同时通过比较中断优先级等实现中断的硬件嵌套。 首先普及一下MSP430的中断系统,大部分的MSP430 MCU中断优先级是不能设置的,也就是说对于每一个中断源的优先级是体现设定好的,不支持后期用户自动设置,因此可以说如果正在执行低优先级的程序,突然来了一个高的优先级中断,是可以打断低优先级的服务程序的,但是前提是进入低优先级中断服务程序时开启了全局中断即GIE。但是如果高优先级中断正在执行服务程序,来了一个低优先级的中断,那么只能等待高优先级中断服务程序执行完之后,才可以去执行低优先级的中断服务程序,这样也就是说不能灵活实现中断的嵌套。 ICC模块就是为了解决这个问题而出现的,即可以通过寄存器配置,来实现低优先级的中断打断高优先级的中断,这就需要比较电路了,ICC内部就是这个原理,内部结构如下图所示: 目前到2019年低为止,MSP430 MCU(16bit)只有四款含有ICC模块:MSP430FR3153,MSP430FR2155, MSP430FR2353, MSP430FR2355。
下面再简单的描述一下中断嵌套的含义,如下图所示,ISR2优先级高于ISR1,那么在正在只从ISR1程序时,遇到ISR2时,则会先把ISR1暂停一下,去执行ISR2,当ISR2执行完之后,返回再接着执行ISR1。
而MCU时如何实现去执行另一个程序,执行完之后再返回原本的点执行程序的呢?如下图所示,这个就类似与中断向量即堆栈,分为Push和Pop,首先当正在执行ISR1时,遇到了ISR2中断,那么MCU会把ISR1当前执行的程序地址推入堆栈保存起来,然后把ISR2的中断向量填入PC指针,去执行ISR2的程序,当ISR2程序执行完后,再从堆栈中读出当时保存的ISR1执行的程序地址,然后接着执行。 入栈如下图所示:
出栈如下图所示:
|