MSP430入门之中断基础
中断的重要性让我怎么分享呢?我个人觉得中断是基于单片机系统编程的核心,熟练的掌握中断是写好SuperLoop程序的基础。单片机的资源毕竟有限,中断掌握好了、协调好了,程序的生命力自然就好了。 闲话少叙,先上一段程序吧。
Code:该程序实现通过按键,使两个LED灯交替闪烁。P1.3连接button,P1.0和P1.6连接LED。 #include "msp430g2452.h"
void inIt(void);
int main( void ) { // Stop watchdog timer to prevent time out reset WDTCTL = WDTPW + WDTHOLD; inIt(); //初始化函数,跟昨天相比,提出更高的要求,main函数的可读性要强,所以有了这个函数,将需要初始化的地方都集成到一个函数中,这样后续查程序、维护程序的时候也方便! _EINT(); //使能中断
while(1); //基于中断的程序都是这样的哦,加一个死循环,这个死循环就相当于Windows系统Task Manager里的System Idle Process,系统没事的时候就过来干这个。 }
void inIt(void) { P1DIR &= ~BIT3; //P1.3配置为输入 P1DIR |= (BIT0 | BIT6); //P1.0和P1.6配置为输出 P1OUT |= BIT0; //为了达到交替闪烁的效果,先把P1.0置1,此时P1.6时默认值0 P1IFG &= ~BIT3; //清除中断标志,这里先提前记住清除中断标志比较重要哦,后面还会用到 P1IES |= BIT3; //设置中断为下降沿触发 P1IE |= BIT3; //允许P1.3中断 }
#pragma vector = PORT1_VECTOR //PORT1_VECTOR是中断向量的名字,如果这个名字写错了中断就捕获错了,不清楚的话记得查中断向量表 __interrupt void PORT1_3(void) //PORT1_3是中断函数的名字,这个名字是可以自己定义滴 { unsigned int t = 4000; //延时,防止按键抖动,其实这里拿掉程序也是可以运行的。如果对实时性要求高的话,延时是必须待拿掉滴!! while (t--); if ((P1IFG & BIT3)) //读取中断标志,在这个程序里其实也可以拿掉,这里多判断一遍起到保险的作用,毕竟大的程序项目里还有别的中断,是可能把中断标志清掉的 { P1OUT ^= BIT0; //取反,这样就交替显示了 P1OUT ^= BIT6; P1IFG &= ~BIT3; //这个地方很重要哦,中断处理完了之后记得要把中断标志位清除掉。暂时还不清楚是不是MSP430特有的,其实AVR中断标志位在中断结束后就自动清掉了! } }
中断函数的要求大家知道的吧?要尽可能的短,能够很快的从中断里跳出来,所以里面加了延时我觉得是非常不合理的。防抖动也不应该在中断里做啊!AVR端口中断是支持硬件防抖的,暂时不知道MSP430硬件上是否有这个功能。把中断函数简写成如下形式,实验下来没发现问题。 #pragma vector = PORT1_VECTOR __interrupt void PORT1_3(void) { P1OUT ^= BIT0; P1OUT ^= BIT6; P1IFG &= ~BIT3; }
后续慢慢的深入这个问题吧~ pt void PORT1_3(void) { unsigned int t = 4000; while (t--); if ((P1IFG & BIT3)) { //P1OUT |= (BIT0 | BIT6); P1OUT ^= BIT0; P1OUT ^= BIT6; P1IFG &= ~BIT3; }
以上是个转帖,是我在研究主观题的定时器的寄存器时找到的参考,我觉得还不错,发上来给和我一样的菜鸟们参考参考。仔细看看的话对答题会有帮组哦~
答完高级题目和中级题目后,怎么我觉得怎么中级比高级要难一些。
|