硬件环境:AC7801x 通用开发板  ATC-LINK 
软件环境:keil 5.23 
 
一,概述 
 
在上一个can例程的基础上,又增加了一个uart的功能,这里只做了一个简单的功能,通过中断进行uart的发送和接收,接收的数据采用软件fifo缓存。 
 
二,波特率设置 
当前使用的APB时钟为24M,uart通信波特率的计算公式如下: 
baud_rate = APB CLOCK/UART_SMP_CNT/{DLH, DLL} 
其中UART_SMP_CNT为采样计数设置,可以为4,8,16 
 
 
DLH,DLL为分频寄存器的高8位和低8位。 
如果我要设置一个115200的波特率,采用16 UART_SMP_CNT。 
那么分频divisor = 24M/16/115200 = 13.0208 
那么可以设置DLH=0;DLL=13;小数部分,还有个小数分频寄存器 
 
 
按寄存器介绍,我们计算得到的值应该为0.6,那么写0写1应该都差不多。 
最后,还要使能一个GUARD功能,用于消除字节累积误差。 
- void Uart_Init(void)
 
 - {
 
 -     CKGEN->PERI_CLK_EN_0 |= CKGEN_PERI_CLK_EN_0_UART2_EN_Msk;    ///<CAN clock en
 
 -     CKGEN->PERI_SFT_RST0 |= CKGEN_PERI_SFT_RST0_SRST_UART2_Msk;
 
 -     /* 8 bit */
 
 -     UARTx->LCR0 |= (3 << UART_LCR0_WLS1_WLS0_Pos);
 
 -     /* No parity */
 
 -     UARTx->LCR0 &= ~UART_LCR0_SP_Msk;
 
 -     UARTx->LCR0 &= ~UART_LCR0_PEN_Msk;        /* parity disable */
 
 -     UARTx->LCR0 &= ~UART_LCR0_EPS_Msk;        /* set EPS,  0: odd  1: even*/
 
 -     /* baud_rate = APB CLOCK/UART_SMP_CNT/{DLH, DLL} */
 
 -     /* 0: 16 smp_cnt 1: 8 smp_cnt 2: 4 smp_cnt */
 
 -     UARTx->SMP_CNT = 0;
 
 -     /* divisor = APB CLOCK/UART_SMP_CNT/baud_rate
 
 -                = 24000000/16/115200 =  13.0208
 
 -     */
 
 -     UARTx->DIV_H = 0;
 
 -     UARTx->DIV_L = 13;
 
 -     /* DIV_FRAC = 0.0208*32¡Ö1 */
 
 -     UARTx->DIV_FRAC = 1;
 
 -     /* protect time set, eliminating accumulated error */
 
 -     UARTx->GUARD = 0x10;
 
 -     /* 1 STOP bit */
 
 -     UARTx->LCR0 &=  ~UART_LCR0_STB_Msk;
 
 -     /* Enable TX&RX FIFO */
 
 -     UARTx->FCR = 1;
 
 -     /* Enable TX and RX */
 
 -     UARTx->LCR1 |= UART_LCR1_RXEN_Msk | UART_LCR1_TXEN_Msk;
 
 -     /* Enable RX interrupt */
 
 -     UARTx->IER |= UART_IER_ERXNE_Msk;
 
 -     
 
 -     fifo_Init(&s_uartRxFifo, s_uartRxBuff, UART_RX_BUFF_LEN);
 
 -     
 
 -     NVIC_EnableIRQ(UARTx_IRQn);
 
 - }
 
  三,中断设置 
UART中有非常多种类的中断方式,这里我们只使用下面两个: 
 
 
ETXE用于发送,当发送为空的时候产生中断,用于发送时通知我们填充发送数据,所以,在不发送数据的时候,这个中断要关掉。发送时才打开。 
ERXNE为接收中断,接收数据寄存器中有数据便会产生该中断,用于通知我们取出接收数据,需要一直开启。接收数据这里采用了一个软件fifo,在回调中保存接收数据,读取数据通过从该fifo中读取。 
 
最后附上例程 
 
 
uart.rar
(497.18 KB, 下载次数: 20)
 
  |