分享

MSP430中断编程总结

 筱肆 2013-03-12
Cortex-A8
AM1x ARM9
LM4F Cortex-M4F
LM3S Cortex-M3
TMS320DM37x SOC
TMS320DM646x SOC
TMS320DM644x SOC
TMS320DM643x DSP
TMS320DM64x DSP
TMS320DM3x SOC
TMS320DM81x SOC
OMAP3x
OMAP-L1x处理器
TMS320C66x DSP
TMS320C647x DSP
TMS320C674x DSP
TMS320C67x DSP
TMS320C645x DSP
TMS320C64x DSP
TMS320C62x DSP
TMS320C55x DSP
TMS320C54x DSP
28x和Cortex-M3双核
28x Delfino浮点系列
28x Piccolo系列
28x 定点系列
24x 16位系列
MSP430
ZigBee
模拟设计
电源管理
参考经验
 
 
每种单片机都有自己的编程方法,虽然总体思想都相似,但是又有具体的小差别。以前学51单片机自认为学的还行,对中断的理解也是到位的,但现在刚接触MSP430,看教材说的中断方法都能看懂,实际在IAR中编程时又遇到了麻烦:MSP430对中断的设置相对繁琐,多了几个寄存器。如果不了解这些寄存器的名字和用法,即使对中断概念理解的再透彻也是纸上谈兵。作为MSP430的初学者,我下面详细讲解一下MSP430中断的设置和中断程序的写法。高手可飞过。

我用的是无线龙的开发套件:pro2007,芯片是MSP430F5437+CC2520,无线部分还没开始看。现在只是做MSP430的简单试验。下面讲的例子是在开发板上做的。

LED连接MSP430的P1_0引脚,我要实现的功能时利用P2口的中断功能检测P2_0引脚的电平变化,每出现一次下降沿就会改变一次LED的状态:亮-灭-亮-。。。。

首先是流程分析:

1、P1_0应设置为输出,P2_0设置为输入。然后将P2口得寄存器:P2IES、P2IFG、P2IE分别进行设置。

IES是设置中断沿触发方式设置。0为上升沿,1为下降沿。

IFG是中断标志位,将其清零,0为无中断请求,1为有中断请求。(这一步最好做一下,确保不出问题,上电复位后一般情况本身就是0)

IE是P2口的中断允许,0为禁止中断,1为允许中断。

2、设置完IO的中断后再把总中断打开,就可以等待中断的到来,而CPU可以什么都不干,直接进入低功耗状态了(这一点有利于进一步降低功耗)。

3、中断子程序设计:首先将中断标志软件清零,然后执行本例想要的过程:每次下降沿来了led的状态都变化一次,即取反。

完成。

下面是代码:

#include "io430.h"

#define _PRAGMA(x) _Pragma(#x)
#define HAL_ISR_FUNC_DECLARATION(f,v) _PRAGMA(vector=v) __interrupt void f(void)//对中断向量为v的中断进行响应,这是声明部分,f部分为函数名字,在后面的中断函数中体现出来,这个f取什么名字都行,甚至直接保留f都行
#define HAL_ISR_FUNC_PROTOTYPE(f,v) _PRAGMA(vector=v) __interrupt void f(void)//这个是原型
#define HAL_ISR_FUNCTION(f,v) HAL_ISR_FUNC_PROTOTYPE(f,v); HAL_ISR_FUNC_DECLARATION(f,v)//先声明原型,然后执行中断函数

#define HAL_ENABLE_INTERRUPTS() asm("eint")//开中断
#define HAL_DISABLE_INTERRUPTS() st( asm("dint"); asm("nop"); )//关中断
//以上2~7行的程序段为设置中断和开、关中断的方法,照这么写就行。

#define led P1OUT

//主函数
int main( void )
{

// Stop watchdog timer to prevent time out reset
WDTCTL = WDTPW + WDTHOLD; //关闭看门狗

P2DIR = 0x00;//P2_0设置为输入
P1DIR = 0x01;//P1_0设置为输出

P1OUT = 0x00;
P2IES = 0x01;//这三个寄存器上面有介绍
P2IFG = 0x00;
P2IE = 0x01;
HAL_ENABLE_INTERRUPTS();//别忘了开总中断。。。(我就老忘记。。。)
while(1);

//return 0;
}


HAL_ISR_FUNCTION(P2ISR,PORT2_VECTOR)//中断函数,这里给中断函数取名为P2ISR,中断产生的中断矢量为PORT_VECTOR(这个在头文件当中有,自己去找吧。我也不想看那个头文件,但是没办法,必须了解,至少知道常用的,有利于提高效率)
{
P2IFG = 0X00;//中断标志软件清零
led ^= 0x01;//相当于每次都取反,这一句怎么实现都行,不一定用这种方法

//此处有点偷懒,应该加一个键盘消抖的句子,无非就是稍微延时,然后判断一个标志是否仍然存在(自己再设一个标志,不难吧)
}

上面的代码只用了P1和P2,通用性还行吧,msp430各个系列的应该都能运行。

下面讲IAR的设置问题。MSP430的系列太多了。在IAR中创建project后,要在proje->option中对工程进行设置,主要有以下几个方面:

general->target->device点击右边的按钮选择想要的芯片类型。我用的MSP430V5.20,其中的芯片非常丰富,找到自己的芯片就可以。

linker->config->configuration file选中override default,并在下面选择自己的芯片类型文件(格式为xcl)

debugger->setup->driver点击下拉菜单,选中FET Debugger(如果你有仿真器的话,没有仿真器只是做软件仿真的话就保留simulator),选中右边的run to复选框,然后选中最下方的override default,并选择相应的文件(格式为ddf)

如果上面选择了FET Debugger,则FET Debugger->setup->connection中选择仿真器类型(USB还是并口,我选择了第一项:TI-USBIF),然后选中后面的automatic。

点击确定,环境设置完毕,你可以编辑程序,编译链接后下载到你的目标板了。。。呵呵


 


    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多