3个独立的串口,每一个都可以利用DMA和中断方式操作。每个包含2个64字节FIFO,一个接,一个发。非FIFO模式相当于FIFO模式的一个寄存器缓冲模式。
每一个UART有7种状态,overrun错误,校验错误,帧错误,断点,接收缓冲区准备好,发送缓冲区为空,发送移位寄存器为空。当接收移位寄存器中的数据传给FIFO的时候,且接收的数据触发了Rx FIFO的阀值,Rx中断产生了。发送器中FIFO的还未发得数据到达Tx FIFO阀值的时候,Tx中断产生了。
功能:在串口上输入16字节,包括回车,然后会把输入的字符回显在串口终端上。
程序代码:
//函数声明void Uart_init(void);void int_init(void);void __irq Uart0(void);void Main(void);//缓存static unsigned char mywords[100] = {0,0};static int data_is_ready = 0; //初始化uartvoid Uart_init(void){//初始化引脚rGPHCON = 0x00faaa;//把引脚设置为TXD0,和RXD0模式rGPHUP = 0x7ff; //不加上拉电阻//初始化UARTrULCON0 = 0x03; //每次发送8位数据,一个停止位,无校验,普通模式rUCON0 = (0x05) | (1<<9);//设置接收和发送都是用中断的方式rUFCON0 = (0x3<<6) | (0x2<<4) | (0x01<<0); //使能FIFO,发送48字节,接收16字节rUMCON0 = 0;//设置时钟频率rUBRDIV0 = 26; } //初始化中断void int_init(void){rINTMOD=0x0;//中断模式寄存器 pISR_UART0 = (int)Uart0;//设中断服务函数地址 rINTSUBMSK = ~(0x3); //打开UART0发送和接收中断屏蔽rINTMSK = ~(0x1<<28); //打开UART0中断屏蔽//rSUBSRCPND=(BIT_SUB_TXD0); }void Main(void){MMU_Init();int_init();Uart_init();while(1);}//中断处理函数void __irq Uart0(void){unsigned char *ps = mywords;int i;if(rSUBSRCPND & BIT_SUB_RXD0) //接收中断{rINTSUBMSK |= BIT_SUB_RXD0; while(((rUFSTAT0&0x1f)>0)) { *ps++ = rURXH0; } data_is_ready = 1; rSUBSRCPND = BIT_SUB_RXD0; }//发送中断else if(rSUBSRCPND & BIT_SUB_TXD0) {rINTSUBMSK |= BIT_SUB_TXD0; while((!(rUFSTAT0&(1<<14))) && (*ps != 'r')) { rUTXH0 = *ps++; for(i=0; i<100;i++); } data_is_ready = 0; rSUBSRCPND = BIT_SUB_TXD0; } rSRCPND = BIT_UART0; rINTPND = BIT_UART0; if(data_is_ready) rINTSUBMSK &= ~(BIT_SUB_TXD0); else rINTSUBMSK &= ~(BIT_SUB_RXD0); //rINTSUBMSK &= ~(BIT_SUB_TXD0);}