这几天调试430,要求用IO中断唤醒系统。总结了以下几点经验,在使用IO口中断时应该注意。
一、多源中断中断标志需要软件清零。
在TI数据手册指出多源中断中断标志需要由软件清理。但是我在线仿真发现定时器的时钟中断和捕获中断好像会自动清零。不过最好还是加上软件清零。而IO口中断必须使用软件清零。
二、在中断关闭的情况下中断标志仍然会被置位。
当IO口配置为中断功能后,不管是否开启中断允许(PxIE.n),当中断条件满足时,相应的中断标志PxIFG.n都会由硬件自动置1。这样能最大限度的减少丢失中断。如果在程序中要经常开关中断,建议在每次开中断之前先清零对应的中断标志位。不然可能会有问题。例如,在我的项目中需要用输入脉冲信号唤醒系统,当系统被唤醒后应该关闭该中断,而当系统进入休眠状态前应该再次开启该中断。如果此时在开启该中断之前不清零中断标志,开启中断后程序会立即进入中断服务子函数。
三、修改中断触发方式可能会使相应中断标志置位。
IO口中断触发方式有上升沿触发和下降沿触发两种。
四、另外补充两点
1、若P2IN.x = 0, P2OUT.x = 1, P2REN.x = 1, P2DIR.x = 1, P2IES.x = 0(上升沿); 修改P2REN.x = 1 则 P2IN.x = 1, P2IFG.x = 1.
2、若P2IN.x = 1, P2OUT.x = 1, P2REN.x = 0, P2DIR.x = 1, P2IES.x = 1(下降沿); 修改P2OUT.x = 0 则 P2IN.x = 0, P2IFG.x = 1.
结论:P2IN产生跳变就会是中断标志位置位,P2IN的跳变可能由于改变P2OUT或者P2DIR或者P2REN而产生。