HAL 库学习笔记:六、在应用中自由修改波特率

    技术2022-07-11  94

    文章目录

    1. 波特率寄存器2. 波特率参数的计算3. 裁剪函数实现修改波特率

    1. 波特率寄存器

    该寄存器高 16 位无效,最低 4 位为小数部分,其余部分为整数部分。 通过配置波特率寄存器 BRR 即可实现在应用中自由高效地修改任意串口的波特率,实现外挂设备的宽波特率兼容。

    2. 波特率参数的计算

    UART波特率计算公式: U S A R T D I V = D I V _ M a n t i s s a + D I V _ F r a c t i o n 8 ∗ ( 2 − O V E R 8 ) USARTDIV=DIV\_Mantissa+\dfrac{DIV\_Fraction}{8*(2-OVER8)} USARTDIV=DIV_Mantissa+8(2OVER8)DIV_Fraction

    16倍采样的公式: T x / R x   B u a d = P C L K 16 ∗ U S A R T D I V Tx/Rx\ Buad = \dfrac{PCLK}{16*USARTDIV} Tx/Rx Buad=16USARTDIVPCLK

    3. 裁剪函数实现修改波特率

    建议参考 stm32f4xx_hal_uart.c --> UART_SetConfig() 中寄存器 BRR 配置部分。其中 USART6\USART1 属于 APB2 时钟总线;UART8\UART7\UART5\UART4\USART3\USART2 属于 APB1 时钟总线。该函数使用16倍采样,具体请根据串口配置进行选择,如果使用8倍采样,需要将UART_BRR_SAMPLING16改为UART_BRR_SAMPLING8。 USART_BRR_Configuration(UART_HandleTypeDef *huart, uint32_t BaudRate) { uint32_t pclk; huart->Init.BaudRate = BaudRate; if (huart->Init.OverSampling == UART_OVERSAMPLING_8) { if ((huart->Instance == USART1) || (huart->Instance == USART6)) { pclk = HAL_RCC_GetPCLK2Freq(); huart->Instance->BRR = UART_BRR_SAMPLING8(pclk, huart->Init.BaudRate); } else { pclk = HAL_RCC_GetPCLK1Freq(); huart->Instance->BRR = UART_BRR_SAMPLING8(pclk, huart->Init.BaudRate); } } else { if ((huart->Instance == USART1) || (huart->Instance == USART6)) { pclk = HAL_RCC_GetPCLK2Freq(); huart->Instance->BRR = UART_BRR_SAMPLING16(pclk, huart->Init.BaudRate); } else { pclk = HAL_RCC_GetPCLK1Freq(); huart->Instance->BRR = UART_BRR_SAMPLING16(pclk, huart->Init.BaudRate); } } }
    Processed: 0.010, SQL: 9