[学习笔记]

寄存器学习之uart

[复制链接]
635|3
手机看帖
扫描二维码
随时随地手机跟帖
JasonLee27|  楼主 | 2020-8-12 15:01 | 显示全部楼层 |阅读模式
硬件环境: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
WeChat Screenshot_20200812144139.png
DLH,DLL为分频寄存器的高8位和低8位。
如果我要设置一个115200的波特率,采用16 UART_SMP_CNT。
那么分频divisor = 24M/16/115200 = 13.0208
那么可以设置DLH=0;DLL=13;小数部分,还有个小数分频寄存器
WeChat Screenshot_20200812144707.png
按寄存器介绍,我们计算得到的值应该为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中有非常多种类的中断方式,这里我们只使用下面两个:
WeChat Screenshot_20200812145528.png
ETXE用于发送,当发送为空的时候产生中断,用于发送时通知我们填充发送数据,所以,在不发送数据的时候,这个中断要关掉。发送时才打开。
ERXNE为接收中断,接收数据寄存器中有数据便会产生该中断,用于通知我们取出接收数据,需要一直开启。接收数据这里采用了一个软件fifo,在回调中保存接收数据,读取数据通过从该fifo中读取。

最后附上例程

uart.rar (497.18 KB)

使用特权

评论回复

相关帖子

guijial511| | 2020-9-17 07:45 | 显示全部楼层
感谢楼主分享使用经验

使用特权

评论回复
anzidage| | 2020-9-21 14:09 | 显示全部楼层
感谢分享,学习了

使用特权

评论回复
roucun| | 2020-9-21 16:51 | 显示全部楼层
谢谢分享

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

66

主题

415

帖子

10

粉丝