STM32: fixed rounding of uart clocks

this gives a closer fit to requested baudrate

git-svn-id: svn://svn.code.sf.net/p/chibios/svn/trunk@14765 27425a3e-05d8-49a3-a47f-9c15f0e5edd8
This commit is contained in:
akscram 2021-09-14 09:43:14 +00:00
parent 0a02efcf3d
commit 26f74fcbd3
6 changed files with 8 additions and 8 deletions

View File

@ -112,7 +112,7 @@ static void usart_init(SerialDriver *sdp, const SerialConfig *config) {
uint32_t brr;
USART_TypeDef *u = sdp->usart;
brr = (uint32_t)(sdp->clock / config->speed);
brr = (uint32_t)((sdp->clock + config->speed/2) / config->speed);
#if defined(USART_CR1_OVER8)
/* Correcting BRR value when oversampling by 8 instead of 16.

View File

@ -256,7 +256,7 @@ static void usart_start(UARTDriver *uartp) {
usart_stop(uartp);
/* Baud rate setting.*/
fck = (uint32_t)(uartp->clock / uartp->config->speed);
fck = (uint32_t)((uartp->clock + uartp->config->speed/2) / uartp->config->speed);
/* Correcting USARTDIV when oversampling by 8 instead of 16.
Fraction is still 4 bits wide, but only lower 3 bits used.

View File

@ -243,14 +243,14 @@ static void usart_init(SerialDriver *sdp,
(clock <= config->speed * 4096U),
"invalid baud rate vs input clock");
brr = (uint32_t)(((uint64_t)clock * 256) / config->speed);
brr = (uint32_t)(((uint64_t)clock * 256 + config->speed/2) / config->speed);
osalDbgAssert((brr >= 0x300) && (brr < 0x100000), "invalid BRR value");
}
else
#endif
{
brr = (uint32_t)(clock / config->speed);
brr = (uint32_t)((clock + config->speed/2) / config->speed);
/* Correcting BRR value when oversampling by 8 instead of 16.
Fraction is still 4 bits wide, but only lower 3 bits used.

View File

@ -262,7 +262,7 @@ static void usart_start(UARTDriver *uartp, uint32_t clock) {
usart_stop(uartp);
/* Baud rate setting.*/
fck = (uint32_t)(clock / uartp->config->speed);
fck = (uint32_t)((clock + uartp->config->speed/2) / uartp->config->speed);
/* Correcting USARTDIV when oversampling by 8 instead of 16.
Fraction is still 4 bits wide, but only lower 3 bits used.

View File

@ -243,14 +243,14 @@ static void usart_init(SerialDriver *sdp,
(clock <= config->speed * 4096U),
"invalid baud rate vs input clock");
brr = (uint32_t)(((uint64_t)clock * 256) / config->speed);
brr = (uint32_t)(((uint64_t)clock * 256 + config->speed/2) / config->speed);
osalDbgAssert((brr >= 0x300) && (brr < 0x100000), "invalid BRR value");
}
else
#endif
{
brr = (uint32_t)(clock / config->speed);
brr = (uint32_t)((clock + config->speed/2) / config->speed);
/* Correcting BRR value when oversampling by 8 instead of 16.
Fraction is still 4 bits wide, but only lower 3 bits used.

View File

@ -262,7 +262,7 @@ static void usart_start(UARTDriver *uartp, uint32_t clock) {
usart_stop(uartp);
/* Baud rate setting.*/
fck = (uint32_t)(clock / uartp->config->speed);
fck = (uint32_t)((clock + uartp->config->speed/2) / uartp->config->speed);
/* Correcting USARTDIV when oversampling by 8 instead of 16.
Fraction is still 4 bits wide, but only lower 3 bits used.