MSP430F1121(下面简称F1121)是TI公司新近推出的一款廉价的20引脚低功耗16位Flash单片机。它所具备的多种中断功能使其应用灵活,并适用于各种不同的应用领域。
不过,我们在应用开发中发现,厂家提供的技术文件虽然不少,但是对有关中断的说明却不那么详尽,这就给应用开发造成了诸多不便。为此,我们专门用程序进行了一些试验,并从中明确了一些问题。在这里,我们就把这些问题说明一下,供大家参考。
在说明这些问题之前,有必要先来看一下F1121的中断,如表1所列。
表1 F1121中断
F1121的各个中断都有对应的中断向量和中断优先级,通常被分为三类:系统复位、(非)屏蔽中断和可屏蔽中断。此外,F1121的各中断又分单源中断和多源中断,对应的中断标志称为单源中断标志和多源中断标志。
一、 系统复位
从形式上讲,可以把系统复位看成一种中断,但这是一种特殊的中断,虽然它也有中断向量(复位向量)和中断优先级,但与通常意义的中断有明显的区别:系统复位导致系统进入初始状态,并迫使程序从头开始运行。
1. 导致系统复位的情况及POR和PUC信号
有4种情况能够导致系统复位,并且产生POR(Power-On Reset)和PUC(Power-Up Clear)信号:
· 上电复位——产生POR和PUC;
· RST复位(外部复位信号复位)——产生POR和PUC;
· 看门狗中断——仅产生PUC;
· 关键码错误中断——仅产生PUC。
POR和PUC都是系统复位时产生的芯片内部信号,负责对寄存器进行初始化。在F1121提供的技术文件中,由PUC信号负责初始化的那些寄存器位,其初始状态用“0”和“1”来表示,而由POR信号负责的,用“(0)”和“(1)”来表示。例如,图1所示的BCSCTL1寄存器,高4 位由POR负责,低4位由PUC负责。
不同的系统复位情况产生不同的PUC和POR,因而产生不同的系统初始化结果。例如,对于BCSCTL1寄存器,不管是什么原因造成了系统复位,其低4位都将回到初始状态上;高4位只有在上电复位和RST复位这两种情况下才会回到初始状态,而在其他情况下(除非芯片掉电)其状态保持不变。
2. 看门狗中断标志WDTIFG
看门狗定时器有两种工作方式,且都使用中断标志WDTIFG,但它们的表现却有明显的区别。在看门狗工作方式下(产生导致系统复位的看门狗中断),其表现为:当发生看门狗中断而导致系统复位时,WDTIFG将置“1”(其他复位情况下为“0”)。这时的WDTIFG不能自动清“0”,只有等待软件(程序指令)将其清“0”。不过即使不清“0”(无论WDTIFG是“1”还是“0”),也不会影响程序的运行,而且也不会妨碍再次产生看门狗中断。实际上,这时的WDTIFG仅仅是标记一下是否产生了看门狗中断的作用,以便区分系统复位的原因。另一个导致系统复位的关键码错误中断的中断标志KEYV 的情况也是如此。
另外,中断使能位WDTIE对看门狗中断不起任何作用。
二、 中断
中断分为可屏蔽中断和非屏蔽中断,区分它们的惟一准则是GIE(可屏蔽中断使能总控制位)能否禁止其中断。凡是能被GIE禁止的就是可屏蔽中断,不能被禁止的就是非屏蔽中断。
但是在F1121中,真正的非屏蔽中断只有看门狗中断和关键码错误中断。这两种中断却不是普通意义的中断,因为它们会导致系统复位。除此之外,还有三种中断属于非屏蔽中断的范畴,但它们却不是真正的非屏蔽中断,因为它们各自都有自己的中断使能控制位,这些中断使能控制位能够屏蔽它们的中断。所以,对这三种中断用“(非)屏蔽中断”来表示。
1. 中断标志
无论可屏蔽中断还是(非)屏蔽中断都有自己的中断标志,其共同特点是:① 中断标志的状态与该中断源能否产生中断无关。或者说,不管是否允许其中断,只要满足了中断的条件,中断标志就会置“1”。另外,也可以用软件将中断标志置 “1”或清“0”。② 中断源就是通过中断标志请求中断的(当允许其中断时)。下面以(看门狗)定时器中断(不同于看门狗中断,它产生可屏蔽中断,中断向量为FFF4h,中断优先级是10)为例进行说明。
· 在允许其中断的情况下,无论什么原因,只要WDTIFG置“1”就会产生中断。例如,定时器溢出(这时WDTIFG置“1”)会产生中断,用软件强行将WDTIFG置“1”也会产生中断。
· 如果在中断被禁止的情况下WDTIFG已经置“1”,那么一旦允许,它就会产生中断。
· 如果在中断被禁止的情况下WDTIFG已经置“1”,但是,假如在允许它中断之前将其清“0”,那么,即使允许,它也不会产生中断。
中断标志分为两种——单源中断标志和多源中断标志,它们有不同的特性。
(1) 单源中断标志
如果一个中断向量(也就是中断处理程序)只对应惟一的一个中断源,那么,这个中断就被称为单源中断,其中断标志就是单源中断标志。例如,(看门狗)定时器中断的WDTIFG、比较器A中断的CAIFG和定时器A中断的CCIFG0都是单源中断标志。
单源中断标志的特性是:当单源中断被响应时,其单源中断标志将会自动清“0”。
但须注意,如果在中断处理过程中(中断返回之前)这个单源中断标志又重新被置“1”,那么,它就不会自动清“0”了,只有用软件才能将其清“0”。
(2) 多源中断标志
如果一个中断向量对应于多个中断源(即多个中断共用一个中断处理程序),那么这些中断都称为多源中断,对应的各个中断标志都是多源中断标志。例如,三个(非)屏蔽中断的NMIIFG、OFIFG、ACCVIFG以及定时器A中断的CCIFG1、CCIFG2、 TAIFG和P1及P2口的所有中断标志都是多源中断标志。
多源中断标志的特性是:当多源中断被响应时,多源中断标志不能自动清“0”,只能用软件才能将其清“0”。因此,一定不要忘记在中断返回之前将多源中断标志清“0”;否则,当中断返回后,这个没有被清“0”的中断标志马上就会再次请求中断。
2. (非)屏蔽中断
一共有三个(非)屏蔽中断:NMI中断、振荡器故障中断和Flash读写错误中断。它们不受GIE状态的影响,但各自都有中断使能位:NMIIE、OFIE和ACCVIE,只有当中断使能位被置位后,才能允许对应的中断源产生中断。
注意:对这三个(非)屏蔽中断来说,只要响应了其中的一个中断,所有这三个中断使能位就会全部自动复位,而且一直保持在复位状态上,即使中断返回后它们也不会自动恢复为先前的状态,所以,需要用软件才能将它们重新置位。另外须注意的是,这三个中断都是多源中断。
3. 可屏蔽中断和GIE
能够被GIE禁止的中断都是可屏蔽中断,其中有的是单源中断(单源中断标志),有的是多源中断(多源中断标志)。所有这些中断都有各自的中断使能位,只有当中断使能位被置位并且GIE置位后,才能允许对应的中断源产生中断。除了系统复位或者用软件进行改写之外,其他任何情况(包括中断响应或中断返回等)都不会对这些中断使能位的状态产生影响。
GIE是可屏蔽中断使能总控制位,当它复位时禁止所有可屏蔽中断源请求中断,当它置位时才有可能允许它们请求中断(能否允许还取决于它们各自的中断使能位的状态)。
注意:当响应了任何一个中断时,包括可屏蔽中断和(非)屏蔽中断,GIE将会自动复位;当中断返回时它又会自动恢复为中断前的状态(除非在中断处理期间改写了保存在堆栈中的GIE的内容)。
如果在中断处理期间用软件将已经复位的GIE重新置位,这时就可以形成可屏蔽中断嵌套。
4. 中断优先级
F1121的中断优先级与其他微处理器中的概念略有不同:它只对同时发生多个中断的情况有效(级别高的中断优先被响应),而对中断嵌套的情况没有任何限制。
5. 中断嵌套
如果在处理某一中断期间又响应了其他中断请求,这时就会形成中断嵌套。中断嵌套时,前一中断处理过程被暂停,当后一中断被处理完之后才会继续处理前一中断。
注意:只有在中断处理期间将GIE重新置位,可屏蔽中断才能够嵌入到这个中断的处理之中;但(非)屏蔽中断却不受此限制,它们可以随时嵌入到任何处理之中(如果允许其中断的话)。另外,F1121的中断嵌套不受中断优先级的任何限制。也就是说,高级别中断可以嵌入到低级别中断的处理过程中;反过来,低级别中断也可以嵌入到高级别的中断处理过程中,甚至可以形成自身嵌套。这些情况对(非)屏蔽中断也不例外。因此,在使用F1121时须特别注意这一点,即使不是有意使用中断嵌套,也必须考虑这一问题,因为这时仍会存在发生中断嵌套的可能,而且,如果嵌套会影响中断的某一(些)状态的话,就有可能造成系统运行错误。