最近做2440中断的实验,用了一个定时器中断和uart中断,两个中断总是不能正常工作。通过排查得出,在uart的中断函数里面清中断我用的是
rSRCPND |=BIT_UART0; //Clear pending bit
rINTPND |=BIT_UART0;
可能是rINTPND的值没改变(具体什么原因,可能是编译器优化时还没将BIT_UART0写到rINTPND)。后面加了
j=rSRCPND;
j=rINTPND;
才把rINTPND的值真正写进去了,两个中断工作ok。
rSRCPND =BIT_UART0; //Clear pending bit
rINTPND =BIT_UART0;
用这个赋值语句工作ok,c还真是复杂,这样赋值时值就写进去了,用上面的异或却没。。。。。。
当然也可以直接用ClearPending(BIT_UART0);就ok。ClearPending最后面有句j=rINTPND;可能是确保值写进去了。
我设置UART0采用中断方式发送和接收数据,经过半天实验,接收数据可以用中断,发送不能。因为当发送缓冲器为空时就会触发中断,所以当uart中断被设置好,就会狂触发该中断,以至于后面的程序根本无法运行。无赖下,将发送中断禁止掉,用轮询方式发送,就没问题了。本来按照正常思维,发送是不应该用中断的,发送时人为控制的,就是为了试试中断,测试了半天始终不行,郁闷了半天。。。。。。。。。
本文记录了在2440平台上实现定时器中断和UART中断的过程,详细探讨了中断处理函数中清除中断标志位的方法,并分享了解决UART发送中断频繁触发导致的问题。
2052

被折叠的 条评论
为什么被折叠?



