1、UART寄存器 (1)、FIFO控制寄存器(FCR) RXFIFTL:接收FIFO中断触发(当FIFO中的数据量刚到达所要求(trigger level)的时候会产生中断); DMAMODE1:如果FIFO使能的话此位可以使能DMA模式。 TXCLR:发送FIFO清除。 RXCLR:接收FIFO清除。 FIFOEN:FIFO模式使能。 (2)、队列控制寄存器(LCR) DLAB:分配锁存访问位。 BC:暂停控制。 SP:强制奇偶校验。 EPS:奇偶校验选择。 PEN:校验使能。 STB:设置产生停止位。 WLS:发送接收字长度,当STB为0,WLS决定停止位的长度。 (3)、模式控制寄存器 AFE:自动流控使能。 LOOP:回环模式使能。 (4)、分频锁存寄存器(DLL and DLH) DLL和DHH分别是分频值得高位和低位。 分配值=UART模块输入时钟频率/波特率/16; 或者:分配值=UART模块输入时钟频率/波特率/13; (5)、 电源和 仿真管理寄存器 (PWREMU_MGMT)SOFT、FREE:特殊的仿真位。高级语言调试程序中出现一个断点时,该 仿真位决定定时器的状态。如果FREE位设为1,则当遇到一个断点时,定时器继续运行(即自由运行),在这种情况下,SOFT被忽略。但是,如果FREE为0,则SOFT有效。在此情况下,如果SOFT=0,则定时器停止,下一次 tiM的值递减;如果SOFT=1,则当TIM减到0,定时器停止工作。 UTRST:UART发送复位。 URRST:UART接收复位。 (6)、模式定义寄存器(MDR) OSM_SEL:0(16倍过采样);1(13倍过采样) 2、UART例程 //说明:本例程包含UART发送、接收、回环模式三个功能,可结合串口调试助手查看结果。 extern void setup_UART()//串口0作为接收控制参数的通道 { baud_rate=115200; // put xmtr/rcvr in reset. uartRegs->PWREMU_MGMT = 0; // set baud rate...assumes default 16x oversampling, the clock frequenceset 210MHz. uartRegs->LCR = ((CSL_UART_LCR_DLAB_ENABLE< divisor = 210000000 / (baud_rate * 16); uartRegs->DLH = (divisor & 0x0000FF00) >> 8; uartRegs->DLL = divisor & 0x000000FF; uartRegs->LCR = ((CSL_UART_LCR_DLAB_DISABLE< // enable xmtr/rcvr fifos. uartRegs->FCR =(CSL_UART_FCR_RXCLR_CLR< | CSL_UART_FCR_TXCLR_CLR< |CSL_UART_FCR_FIFOEN_DISABLE< ); // disable interrupts, flow control, and loop back. // uart->IER= ( // (CSL_UART_IER_ERBI_ENABLE< // (CSL_UART_IER_ELSI_ENABLE < // ); // config LCR for no parity, one stop bit, 8 data bits, no flowcontrol. uartRegs->LCR = ((CSL_UART_LCR_DLAB_DISABLE< |(CSL_UART_LCR_SP_DISABLE< |(CSL_UART_LCR_EPS_ODD< |(CSL_UART_LCR_PEN_ENABLE< |(CSL_UART_LCR_STB_1BIT< |(CSL_UART_LCR_WLS_8BITS< ); uartRegs->IER= ( (CSL_UART_IER_ERBI_DISABLE< ); uartRegs->MCR = ((CSL_UART_MCR_AFE_DISABLE< // |(CSL_UART_MCR_LOOP_ENABLE< |(CSL_UART_MCR_RTS_ENABLE< uartRegs->MDR =((CSL_UART_MDR_OSM_SEL_16XOVERSAMPLING< // take xmtr/rcvr out of reset. uartRegs->PWREMU_MGMT= ((CSL_UART_PWREMU_MGMT_UTRST_ENABLE< (CSL_UART_PWREMU_MGMT_URRST_ENABLE< (CSL_UART_PWREMU_MGMT_FREE_RUN < ); } void uart_Loopback(char *SRC,char *DST) //回环模式 { int jj; for(jj=0;jj<34;jj++) { statu0=CSL_FEXT(uartRegs->LSR,UART_LSR_TEMT); while(CSL_FEXT(uartRegs->LSR,UART_LSR_TEMT)==0); (uartRegs->THR)=((*SRC++)); while(CSL_FEXT(uartRegs->LSR,UART_LSR_DR)==0); statu1=CSL_FEXT(uartRegs->LSR,UART_LSR_DR); *DST++=(uartRegs->RBR); } } void uart_Transfer(char *SRC,int SRC_len) //发送模式 { int jj; for(jj=0;jj { while(CSL_FEXT(uartRegs->LSR,UART_LSR_TEMT)==0); (uartRegs->THR)=((*SRC++)); } } void uart_Resiver(char *DST,int DST_len) //接收模式 { int jj; for(jj=0;jj<34;jj++) { while(CSL_FEXT(uartRegs->LSR,UART_LSR_DR)==0); *DST++=(uartRegs->RBR); } } main() { char SRC_uart[34] = "TronlongUART1 Application......nr"; char DST_uart[34]; setup_UART();//配置串口 uart_Transfer(&SRC_uart[0],34); //发送 uart_Resiver(&DST_uart[0],34); //接收 }
|