1.对于外部中断需要设置外部中断寄存器、外部中断屏蔽位、中断屏蔽位等三个位置。
2.中断处理函数的写法:
????pISR_EINT0= (unsigned ) doIrq;
??doIrq为我们定义的中断处理函数。?pISR_EINT0在头文件中定义,它与stat.s中定义的中断入口地址对应。但要注意,在使用ADS调试时,应该先把BIN文件烧进去,因为只有这样,0地址对应的地方才有中断向量表。
3下面是外部中断和串口中断的代码:
void __irq doIrq(void)
{
?? rSRCPND = 1;
?? rINTPND = 1;
???
?? rINTMSK |= 1 ; ? //disable EINT0;
?? rGPFDAT = 0;
???
?? ?myprintf("this is irq function!\n");
?? ?
?? ?rINTMSK &= ~(1<<0) ; ? //enable EINT0;
}
void __irq doUartIrq(void)
{
?
?? ? ?
?? rSRCPND =( 1<<28);
?? rSUBSRCPND = 1;
?? rINTPND = (1<<28);
???
???
??rINTMSK |= (1<<28) ; ? //关闭串口中断
?? rINTSUBMSK |= (1<<0) ; ? ?
?? ?
??// rUTXH0=rURXH0;
???
?if(rUTRSTAT0&1)
{
rUTXH0=rURXH0;
rUTRSTAT0=0;
?}
?? rINTMSK &= ~(1<<28) ; ? //打开串口中断
?? rINTSUBMSK &= ~(1<<0) ; ?
}
在中断处理函数中要清除中断位,如:
?? rSRCPND =( 1<<28);
?? rSUBSRCPND = 1;
?? rINTPND = (1<<28);
注意,清除顺序有要求,先总的,再分的,并且这几位是写 1 表示清 0;
4. 发现每次发一个数据给串口,串口接收中断进入两次,但查看STATUS寄存器却有一次是没有数据的,所以在串口中断中加入对STATUS的查看语句,如果为空则不响应。
5 存在问题:
??发现while为空循环时中断响应正常,但只要在while里加入了delay延时后,中断变为只能响应一次,以后就没反应了,不知道为什么!!
文章评论(0条评论)
登录后参与讨论