注册 登录
电子工程世界-论坛 返回首页 EEWORLD首页 频道 EE大学堂 下载中心 Datasheet 专题
wstt的个人空间 https://home.eeworld.com.cn/space-uid-241610.html [收藏] [复制] [分享] [RSS]
日志

MSP430的可屏蔽中断

已有 2631 次阅读2011-1-15 22:07 |个人分类:MSP430

    中断很大程度上体现了一款单片机的性能,从这一点将MSP430在中断方面做得很不错,主要是提供了非常丰富的中断源,基本的有IO中断,定时器中断和一些接口中断(SPI,UART,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的朋友对于中断,未使用的就不要使能。使能的就一定要写中断服务函数,哪怕是空函数!
   以上是我在430中断使用中的一些经验,希望对各位有用!
    

发表评论 评论 (5 个评论)
回复 chnldq 2011-1-18 14:40
读了这篇文章至少有两点收获:第一,单中断源和多中断源的区别,单中断源是指同一中断地址只有一个中断源,多中断源是指同一中断地址有不同的中断源,对吗? 第二,就是开中断和写中断服务函数。
回复 wstt 2011-1-18 16:29
chnldq: 读了这篇文章至少有两点收获:第一,单中断源和多中断源的区别,单中断源是指同一中断地址只有一个中断源,多中断源是指同一中断地址有不同的中断源,对吗? 第
MSP430的多源中断在中断向量表中指向是同一个表项,P1、P2、timer的比较都是这样的,在中断向量表中都只有一个表项,要查询相应的寄存器才能确定具体的中断源,P1IFG,P2IFG还有像TAIV等等都是干这个
回复 John_sea 2011-1-30 00:43
刚开始学中断,还象是在云雾里。看来博主的51机的经验很是有助于对MSP430的理解。学习了。
回复 Leslie- 2011-10-12 11:19
受益匪浅~
回复 smartygt 2012-9-27 21:09
不知道ADC中断函数为何老是进不去?用的就是ti的源代码的啊

facelist doodle 涂鸦板

您需要登录后才可以评论 登录 | 注册

热门文章