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
中断函数必须是void型!!!后面那个Port_1名字随便取。中断函数不能传参!!!
总结
如果我们有中断一定要使能GIE!!!个人不建议新手使用低功耗!!!代码如下
_BIS_SR(GIE);//开启中断使能
注意:无论是外部中断还是串口中断,都是中断,需要打开GIE!!!