MSP430中断原理分析

发布者:草木知秋最新更新时间:2020-01-20 来源: eefocus关键字:MSP430  中断原理 手机看文章 扫描二维码
随时随地手机看文章

    中断很大程度上体现了一款单片机的性能,从这一点将MSP430在中断方面做得很不错,主要是提供了非常丰富的中断源,基本的有IO中断,定时器中断和一些接口中断(SPIUART,I2C)等等。


    现在我就谈谈关于MSP430中断的一些特性,主要是在项目经历中感觉比较有用的问题,跟大家分享下。


    第一,MSP430中断的优先级。
    MSP430支持中断优先级,但是优先级的高低怎么获知呢?它的用手手册上有个很有意思的说法,我原文引用过来“The nearer a module is to the CPU/NMIRS, the higher the priority”,翻译过来就是说离CPU/NMIRS越近,优先级就越高。那我们怎么知道那个模块离CPU近啊,看datasheet给的框图?总觉得这不可能让一个做电子的人放心,比如框图在中距CPU一样进,那怎么区分呢?所以我们有另外一个更可靠的办法,IAR为每一款型号的430都提供了对应的头问题,只靠看中断向量地址就可以知道了。430的中断向量表从地址值0xFFC0开始至0XFFFF结束,一共有32个表项(每个中断向量对应2byte),0XFFCO对应的中断向量的优先级是最顶的,0XFFFE对应的中断向量的优先级是最高的,也就是从0xFFCO开始至0xFFFF,32个中断优先级由低至高。这样就很容易弄清楚各中断的优先级了。


    第二,MSP430中断的响应过程。
    首先,当然是中断发生对应的标志为置1。这个时候的过程我详述下,其实是翻译的用户手册但是还是了解下好。


    1.CPU会执行完当期的指令。
    2.指向下一条指令的PC被压栈。
    3.状态寄存器SR压栈。
    4.选择最好优先级的中断进行服务。
    5.单源中断的中断标志位会被自动清零,这个地方需要小心下P1,P2这样的中断标志位不会自动清零,因为P1、P2的IO中断属于多源中断,就是说P1或者P2的8个IO对应到了一个中断向量上,单片机知道是P1或者P2发生了中断,无论是P1的哪一个IO发生的都会指向P1的中断向量,P2也是一样的,所以需要在代码中手动清零。

    6.状态寄存器SR被清零,将会终止任何低功耗状态,并且全局中断使能被关闭(GIE)。这个地方与51很是有些不同,430响应了中断后会关闭全局中断使能,不会响应任何其他的中断包括优先级高的,就是说默认状态下是没有中断嵌套的,若用到中断嵌套的话需要使用_EINT()打开全局中断。
    7.中断向量被装载到PC,开始执行中断服务函数。


    以上是整个中断的接收过程,比较重要的地方我用彩色字体标出了。


    中断返回就相对简单些,中断服务函数会由RETI这条指令返回,SR被弹出,单片机恢复到中断前的状态,PC也被弹出,继续执行指令。


    第三,开中断和中断服务函数。
    这个是让我在项目中纠结过的地方,也请各位小心。
    MSP430一旦开了外设的中断,比如SPI的接收中断。
    在SPI的接收中断被使能,单片机一旦发现SPI接收标志置位,就会装载中断向量,但是我们如果没有用到SPI的接收中断,会怎样呢?由于没用到,所有就没有写SPI接收中断的服务函数,此时中断向量里指向中断服务函数地址值是啥?是全0。CPU从0-01FFh取指令,只会发生一件事。PUC,上电清零。接着PC会装载0xFFFE中断向量的内容,也就是复位向量,程序会跳转到给IAR我们做的启动代码。程序再往下执行会执行到我们编写的代码的main()的第一句。这样悲剧就诞生了,荡机了!!!!


   所以我在这希望初学430的朋友对于中断,未使用的就不要使能。使能的就一定要写中断服务函数,哪怕是空函数!


    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应用报告里就有。

关键字:MSP430  中断原理 引用地址:MSP430中断原理分析

上一篇:msp430——软件模拟II2C实例
下一篇:MSP430升级程序

推荐阅读最新更新时间:2024-11-13 19:03

MSP430 在3V与5V混合系统中的逻辑接口技术
MSP430超低功耗微处理器是TI公司推出的一种新型单片机。它具有16位精简指令结构,内含12位快速ADC/Slope ADC,内含60K字节FLASH ROM,2K字节RAM,片内资源丰富,有ADC、PWM、若干TIME、串行口、WATCHDOG、比较器、模拟信号,有多种省电模式,功耗特别小,一颗电池可工作10年。开发简单,仿真器价格低廉,不需昂贵的编程器。 MSP430其特点有:1.8V~3.6V低电压供电;高效16位RISC CPU可以确保任务的快速执行,缩短了工作时间,大多数指令可以在一个时钟周期里完成;6微秒的快速启动时间可以延长待机时间并使启动更加迅速,降低了电池的功耗。MSP430产品系列可以提供多种存储器选择
[单片机]
<font color='red'>MSP430</font> 在3V与5V混合系统中的逻辑接口技术
MSP430 ADC12模块寄存器设置解读
一。简单介绍: ADC12模块中是由以下部分组成:输入的16路模拟开关(外部8路,内部4路),ADC内部电压参考源,ADC12内核,ADC时钟源部分,采集与保持/触发源部分,ADC数据输出部分,ADC控制寄存器等组成。 四种采样模式: (1)单通道单次转换模式 (2)序列通道单词转换模式 (3)单通道多次转换模式 (4)序列通道多次转换模式 个人觉得(3)模式应该是使用较多的, 对选定的通道进行多次转换,直到关闭该功能或ENC=0。进行如下设置: x=CSStartAdd,指向转换开始地址 ADC12MEMx存放转换结果 ADC12MCTLx寄存器中定义了通道和参考电压 在这种模式下,改变转换模式,不必先停止
[单片机]
<font color='red'>MSP430</font> ADC12模块寄存器设置解读
基于MSP430单片机为控制核心的IC卡智能水表控制器的设计方案
引言 随着IC卡应用的普及,利用IC卡实现“预付费方式”的水费管理成为可能。目前的电子水表按照抄表的方式主要可以分为网络式和分立式。由于在某些场合需要对旧的水表系统改造,如果采用网络式抄表方式需要进行抄表线路的铺设,这给施工带来很大的问题。而分立式的IC卡水表收费系统则无需考虑这一问题,这为管理部门和用户提供了极大的便利。 1 硬件 电路 设计 本控制器以MSP430单片机为控制核心。MSP430系列单片机是美国TI公司从1996年开始推向市场的一种16位RISC架构、超低功耗的混合信号处理器。 电源 采用1.8~3.6 V低 电压 、RAM数据保持方式下耗电仅0.1μA,活动模式下耗电250μA/MIPS,IO口
[单片机]
基于<font color='red'>MSP430</font>单片机为控制核心的IC卡智能水表控制器的设计方案
MSP430设置出错
编译无错,点击DownLoad and Debug出错: Failed to load debugee: C:Documents and SettingsAdministrator桌面MSP430DebugExeMSP430.d43 解决办法: 1.选择debug模式,device中正确选择芯片; 2.linker中选择debug information for C-spy; 3.debugger 选择Fet Debugger; 4.FET debugger中选择Texas instrument LPT-I ,正确选择parallel port.不同的仿真器这一项的设置应该不同,我的仿真器是利尔达的并口仿真器。 5.ma
[单片机]
MSP430F5438学习笔记 FLAHS操作
1.前言 MSP430F5438的片内FLASH可以当做EEPROM使用,该部分FLASH称为INFO FLASH,总共有4块每块128Byte。虽然INFO FLASH容量比较少,但是多数情况还是够用的。 2.代码实现 // 时钟默认情况 // FLL时钟 FLL选择 XT1 // 辅助时钟 ACLK选择 XT1 32768Hz // 主系统时钟 MCLK选择 DCOCLKDIV 8000000Hz // 子系统时钟 SMCLK选择 DCOCLKDIV 8000000Hz // UART时钟选择 ACLK // 低频波特率产生 9600-8-N-1 #include msp430.h #incl
[单片机]
<font color='red'>MSP430</font>F5438学习笔记 FLAHS操作
msp430的TEST管脚作用
1602具有8根数据线和三根控制线(E使能线 R/W读写线 RS表示数据还是指令) 一般是先写地址再写数据即可 DS18b20为单线器件,数据在该线上一位一位传输的,向DS18b20写入命令之后,就可以一位一位读取温度数值了 DS1302主要是数据引脚和时钟引脚匹配使用的,写操作时候是先写入地址再写入数据 ,读操作时候是先写入地址再读数据,比如写时候给I/O引脚一位数据,CLK来个下降沿该数据就写成功了。
[单片机]
MSP430F149学习之路——按键与LED
代码 1 /*********************************** 2 程序功能:用按键控制LED状态 3 缺点:按键按下后无法改变LED灯的状态,可以利用板上的复位键^~^ 4 *************************************/ 5 #include msp430x14x.h 6 7 int k,i=0; 8 void int_clk(); 9 void led(int n); 10 void main() 11 { 12 WDTCTL = WDTPW + WDTHOLD; 13 int_clk(); 14 P1DIR = 0Xf0; 15 P1OUT =
[单片机]
浅谈一下MSP430单片机编程及其优点
MSP430是自己接触的第一种单片机,个人觉得MSP430单片机无论在软件上还是硬件上都很不错。它的编程环境IAR Embedded Workbench,这个编程环境软件很不错,在软件布局上很人性化,用起来很顺手,在调试方面也很方便,支持软件仿真等。 个人觉得,430编程在头文件上做得很好,而且各种型号的芯片的头文件兼容性也不错,在调用头文件里面参数的书写规范上做得很好。所以430在编程上手还不错。430在硬件上功能很强大,个人觉得在以后430的发展空间会更大。低功耗,小巧,功能强大,性价比高。
[单片机]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved