每种单片机都有自己的编程方法,虽然总体思想都相似,但是又有具体的小差别。以前学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。
点击确定,环境设置完毕,你可以编辑程序,编译链接后下载到你的目标板了
作者:Toddy Han