文章目录
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∗(2−OVER8)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=16∗USARTDIVPCLK
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
);
}
}
}