需求:基于串口速率配置合适的时钟非常重要, 不合适的时钟会导致传输错误率的上升。特别在低功耗需要配置较低的串口时钟时候。需要根据应用计算单次传输的最大字节和实际速率。
下面为计算公式:
- 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; } }
- 为什么HAL库中没有使用16倍? 计算方式的原因, HAL库直接通过放大16倍后直接转化成16进制数字得到的结果是一样的;如下面1.3021*16=20或者21(0x014或0x015);
案例:如果使用9600bit/s的波特率, 使用MSI 200Khz; 分频率为1;
使用ARR寄存器设置:整数位为1; 小数位0.3021(0.3021*16=4.8; 0x4 或者0x05)
-
可选值:
1.2500
(BRR =0x014
)或1.3125
(BRR =0x015
) -
选择
实际波特率=200000/(16×1.3125)≈9523.81bit/s (0.79%误差)1.3125
(更接近):
如果使用9523.8bit/s传输长帧如255 bytes 就会有数据错误识别的风险!!