UART中断 UART一共有如下几种中断
溢出错误(Overrun error):接收FIFO满时有新的数据到来,导致数据丢失产生溢出错误; 帧错误(Frame error):接收数据停止位为‘0’; 奇偶校验错误(parity error):就是奇偶校验错误.....; 中止错误(break error):RX在一个帧周期内一直为低电平。
当发送FIFO和接收FIFO中数据数量超过一定限度时可以产生Transmit或Receive中断,这个限度可以通过 UARTFIFOLevelSet(unsigned long ulBase, unsigned long ulTxLevel,unsigned long ulRxLevel) 函数设置。这个限度可以是FIFO深度的1/8,2/8,4/8,6/8,7/8
接收中断(Receive):当接收FIFO中数据超过设置限度时产生中断。 发送中断(Receive):当发送FIFO中数据超过设置限度时产生中断。
由于只有当接收FIFO数据达到设置限度时才会产生接收中断,这有可能导致FIFO中有少量数据却由于没有产生中断而长时间没有被处理,所以设这一个接收超时中断。 接收超时(Receive Timeout):当接收FIFO中有数据且在32bit周期内没有接收到其他数据,则产生接收超时中断。
下面这个程序简单演示了RX中断,RT中断,Break中断。 #include "inc/hw_memmap.h" #include "inc/hw_types.h" #include "driverlib/uart.h" #include "driverlib/sysctl.h" #include "driverlib/gpio.h" #include "driverlib/interrupt.h" #include "inc/hw_ints.h" void UART0IntHandler(void); int main() { //各种初始化。。。。。。 SysCtlClockSet(SYSCTL_OSC_MAIN|SYSCTL_XTAL_8MHZ|SYSCTL_USE_OSC|SYSCTL_SYSDIV_1); SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA); SysCtlPeripheralEnable(SYSCTL_PERIPH_UART0); GPIOPinTypeUART(GPIO_PORTA_BASE,GPIO_PIN_0|GPIO_PIN_1);
RIT128x96x4Init(1000000); RIT128x96x4StringDraw("UART0Inttest...",20,12,15);
//初始化UART0 UARTConfigSetExpClk(UART0_BASE,SysCtlClockGet(),9600,UART_CONFIG_WLEN_8|UART_CONFIG_PAR_NONE|UART_CONFIG_STOP_ONE); //设置FIFO中断条件,当TX或RX6/8满时产生TX或RX中断 UARTFIFOLevelSet(UART0_BASE,UART_FIFO_TX6_8,UART_FIFO_RX6_8); UARTIntEnable(UART0_BASE,UART_INT_RX|UART_INT_BE|UART_INT_RT);//使能RX,BE,RT中断
IntEnable(INT_UART0);//使能UART0中断 IntMasterEnable();//使能全局中断
while(1); }
//各种中断进行逻辑或后传给中断控制器,在中断服务程序中应该先判断中断源 void UART0IntHandler(void) { unsigned long ulStatus; IntMasterDisable(); ulStatus = UARTIntStatus(UART0_BASE,true);//保存屏蔽后中断状态 UARTIntClear(UART0_BASE,UART_INT_RX|UART_INT_RT|UART_INT_BE);//清除中断标志
//根据不同的中断标志执行不同的中断服务 if(ulStatus&UART_INT_RX) { RIT128x96x4StringDraw("UART0_RX_INT",4,24,15); RIT128x96x4UnsignedLongBinaryDraw(ulStatus,12,4,36,15); while(UARTCharGetNonBlocking(UART0_BASE));//将接收FIFO中字符读出 } if(ulStatus&UART_INT_RT) { RIT128x96x4StringDraw("UART0_RT_INT",4,24,15); RIT128x96x4UnsignedLongBinaryDraw(ulStatus,12,4,36,15); } if(ulStatus&UART_INT_BE) { RIT128x96x4StringDraw("UART0_BE_INT",4,24,15); RIT128x96x4UnsignedLongBinaryDraw(ulStatus,12,4,36,15); } IntMasterEnable(); }
通过串口调试工具发送一个字符可以产生RT中断,发送一个字符串(大于12个)可以产生RX中断,将RX端口接地可以产生BE中断
[ 本帖最后由 ming1005 于 2011-5-16 19:10 编辑 ] |