我在写中断模式的串口驱动 主程序: UART0_IRQ_init(9600); VICIntSelect = 0 ; VICVectCntl5 = 0x20|6; // UART0中断通道分5 VICVectAddr5 = (int)UART0_Handler; // 设置UART0向量地址 VICIntEnable = 1<<6; // 使能UART0中断 Uart0_SendString_IRQ("
12345678012345678
");
void UART0_IRQ_init(int UART0_BPS) { unsigned short Fdiv0; PINSEL0 &= ~(0xF << 4); PINSEL0 |= (0x5 << 4); U0LCR = 0x83; // 设置除数锁存位,DLAB = 1 Fdiv0 = (Fpclk / 16) / UART0_BPS;// 设置波特率 U0DLM = Fdiv0 / 256; U0DLL = Fdiv0 % 256; U0LCR = 0x03; //清除锁存,并设置工作模式 //U0FCR = 0x87;// 使能FIFO,并设置触发点为8字节,复位T0FIFO,R0FIFO U0FCR = 0x81; UART0_FIFO_LENGTH = 8 ; U0IER = 0x03; //RBR,THRE中断使能 Fdiv0 = U0IIR; //清除 } void Uart0_SendString_IRQ(char *pt) { int i; char * pUART0; pUART0 = pt U0TER = 0x0;//停止发送 while (!(U0LSR & 0x40)) ; //等待发送缓冲为空 for (i=FIFO_SIZE;i>0;i--) { if(*pUART0) U0THR = *pUART0++; } U0TER = 0x80; //开始发送 i++; //标号1 i++; //标号2 }
void UART0_Handler (void) __irq { }
箭头位于标号1行首时,VICIRQStatus=0x40,VICRawIntr=0x00021048,VICIntEnable=0x40,
VICSWPrioMask=0xffff,0xfffff030=0xf;U0IIR=0xc2,U0LSR=0x60 箭头位于标号2行首时,U0相关寄存器中,U0IIR=0xc1,别的没变,发送中断消失了;
VICIRQStatus=0x00,VICRawIntr=0x00021008 其余没变,中断标志也消失了,之后返回主程序顺序执行。 主程序后面是外部中断,外部中断正常能响应的
弄了2天了,还是搞不定 |