UART基于串口速率配置合适的时钟

需求:基于串口速率配置合适的时钟非常重要, 不合适的时钟会导致传输错误率的上升。特别在低功耗需要配置较低的串口时钟时候。需要根据应用计算单次传输的最大字节和实际速率。

下面为计算公式:

  • BR = f_ck / (8 * (2 - OVER8) * USARTDIV) 为波特率计算公式;OVER8 一般配置为16倍采样(OVER8=0); 
    • 为什么HAL库中没有使用16倍? 计算方式的原因, HAL库直接通过放大16倍后直接转化成16进制数字得到的结果是一样的;如下面1.3021*16=20或者21(0x014或0x015);
      #define UART_DIV_LPUART(__PCLK__, __BAUD__)      (((((uint64_t)(__PCLK__)*256U)) + ((__BAUD__)/2U)) / (__BAUD__))
      
      HAL_StatusTypeDef UART_SetConfig(UART_HandleTypeDef *huart)
      {
          /*......*/
          usartdiv = (uint32_t)(UART_DIV_LPUART(pclk, huart->Init.BaudRate));
          if ((usartdiv >= LPUART_BRR_MIN) && (usartdiv <= LPUART_BRR_MAX))
          {
              huart->Instance->BRR = usartdiv;
          }
          else
          {
              ret = HAL_ERROR;
          }
      
      }

 案例:如果使用9600bit/s的波特率, 使用MSI 200Khz; 分频率为1;

                                 usartdiv = \frac{​{20000}}{16*9600}=1.3021 

使用ARR寄存器设置:整数位为1; 小数位0.3021(0.3021*16=4.8; 0x4 或者0x05)

  • 可选值:1.2500(BRR = 0x014)或 1.3125(BRR = 0x015

  • 选择 1.3125(更接近):

    实际波特率=200000/(16×1.3125)≈9523.81bit/s (0.79%误差)

如果使用9523.8bit/s传输长帧如255 bytes 就会有数据错误识别的风险!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值