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