硬件环境: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)
|