MSP430的中断分为3种:系统复位、非屏蔽中断和可屏蔽中断。系统复位指向中断向量表(表3-11)的最高地址0xFFFE。非屏蔽中断和可屏蔽中断根据能否被SR寄存器中的全局中断使能位GIE禁用来区分,非屏蔽中断不受GIE的控制,具备独立的中断使能;可屏蔽中断除了受本身的中断使能控制,还接受GIE控制。
在MSP430中非屏蔽中断主要有3个,分别是来自MSP430外部管脚NMI的触发、FLASH非法访问以及振荡器错误。非屏蔽中断都指向中断向量表中的0xFFFC地址。
MSP430具备大量的可屏蔽中断,定时器、ADC、DMA、UART、WDT、I/O、比较器等都具备中断功能。不同的可屏蔽中断优先级可根据中断向量表决定,G2系列的MSP430中断向量表如表3-11所示。可屏蔽中断的中断向量表从0xFFFA地址开始向低地址扩展,地址越高的中断向量表所对应的中断优先级越高。
每个中断向量在中断向量表里面占据一个2Byte空间的表项,这个2Byte的空间用来存储对应中断服务函数的首地址,CPU根据中断向量表里的地址跳转到中断服务函数。仔细观察中断向量表可以看到,一些中断向量对应于多个中断源。例如,地址为0xFFF8的Timer1_A3中断,当TA1CCR1中断标志位CCIFG置位或者TAIFG置位都会跳转到该向量。又如具备中断功能的P1和P2端口,端口中的任意一个管脚发生中断都会跳转到对应的中断向量。这种中断就叫做多源中断。对于多源中断,中断源中任意一个中断发生都会跳转到公用的中断向量表项,这个时候需要通过中断标志位区别具体的中断源。有了这些中断向量表的基础知识,下面介绍中断的处理过程,包括中断的接收和退出过程。
表3-11MSP430G2553中断向量表
中断源中断标志系统中断字地址优先级
中断源中断标志系统中断字地址优先级
加电
外部复位
安全装置定时器+
违反闪存密钥范围之外PCPORIFG
RSTIFG
WDTIFG
PCKEYV复位0FFFEh 31最高
NMI
振荡器故障
闪存内存访问冲突NMIIFG
OFIFG
ACCVIFG(不)可屏蔽
(不)可屏蔽(不)可屏蔽0FFFCh 30
Timer1_A3 TA1CCR0 CCIFG可屏蔽0FFFAh29
Timer1_A3TA1CCR2 TA1CCR1 CCIFG
TAIFG可屏蔽0FFF8h 28
Comparator_A+CAIFG可屏蔽0FFF6h 27
安全装置定时器+ WDTIFG可屏蔽0FFF4h 26
Timer0_A3 TA0CCR0 CCIFG可屏蔽0FFF2h25
Timer0_A3TA0CCR2 TA0CCR1 CCIFG
TAIFG可屏蔽0FFF0h24
USCI_A0/USCI_B0 接收
USCI_B0 I2C 状态UCA0RXIFG
UCB0RXIFG可屏蔽0FFEEh23
USCI_A0/USCI_B0 发送
USCI_B0 I2C 收/发UCA0TXIFG
UCB0TXIFG可屏蔽0FFECh 22
ADC10 ADC10IFG可屏蔽0FFEAh 21
I/O 端口P2P2IFG.0至P2IFG.7可屏蔽0FFE6h 19
I/O 端口P1P1IFG.0至P1IFG.7可屏蔽0FFE4h18
未使用——0FFE2h17
未使用——0FFE0h16
安全密钥(BSLSKEY)——0FFDEh15
未使用——0FFDCh~0FFC0h14~0
微控制器使用过程中一些突发的程序跑飞问题,很多时候都是由于没有正确地处理中断造成的。中断发生的先决条件是对于中断使能位使能,非屏蔽中断要求其独立的中断使能开启;可屏蔽中断要求全局中断使能和自身中断使能同时开启。
当中断请求到达,CPU从接受中断请求到开始执行中断服务函数的第一条指令需要5~6个CPU周期。前面介绍过MSP430有两种CPU,分别是CPU和CPUX。其中CPU处理过程耗费6个CPU周期,而CPUX处理过程耗费5个CPU周期。中断请求接收后,会按照以下顺序处理:
1)CPU执行完当前指令。中断和CPU一般不是同步的或者CPU正在执行的指令不是单周期指令,所以CPU先处理完当前指令。
2)指向下一条CPU指令的PC被压栈。
3)状态寄存器SR压栈。步骤2和步骤3的目的是保护现场,为中断服务函数执行完之后恢复之前运行状态做准备。
4)选择最高优先级的中断进行服务。中断优先级在这个时候就会发挥作用。
5)单源中断标志位会被自动清零,多源中断标志位需要软件清零。因为具备I/O中断功能的P1、P2端口中断标志位属于多源中断标志位,其中断标志位不会自动清零,需要在代码中手动清零。
6)状态寄存器SR被清零,将会终止任何低功耗状态,并且全局中断使能被关闭(GIE)。MSP430在接收了中断后由于SR的清零操作自动关闭全局中断使能,就是说默认状态下是不允许中断嵌套的,若用到中断嵌套的话需要在中断服务函数中,打开全局中断。
7)中断向量中存储的中断服务函数地址被装载到PC中开始执行中断服务函数。
中断服务函数的最后一条汇编指令是RETI,表示从中断服务函数中返回。MSP430的返回过程比进入过程要快一些,主要是因为返回过程的时候CPU指令已经执行完。返回过程对于CPU需要5个CPU周期,对于CPUX需要3个CPU周期。按照下面的顺序执行返回操作:
① 状态寄存器SR出栈,SR的设置会立即生效。
② PC指针出栈,接着执行中断前的代码。
在使用中断时,如果某个中断开启,则一定要写中断服务函数,即便中断服务函数为空操作。这个过程是对中断向量赋值,避免中断发生后,程序跑飞。