MSP430的中断,需要两个部分,一部分是打开中断,另外一部分是编写中断服务函数
打开中断
_BIS_SR与__bis_SR_register
首先我们得知道__bis_SR_register和_BIS_SR是一个玩意。查看宏定义可知
#define _BIS_SR(x) __bis_SR_register(x)
_BIS_SR()可传入的参数
然后我们查看x的值,发现里面有八个可以传入的值
#define C (0x0001) #define Z (0x0002) #define N (0x0004) #define V (0x0100) #define GIE (0x0008) #define CPUOFF (0x0010) #define OSCOFF (0x0020) #define SCG0 (0x0040) #define SCG1 (0x0080)
我们这里只需要关系GIE就可以了,这个GIE表示总中断,如果没有使能GIE,那么你写的中断函数将永远无法进入!
低功耗
我们先看下面这一段宏定义
#define LPM0 (CPUOFF) #define LPM1 (SCG0+CPUOFF) #define LPM2 (SCG1+CPUOFF) #define LPM3 (SCG1+SCG0+CPUOFF) #define LPM4 (SCG1+SCG0+OSCOFF+CPUOFF)
这里我们需要有一个概念了,众所周知MSP430引以为豪的东西就是低功耗。MSP430单片机具有7种低功耗模式(LPM0~4、LPM3.5和LPM4.5,并非全部系列都具有,MSP430F5529就没有),通过不同程度的休眠,可降低系统功耗。
中断服务函数
中断服务函数如下
#pragma vector=PORT1_VECTOR __interrupt void Port_1 (void) { }
#pragma vector= xxx,此处的xxx是表示指定的中断函数。比如我是P1.1采用中断,就写#pragma vector= PORT1_VECTOR。
/*****以下都是我一个一个的从库里面复制粘贴过来的,如有发现少了请评论*****/ RTC_VECTOR PORT2_VECTOR TIMER2_A1_VECTOR TIMER2_A0_VECTOR USCI_B1_VECTOR USCI_A1_VECTOR PORT1_VECTOR TIMER1_A1_VECTOR TIMER1_A0_VECTOR DMA_VECTOR USB_UBM_VECTOR TIMER0_A1_VECTOR TIMER0_A0_VECTOR ADC12_VECTOR USCI_B0_VECTOR USCI_A0_VECTOR WDT_VECTOR TIMER0_B1_VECTOR TIMER0_B0_VECTOR COMP_B_VECTOR UNMI_VECTOR SYSNMI_VECTOR RESET_VECTOR
__interrupt表示之后的是中断服务函数,中断函数必须是void型!!!后面那个Port_1名字随便取。中断函数不能传参!!!
总结
如果我们有中断一定要使能GIE!!!个人不建议新手使用低功耗!!!代码如下
_BIS_SR(GIE);//开启中断使能
注意:无论是外部中断还是串口中断,都是中断,需要打开GIE!!!