ARM UART0中断例程 问题

来源:百度知道 编辑:UC知道 时间:2024/06/19 11:00:49
void __irq IrqUart0(void)
{
// uint8 i;
// uint8 RxData;

OS_ENTER_CRITICAL();

//判断是否有中断挂起,如果有进入中断
while( (U0IIR & 0x01) == 0)
{
switch( (U0IIR & 0x0E))
{
case 0x06: //RLS中断
while( (U0LSR & 0x01) == 0);
// RxData = U0RBR;
U0THR = 'A';
while( (U0LSR & 0x40)==0);
break;
case 0x04: //RDA中断 读取数据,接收数据可用
DealPack();
break;
case 0x0C: //CTI中断 禁止接收及字符超时中断
DealPack();
break;
case 0x02: //THRE中断
// while( (U0LSR & 0x20) == 1);
// RxData = U0RBR;

你可以查一下ARM资料,在UART0中断处理的表格中,U0IIR[3:0]为0001时,表示没有该中断,最后不为1表示有中断,所以对应程序看,与0X01与,没有中断就不进入while循环。后面switch( (U0IIR & 0x0E)) 可以写成switch(U0IIR) 本身没有错误,但对于资深的程序员,这样的习惯是非常好的。由于判断前三位,所以就是应该与上1110也就是十六位的E。
程序后面翻译可以理解为,如果有中断产生,数值0X06,4,C,2分别对应相应的功能,就可以判断具体的中断原因了。具体功能还是去看ARM的UART0一章便非常清楚了。
如果还有问题可以继续提问。希望你满意。