看到有网友在请教IO中断方面的问题,我刚好在工作中用过MSP430。论坛这次团购活动很好,收到开发板之后,一直想和大家分享一些自己学习到的东西。
我的开发环境:软件IAR5.2;硬件是团购的LaunchPad
MSP430的IO中断由P1口和P2口输入变化的电平触发,P1和P2各有八个输入IO,P1的八个IO共用一个中断向量,P2的八个IO共用另一个中断向量。在中断服务程序中判断到底是哪个IO口触发中断。
IO口中断相关的寄存器包括:1. PxIFG(中断标志位) 2. PxIES(电平触发边沿) 3. PxIE(中断开启位) 4. PxREN(IO口上下拉)。
首先是初始化IO中断函数
void Key_init(void) { P1REN |= BIT3; //打开上拉,电路板上没有上拉电阻,触发边沿是从高电平到低电平 P1IES |= BIT3; //选择触发边沿,从高电平到低电平
P1IFG &= ~BIT3; //清除P1.3的中断标志位(可以不清除,为了确保初始化之后为标志位不会触发中断) P1IE |= BIT3; //打开P1的中断 }
主函数
void main(void) { WDTCTL = WDTPW + WDTHOLD; // 关闭看门狗
P1DIR |= BIT6; //P1.6管脚设置为输出 P1OUT |= BIT6; //P1.6管脚输出高电平,点亮LED2 Key_init(); //调用IO中断初始化函数 __enable_interrupt(); //开启总中断,这一步没有的话,所有的中断都不能触发 while(1) //死循环 { ; } }
中断服务函数
#pragma vector = PORT1_VECTOR //中断向量声明 __interrupt void Key_interrput(void) { if(P1IFG&BIT3) //判断是不是P1.3这个IO口产生了中断 { P1OUT ^= BIT6; //LED2取反 P1IFG &= ~BIT3; //清除中断标志位,这一步一定要有。 }
else
{
P1IFG = 0x00;
} }
注意事项:
1.记得开启总中断,要不然所有的中断都不能触发。
2.如果电路板没有上拉电阻,就要设置MSP430的IO内部上拉。
3.中断服务函数中,要记得清除中断标志位。
|