cancel
Showing results for 
Search instead for 
Did you mean: 

Ensure that Frequency clock is in the range [3 * baudrate, 4096 * baudrate]

kernelport
Associate II

Dear MCD Application Team,

in Drivers/STM32G4xx_HAL_Driver/Src/stm32g4xx_hal_uart.c you can find this check:

/* Ensure that Frequency clock is in the range [3 * baudrate, 4096 * baudrate] */
if ((lpuart_ker_ck_pres < (3U * huart->Init.BaudRate)) ||
(lpuart_ker_ck_pres > (4096U * huart->Init.BaudRate)))
{
ret = HAL_ERROR;
}

assume huart->Init.BaudRate is 28333333 and lpuart_ker_ck_pres=170000000 the result is larger than uint32_t and results in a  HAL_ERROR

You can check this with this small test application. Maybe you can fix this in the next release.

#include <stdio.h>
#include <stdint.h>
int main() {
  uint32_t BaudRate = 28333334;
  uint32_t lpuart_ker_ck_pres = 170000000;

  printf("Start;\n");
  if (lpuart_ker_ck_pres < (3U * BaudRate))
  {
    printf("Error(1);\n");
  }
  if (lpuart_ker_ck_pres > (4096U * BaudRate))
  {
    printf("Error(2);\n");
  }
  printf("End;\n");
}

 

7 REPLIES 7
Uwe Bonnes
Principal III

Keep in mind the Cube is only meant as a start and will not cover  all cases.

However instead of

lpuart_ker_ck_pres > (4096U * huart->Init.BaudRate

( lpuart_ker_ck_pres / 4096) > huart->Init.Baudrate
 should avoid the overflow


@Uwe Bonnes wrote:

 Cube ...  will not cover  all cases.


and this certainly doesn't look like an everyday case:

  uint32_t BaudRate = 28333334;

That's over 28 Mega Baud!!

That's even faster than this:

https://community.st.com/t5/stm32-mcus-products/stm32-uart-at-20-mbps/m-p/740727/highlight/true#M265668

 

A complex system that works is invariably found to have evolved from a simple system that worked.
A complex system designed from scratch never works and cannot be patched up to make it work.

There was some discussion lately about how to achieve baudrates that high and using the LPUART was one hint.

Yes, that was the thread I linked!

 

A complex system that works is invariably found to have evolved from a simple system that worked.
A complex system designed from scratch never works and cannot be patched up to make it work.

this is my preferred solution. Maybe this find a way into the next release 

if (lpuart_ker_ck_pres > (4096U * (uint64_t)BaudRate))

Yes this is fast. It is a performance test for this Isolator  SI8622ED-B-ISR in loop back mode