打印

关于MSP430中断机制

[复制链接]
1792|28
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
转载于lfb189的博客

关于MSP430中断机制--我的理解

2008-12-15 11:05:50|  分类: 默认分类 |  标签: |字号大中小 订阅


因DC的邀请写一个有关中断的东东,我也接触430不久只能以自己的心得体会更大家分享,若有纰漏恳请见谅。MSP430用户手册上有的中断介绍我就不赘述了,大家可以看User Guider.我讲的主要是书上没有的,或者是点的不透的。希望对大家有用。

1.中断嵌套,优先级
430总中断的控制位是状态寄存器内的GIE位(该位在SR寄存器内),该位在复位状态下,所有的可屏蔽中断都不会发生响应。可屏蔽中断又分为单中断源和多中断源的。单中断源的一般响应了中断服务程序中断标志位就自动清零,而多中断源的则要求查询某个寄存器后中断标志位才会清零。由于大多数人接触的第一款单片机通常是51,51单片机CPU在响应低优先级的中断程序过程中若有更高优先级的中断发生,单片机就会去执行高优先级,这个过程已经产生了中断嵌套。而430单片机则不同,如果在响应低优先级中断服务程序的时候,即使来了更高优先级的中断服务请求,430也会置之不理,直至低优先级中断服务程序执行完毕,才会去响应高优先级中断。这是因为430在响应中断程序的时候,总中断GIE是复位状态的,如果要产生类似51的中断嵌套,只能在中断函数内再次置位GIE位。

2.定时器TA
TimerA有2个中断向量。TIMERA0,TIMERA1
TIMERA0只针对CCR0的计数溢出
TIMERA1再查询TAIV后可知道是CCR1,还是CCR2,亦或TAIFG引起的,至于TAIFG是什么情况下置位的,则要看TA工作的模式
具体看用户手册。还有一点TA本身有PWM输出功能,无须借用中断功能。在这个问题上经常出现应用弯路的是如何结合TA和AD实行定时采样的问题,很多人都是在TA中断里打开AD这样来做。这是不适宜的,因为430 的ADC10,ADC12(SD16不熟悉,没发言权)模块均有脉冲采样模式和扩展采样模式。只要选择AD是由TA触发采样,然后把TA设置成PWM输出模式,当然输出PWM波的都是特殊功能脚,但是在这里它是不需要输出的,所以引脚设置不必理会。值得关心的就是PWM的频率,也就是你AD的采样率。

3.看门狗复位
看门狗有2种工作模式:定时器 ,看门狗
定时器工作模式下WDTIFG在响应中断服务程序有标志位自动复位,而在看门狗模式下,该标志位只能软件清零。但是怎么判断复位是由于WDT工作在看门狗模式下的定时溢出引起的,还是看门狗写密钥错误引起的呢?………………………………
答案是没有方法,至少我没见过有什么方法,也没见过周边的人有什么方法。若有人知道方法谢谢分享。
4.经常有人会问这个语句的MOV.B  #LPM0,0(SP)的作用。假如你在进入中断函数之前,430是在LPM0下待机,若要求执行完中断函数之后进入LPM3待机,在中断函数里写MOV.B  #LPM3,SR是无效的。因为在进入中断时430会把PC,SR压栈,( SR内保存着低功耗模式的设置)即使你写了MOV.B  #LPM3,SR,在退出中断出栈时SR会被重新设置成低功耗0,要达到这样的目的,只能更改堆栈内SR的设置:MOV.B  #LPM0,0(SP)。

5中断向量:
430的中断向量是FFE0H—FFFFH,一共32个字节也就是FLASH的最后一段,430的FLASH有大有小,但是最后地址肯定是FFFFH(大FLASH超过64K的除外)所以它们的起始地址是不一样的,而一般IAR默认编译都是把程序放在FLASH开始的位置(不包括信息段)。
有个值得弄清楚的问题是:什么是中断向量?中断向量实际就是保存中断函数入口地址的存储单元空间。就像FFFEH+FFFFH这2个字节是复位中断向量,那么它存储的就是主函数在FLASH内的起始地址,假如主函数保存在以0x1100为起始地址的FLASH块内 ,那么你会发现FFFFH 内保存的是0x11, FFFE内保存的是0x00.其他什么TimerA,ADC12,所有的都一样。只是你每次写的程序长短不一,中断函数放的位置不一样。IAR编译器都会给你定好,然后在你用JTAG烧写程序的时候,把这个地址,烧写到相应的中断向量。因为中断函数所处地址可以由用户自定义,也可以让IAR自动编译,所以这个地址除了源代码开发人员知道,其他人是不知道的,BSL就是应用这32个字节的中断向量内的内容的特殊性设置的密码。但是有几个东西在430是不变的,就是触发中断的条件满足后,它到哪个地方去寻址中断服务函数的入口地址,是TI 在做430时就固化好,定死的。比方说上电复位的时候,它知道去FFFE,FFFF单元找地址,而不去FFE0,FFE2找地址,这个映射关系是430固化不变的。可有的时候你就是需要改变“中断向量”,这怎么办?430FLASH程序自升级里有时就会碰到这个问题,方法是在430原来默认的中断向量表内做一个跳转操作,同样以上电复位为例:
ORG  0x2345
PowerReset: mov.w  &0xFCFE,PC
…………………………
…………………………
ORG  0xFFFE
DW   PowerReset
这样的话0xFCFE就相当是0xFFFE的映射了。这个在430程序自升级的TI应用报告里就有。

相关帖子

沙发
zhangmangui| | 2019-2-15 23:09 | 只看该作者
430的中断是按照下图1的优先级顺序定义的,有三种中断:1.系统重置、2.不可屏蔽中断(NMI)、3.可屏蔽中断。

        图1.中断优先级

        部分具体的中断优先级由高到低为:

PORT2_VECTOR (1 * 2u) /* 0xFFE2 Port 2 */

        PORT1_VECTOR (4 * 2u) /* 0xFFE8 Port 1 */

TIMERA1_VECTOR (5 * 2u) /* 0xFFEA TImer A CC1-2, TA */

TIMERA0_VECTOR (6 * 2u) /* 0xFFEC TImer A CC0 */

ADC_VECTOR (7 * 2u) /* 0xFFEE ADC */

        USART0TX_VECTOR (8 * 2u) /* 0xFFF0 USART 0 Transmit */

        USART0RX_VECTOR (9 * 2u) /* 0xFFF2 USART 0 Receive */

        WDT_VECTOR (10 * 2u) /* 0xFFF4 Watchdog TImer */

        COMPARATORA_VECTOR (11 * 2u) /* 0xFFF6 Comparator A */

        TIMERB1_VECTOR (12 * 2u) /* 0xFFF8 Timer B CC1-2, TB */

        TIMERB0_VECTOR (13 * 2u) /* 0xFFFA Timer B CC0 */

        NMI_VECTOR (14 * 2u) /* 0xFFFC Non-maska××e */

        RESET_VECTOR (15 * 2u) /* 0xFFFE Reset [Highest Priority] */

其中可屏蔽中断分为系统NMI(SNMI)和用户NMI(UNMI),一般来说,不可屏蔽中断不受GIE标志位的影响。用户不可屏蔽中断的中断源为NMIIE、ACCIE和OFIE,当响应用户不可屏蔽中断后,其他不可屏蔽中断就自动被禁止,以防止同级别的中断发生产生中断嵌套。当同时有多个中断来的时候才有优先级的考虑(优先级顺序可查看向量表)。有中断响应以后自动关闭总中断,这个时候即使来更高优先级的中断都不会响应。要中断嵌套的话,就必须在中断中打开总中断。

        关于中断嵌套,资料上是这么讲的:

1)430默认的是关闭中断嵌套的,除非你在一个中断程序中再次开总中断EINT;

2)当进入中断程序时,只要不在中断中再次开中断,则总中断是关闭的,此时来中断不管是比当前中断的优先级高还是低都不执行;

3)若在中断A中开了总中断,则可以响应后来的中断B(不管B的优先级比A高还是低),B执行完再继续执行A。注意:进入中断B后总中断同样也会关闭,如果B中断程序执行时需响应中断C,则此时也要开总中断,若不需响应中断,则不用开中断,B执行完后跳出中断程序进入A程序时,总中断会自动打开;

4)若在中断中开了总中断,后来的中断同时有多个,则会按优先级来执行,即中断优先级只有在多个中断同时到来时才起做用!中断服务不执行抢先原则。

5)对于单源中断,只要响应中断,系统硬件自动清中断标志位,对于TA/TB定时器的比较/捕获中断,只要访问TAIV/TBIV,标志位倍被自动清除;

对于单源中断,只要响应中断,系统硬件自动清中断标志位;

        对于TA/TB定时器的比较/捕获中断,只要访问TAIV/TBIV,标志位被自动清除;

        对于多源中断要手动清标志位,比如P1/P2口中断,要手工清除相应的标志;如果在这种中断用“EINT();”开中断,而在打开中断前没有清标志,就会有相同的中断不断嵌入,而导致堆栈溢出引起复位,所以在这类中断中必须先清标志再打开中断开关。

        对于多源中断,我在应用时遇到了一些问题,程序总是在运行时跑飞。我曾经用过的程序中有两个中断源,但是已经按照要求在中断服务程序中清楚了标志位,但程序还是跑飞了,现在还未找到原因,还要继续修改,要请教一下学长。

        官方给的多源中断的例子是:

#pragma vector = PORT2_VECTOR

        __interrupt void port2(void)

{

switch(P2IV)

{

case P2IV_P2IFG6:

P1OUT ^= BIT0;break; //LED1 亮灭

case P2IV_P2IFG7:

P1OUT ^= BIT1;break; //LED2 亮灭

default :break;

        }

        }

在这个中断中由于访问了P2IV这个寄存器,所以标志位被自动清除。

使用特权

评论回复
板凳
10299823| | 2019-2-16 09:59 | 只看该作者
没有优先级的吧                     

使用特权

评论回复
地板
lihuami| | 2019-2-16 09:59 | 只看该作者
中断是MSP430微处理器的一大特色            

使用特权

评论回复
5
xiaoyaozt| | 2019-2-16 09:59 | 只看该作者
MSP430的几乎每个外围模块都能够产生中断      

使用特权

评论回复
6
uptown| | 2019-2-16 10:00 | 只看该作者
MSP430的定时器确实设计的很强悍   

使用特权

评论回复
7
cehuafan| | 2019-2-16 10:00 | 只看该作者
MSP430有哪些可屏蔽中断?         

使用特权

评论回复
8
updownq| | 2019-2-16 10:00 | 只看该作者
中断很大程度上体现了一款单片机的性能

使用特权

评论回复
9
sanfuzi| | 2019-2-16 10:01 | 只看该作者
MSP430的中断分为3种:系统复位、不可屏蔽中断、可屏蔽中断。

使用特权

评论回复
10
pl202| | 2019-2-16 10:01 | 只看该作者
多个中断请求发生时,响应最高优先级中断。

使用特权

评论回复
11
eefas| | 2019-2-16 10:02 | 只看该作者
msp430的中断优先级和中断嵌套

使用特权

评论回复
12
dspmana| | 2019-2-16 10:02 | 只看该作者
MSP430在中断方面做得很不错     

使用特权

评论回复
13
eefas| | 2019-2-16 10:02 | 只看该作者
MSP430的中断优先级按所在的向量的大小排列  

使用特权

评论回复
14
10299823| | 2019-2-16 10:03 | 只看该作者
只能是固定的序列了。              

使用特权

评论回复
15
pl202| | 2019-2-16 10:03 | 只看该作者
响应中断时,MSP430会将不可屏蔽中断控制位SR.GIE复位  

使用特权

评论回复
16
lihuami| | 2019-2-16 10:03 | 只看该作者
利用中断可以简化程序和提高执行效率  

使用特权

评论回复
17
sanfuzi| | 2019-2-16 10:03 | 只看该作者
系统复位的中断向量为0xFFFE。           

使用特权

评论回复
18
xiaoyaozt| | 2019-2-16 10:03 | 只看该作者
主要是响应的速度很快。              

使用特权

评论回复
19
updownq| | 2019-2-16 10:03 | 只看该作者
MSP430的中断机制就非常合理了。      

使用特权

评论回复
20
uptown| | 2019-2-16 10:03 | 只看该作者
主要是定时器的功能非常多            

使用特权

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

本版积分规则

7

主题

41

帖子

0

粉丝