打印

使用MSP430F1121中断需注意的问题

[复制链接]
971|21
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
Flower1|  楼主 | 2018-12-5 10:36 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
使用MSP430F1121中断需注意的问题




      MSP430F1121(下面简称F1121)是TI公司推出的一款廉价的20引脚低功耗16位Flash单片机。它所具备的多种中断功能使其应用灵活,并适用于各种不同的应用领域。
  不过,我们在应用开发中发现,厂家提供的技术文件虽然不少,但是对有关中断的说明却不那么详尽,这就给应用开发造成了诸多不便。为此,我们专门用程序进行了一些试验,并从中明确了一些问题。在这里,我们就把这些问题说明一下,供大家参考。

  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时须特别注意这一点,即使不是有意使用中断嵌套,也必须考虑这一问题,因为这时仍会存在发生中断嵌套的可能,而且,如果嵌套会影响中断的某一(些)状态的话,就有可能造成系统运行错误。

评论
dirtwillfly 2018-12-5 20:54 回复TA
感谢分享 

相关帖子

沙发
gygp| | 2018-12-5 17:01 | 只看该作者
MSP430在中断方面做得很不错

使用特权

评论回复
板凳
chenci2013| | 2018-12-5 17:01 | 只看该作者
优先级的高低怎么获知呢?

使用特权

评论回复
地板
biechedan| | 2018-12-5 17:02 | 只看该作者
中断向量地址怎么定义的?

使用特权

评论回复
5
wangdezhi| | 2018-12-5 17:02 | 只看该作者
默认状态下是没有中断嵌套的

使用特权

评论回复
6
isseed| | 2018-12-5 17:02 | 只看该作者
中断服务函数会由RETI这条指令返回

使用特权

评论回复
7
xietingfeng| | 2018-12-5 17:03 | 只看该作者
使能的就一定要写中断服务函数

使用特权

评论回复
8
suzhanhua| | 2018-12-5 17:03 | 只看该作者
永远不要在中断里加断点

使用特权

评论回复
9
mituzu| | 2018-12-5 17:03 | 只看该作者
中断是MSP430微处理器的一大特色

使用特权

评论回复
10
hellosdc| | 2018-12-5 17:04 | 只看该作者
中断向量表        

使用特权

评论回复
11
uiint| | 2018-12-5 17:04 | 只看该作者
处理接收中断是不是只能一个字符

使用特权

评论回复
12
hellosdc| | 2018-12-5 17:05 | 只看该作者
七种寻址模式和指令集组成

使用特权

评论回复
13
gygp| | 2018-12-5 17:05 | 只看该作者
非常丰富的中断源,基本的有IO中断,定时器中断和一些接口中断

使用特权

评论回复
14
mituzu| | 2018-12-5 17:05 | 只看该作者
有效地利用中断可以简化程序

使用特权

评论回复
15
chenci2013| | 2018-12-5 17:05 | 只看该作者
支持中断优先级吗?

使用特权

评论回复
16
suzhanhua| | 2018-12-5 17:05 | 只看该作者
加断点,导致数据不全

使用特权

评论回复
17
biechedan| | 2018-12-5 17:05 | 只看该作者
怎么区分呢?                        

使用特权

评论回复
18
xietingfeng| | 2018-12-5 17:05 | 只看该作者
哪怕是空函数!               

使用特权

评论回复
19
wangdezhi| | 2018-12-5 17:05 | 只看该作者
若用到中断嵌套的话需要使用_EINT()打开全局中断。

使用特权

评论回复
20
isseed| | 2018-12-5 17:05 | 只看该作者
单片机恢复到中断前的状态,PC也被弹出,继续执行指令。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

623

主题

887

帖子

6

粉丝