微控论坛原创主贴 作者:bobo 微控论坛特约因DC的邀请写一个有关中慧漏断的东东,我也接触430不久只能以自己的心得体会更大家分享,若有纰漏恳请见谅。MSP430用户手册上有的中断介绍我就不赘述了,大家可以看User Guider.我讲的主要是书上没有的,或者是点的不透的。希望对大家有用。1.中断嵌套,优先级430总中断的控制位是状态寄存器内的GIE位(该位在SR寄存器内),该位在复位状态下,所有的可屏蔽中断都不会发生响应。可屏蔽中断又分为单中断源和多中断源的。单中断源的一般响应了中断服务
程序中断标志位就自动清零,而多中断源的则要求查询某个寄存器后中断标志位才会清零。由于大多数人接触的第一款单片机通常是51,51单片机CPU在响应低优先级的中断程序过程中若有更高优先级的中断发生,单片机就会去执行高优先级,这个过程已经产生了中断嵌套。而430单片机则不同,如果在响应低优先级中断服务程序的时候,即使来了更高优先级的中断服务请求,430也会置之不理,直至低优先级中断服务程序执行完毕,才会去响应高优先级中断。这是因为430在响应中断程序的时候,总中断GIE是复位状态的,如果要产生类似51的中断嵌套,只能在中断函数内再次置位GIE位。2.定时器TATimerA有2个中断
向量。TIMERA0,TIMERA1TIMERA0只针对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 0x2345PowerReset: mov.w &0xFCFE,PC……………………………………………………ORG 0xFFFEDW PowerReset1、MSP430主要看是什么系列的,如果是早期的可以用Proteus仿真,比如msp430f149等,如果是新系粗洞改列如msp430F5438A的话暂时不方便软件仿真,除非自己可以在proteus中制作那个控制器的模型。
2、MSP430的编译环境里都提供一系列与片子型号对应的头文件,比如msp430x14x.h就是对14系列的资源定义,说得明白点,就是许多#define宏定义,然后你会发现每个430程序都会包含对应的头文件。比如你说的WDTCTL=WDTPW+WDTHOLD,WDTCTL已经被定义为对应寄存器(看门狗控制寄存器)的地颤答址,WDTPW和WDTHOLD是该寄岩判存器对应位为1的数值,也已经宏定义,如WDTHOLD为第7位,就已经被定义为0x80(0b10000000),然后通过把数值赋给对应地址(可视为变量),这样就可以将对应位置1,如果要同时置多位,就用“加”或者“或”。之所以有这么多的宏定义,就是为了用户记忆方便,记忆有意义的符号比数字好记多了。
以我的开发环境IAR5.2为例
在IAR点HELP选择C/C++ Compiler Reference Guide然后搜索vector。在24页Interrupt vectors and the interrupt vector table里描述了终端向量表是放在INTVEC这里。然后再关掉,在右击工程->Options->Linker->缓猛Config下面有Link configuration file 把Override default打钩,然扰郑桥后点浏览
选择你包含的单片机的那个xcl打开。我的是Ink430f149.
-Z(CODE)INTVEC=FFE0-FFFF
-Z(CODE)RESET=FFFE-FFFF
这个就是从FFE0开始偏移了。不同的单片机不一样。
有一点要明确的是,单片机的硬件中断向量的地址是不会变的,在单片机FLASH的FFE0-FFFF。IAR这里默认设置的是和单片机一样,所以你程序下载到片子的时候,刚好和实际的一样。多说一句,GPRS远程升级就是利用这个文件,所谓远程升级就是程丛冲序在跑的时候还能更新程序。远程升级就引导程序+应用程序。应用程序的代码要放在FLASH中的某一段,然后中断向量地址要改了。引导程序就是正常的程序,应用程序就是改过的程序,系统发生中断的时候还是跑到FFE0-FFFF。然后在这里跳转到应用程序的中断程序里。多了个跳转周期。ARM就不用跳转了。我用的一块STM32的片子,中断向量表可以设置的。
评论列表(0条)