Skip to main content
ENove.1
Associate
Jul 6, 2020 1:43 PM UTC
Question

STM32H750VB uart errors

Hi,

I have a problem using UART7 on STM32H750VB. It is configured by STM32CubeMx to receive and transmit with DMA with a baud rate of 115200 but all the data that arrive from the external device cause FRAME or NOISE errors.

I checked with my oscilloscope and the received baud rate is perfect, with minimal deviation (less than 0.5%), and there is no noise on the received data.

Here are the clock and the UART7 configuration:

/**

 * @brief System Clock Configuration

 * @retval None

 */

void SystemClock_Config(void)

{

 RCC_OscInitTypeDef RCC_OscInitStruct = {0};

 RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};

 RCC_PeriphCLKInitTypeDef PeriphClkInitStruct = {0};

 /** Supply configuration update enable 

 */

 HAL_PWREx_ConfigSupply(PWR_LDO_SUPPLY);

 /** Configure the main internal regulator output voltage 

 */

 __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE3);

 while(!__HAL_PWR_GET_FLAG(PWR_FLAG_VOSRDY)) {}

 /** Macro to configure the PLL clock source 

 */

 __HAL_RCC_PLL_PLLSOURCE_CONFIG(RCC_PLLSOURCE_HSI);

 /** Initializes the CPU, AHB and APB busses clocks 

 */

 RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI|RCC_OSCILLATORTYPE_LSI;

 RCC_OscInitStruct.HSIState = RCC_HSI_DIV1;

 RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;

 RCC_OscInitStruct.LSIState = RCC_LSI_ON;

 RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE;

 RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI;

 if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)

 {

  Error_Handler();

 }

 /** Initializes the CPU, AHB and APB busses clocks 

 */

 RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK

               |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2

               |RCC_CLOCKTYPE_D3PCLK1|RCC_CLOCKTYPE_D1PCLK1;

 RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_HSI;

 RCC_ClkInitStruct.SYSCLKDivider = RCC_SYSCLK_DIV1;

 RCC_ClkInitStruct.AHBCLKDivider = RCC_HCLK_DIV1;

 RCC_ClkInitStruct.APB3CLKDivider = RCC_APB3_DIV1;

 RCC_ClkInitStruct.APB1CLKDivider = RCC_APB1_DIV1;

 RCC_ClkInitStruct.APB2CLKDivider = RCC_APB2_DIV1;

 RCC_ClkInitStruct.APB4CLKDivider = RCC_APB4_DIV1;

 if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0) != HAL_OK)

 {

  Error_Handler();

 }

 PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_UART4|RCC_PERIPHCLK_UART7

               |RCC_PERIPHCLK_UART5|RCC_PERIPHCLK_I2C2

               |RCC_PERIPHCLK_ADC|RCC_PERIPHCLK_I2C1;

 PeriphClkInitStruct.PLL2.PLL2M = 32;

 PeriphClkInitStruct.PLL2.PLL2N = 129;

 PeriphClkInitStruct.PLL2.PLL2P = 2;

 PeriphClkInitStruct.PLL2.PLL2Q = 2;

 PeriphClkInitStruct.PLL2.PLL2R = 2;

 PeriphClkInitStruct.PLL2.PLL2RGE = RCC_PLL2VCIRANGE_1;

 PeriphClkInitStruct.PLL2.PLL2VCOSEL = RCC_PLL2VCOWIDE;

 PeriphClkInitStruct.PLL2.PLL2FRACN = 0;

 PeriphClkInitStruct.Usart234578ClockSelection = RCC_USART234578CLKSOURCE_D2PCLK1;

 PeriphClkInitStruct.I2c123ClockSelection = RCC_I2C123CLKSOURCE_D2PCLK1;

 PeriphClkInitStruct.AdcClockSelection = RCC_ADCCLKSOURCE_PLL2;

 if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct) != HAL_OK)

 {

  Error_Handler();

 }

 HAL_RCC_MCOConfig(RCC_MCO1, RCC_MCO1SOURCE_HSI, RCC_MCODIV_3);

}

/**

 * @brief UART7 Initialization Function

 * @param None

 * @retval None

 */

void MX_UART7_Init(void)

{

 /* USER CODE BEGIN UART7_Init 0 */

 /* USER CODE END UART7_Init 0 */

 /* USER CODE BEGIN UART7_Init 1 */

 /* USER CODE END UART7_Init 1 */

 huart7.Instance = UART7;

 huart7.Init.BaudRate = 115200;

 huart7.Init.WordLength = UART_WORDLENGTH_8B;

 huart7.Init.StopBits = UART_STOPBITS_1;

 huart7.Init.Parity = UART_PARITY_NONE;

 huart7.Init.Mode = UART_MODE_TX_RX;

 huart7.Init.HwFlowCtl = UART_HWCONTROL_NONE;

 huart7.Init.OverSampling = UART_OVERSAMPLING_16;

 huart7.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE;

 huart7.Init.ClockPrescaler = UART_PRESCALER_DIV1;

 huart7.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;

 if (HAL_UART_Init(&huart7) != HAL_OK)

 {

  Error_Handler();

 }

 if (HAL_UARTEx_SetTxFifoThreshold(&huart7, UART_TXFIFO_THRESHOLD_1_8) != HAL_OK)

 {

  Error_Handler();

 }

 if (HAL_UARTEx_SetRxFifoThreshold(&huart7, UART_RXFIFO_THRESHOLD_1_8) != HAL_OK)

 {

  Error_Handler();

 }

 if (HAL_UARTEx_DisableFifoMode(&huart7) != HAL_OK)

 {

  Error_Handler();

 }

 /* USER CODE BEGIN UART7_Init 2 */

 /* USER CODE END UART7_Init 2 */

}

What could be the problem?

Thank you very much for your help.

This topic has been closed for replies.

6 replies

LMI2
Senior III
Jul 7, 2020 3:19 PM UTC

Please put your code in code brackets. I wont read your code, but sometimes my PC cannot keep up with the speed. So add pauses to Uart transmitting.

Tesla DeLorean
Guru
Jul 7, 2020 3:29 PM UTC

Not sure how accurate HSI is, would check a transmit stream of 0x55 (U) characters for conformance to bit timings, and perhaps use an HSE source of known accuracy/performance.

Could perhaps try pulling the baud +/-10% seeing if things improve, or add an additional stop bit.

If the HSI is a problem, might want to revisit the calibration settings/defaults.

Tips, Buy me a coffee, or three.. PayPal Venmo (See Profile) Up vote any posts that you find helpful, it shows what's working..
ENove.1
ENove.1Author
Associate
Jul 7, 2020 3:35 PM UTC

Hi Clive1,

still tried this, without success. More, the accuracy on the datasheet seems to be 0,5% so it is precise enough, I think. On the transmitting device, the bit time is perfect, I measured it with a very precise oscilloscope.

ENove.1
ENove.1Author
Associate
Jul 7, 2020 3:32 PM UTC

Hi LMI2, thank you for your answer. I'm not sure to have well understood your question; do you mean the code to receive the data?

Or you want my code in the "code snippet"?

Sorry it is first time I write in the ST community.

LMI2
Senior III
Jul 7, 2020 7:17 PM UTC
/**
 
 * @brief System Clock Configuration
 
 * @retval None
 
 */
 
void SystemClock_Config(void)
 
{
 
 RCC_OscInitTypeDef RCC_OscInitStruct = {0};
 
 RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
 
 RCC_PeriphCLKInitTypeDef PeriphClkInitStruct = {0};
 
 
 
 /** Supply configuration update enable 
 
 */
 
 HAL_PWREx_ConfigSupply(PWR_LDO_SUPPLY);
 
 /** Configure the main internal regulator output voltage 
 
 */
 
 __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE3);

Your code looks better like this

ENove.1
ENove.1Author
Associate
Jul 8, 2020 12:50 PM UTC

Hi LMI2,

/**
 * @brief System Clock Configuration
 * @retval None
 */
void SystemClock_Config(void)
{
 RCC_OscInitTypeDef RCC_OscInitStruct = {0};
 RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
 RCC_PeriphCLKInitTypeDef PeriphClkInitStruct = {0};
 
 /** Supply configuration update enable 
 */
 HAL_PWREx_ConfigSupply(PWR_LDO_SUPPLY);
 /** Configure the main internal regulator output voltage 
 */
 __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE3);
 
 while(!__HAL_PWR_GET_FLAG(PWR_FLAG_VOSRDY)) {}
 /** Macro to configure the PLL clock source 
 */
 __HAL_RCC_PLL_PLLSOURCE_CONFIG(RCC_PLLSOURCE_HSI);
 /** Initializes the CPU, AHB and APB busses clocks 
 */
 RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI|RCC_OSCILLATORTYPE_LSI;
 RCC_OscInitStruct.HSIState = RCC_HSI_DIV1;
 RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;
 RCC_OscInitStruct.LSIState = RCC_LSI_ON;
 RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE;
 RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI;
 if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
 {
 Error_Handler();
 }
 /** Initializes the CPU, AHB and APB busses clocks 
 */
 RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
 |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2
 |RCC_CLOCKTYPE_D3PCLK1|RCC_CLOCKTYPE_D1PCLK1;
 RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_HSI;
 RCC_ClkInitStruct.SYSCLKDivider = RCC_SYSCLK_DIV1;
 RCC_ClkInitStruct.AHBCLKDivider = RCC_HCLK_DIV1;
 RCC_ClkInitStruct.APB3CLKDivider = RCC_APB3_DIV1;
 RCC_ClkInitStruct.APB1CLKDivider = RCC_APB1_DIV1;
 RCC_ClkInitStruct.APB2CLKDivider = RCC_APB2_DIV1;
 RCC_ClkInitStruct.APB4CLKDivider = RCC_APB4_DIV1;
 
 if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0) != HAL_OK)
 {
 Error_Handler();
 }
 PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_UART4|RCC_PERIPHCLK_UART7
 |RCC_PERIPHCLK_UART5|RCC_PERIPHCLK_I2C2
 |RCC_PERIPHCLK_ADC|RCC_PERIPHCLK_I2C1;
 PeriphClkInitStruct.PLL2.PLL2M = 32;
 PeriphClkInitStruct.PLL2.PLL2N = 129;
 PeriphClkInitStruct.PLL2.PLL2P = 2;
 PeriphClkInitStruct.PLL2.PLL2Q = 2;
 PeriphClkInitStruct.PLL2.PLL2R = 2;
 PeriphClkInitStruct.PLL2.PLL2RGE = RCC_PLL2VCIRANGE_1;
 PeriphClkInitStruct.PLL2.PLL2VCOSEL = RCC_PLL2VCOWIDE;
 PeriphClkInitStruct.PLL2.PLL2FRACN = 0;
 PeriphClkInitStruct.Usart234578ClockSelection = RCC_USART234578CLKSOURCE_D2PCLK1;
 PeriphClkInitStruct.I2c123ClockSelection = RCC_I2C123CLKSOURCE_D2PCLK1;
 PeriphClkInitStruct.AdcClockSelection = RCC_ADCCLKSOURCE_PLL2;
 if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct) != HAL_OK)
 {
 Error_Handler();
 }
 HAL_RCC_MCOConfig(RCC_MCO1, RCC_MCO1SOURCE_HSI, RCC_MCODIV_3);
}
 
/**
 * @brief UART7 Initialization Function
 * @param None
 * @retval None
 */
void MX_UART7_Init(void)
{
 
 /* USER CODE BEGIN UART7_Init 0 */
 
 /* USER CODE END UART7_Init 0 */
 
 /* USER CODE BEGIN UART7_Init 1 */
 
 /* USER CODE END UART7_Init 1 */
 huart7.Instance = UART7;
 huart7.Init.BaudRate = 115200;
 huart7.Init.WordLength = UART_WORDLENGTH_8B;
 huart7.Init.StopBits = UART_STOPBITS_1;
 huart7.Init.Parity = UART_PARITY_NONE;
 huart7.Init.Mode = UART_MODE_TX_RX;
 huart7.Init.HwFlowCtl = UART_HWCONTROL_NONE;
 huart7.Init.OverSampling = UART_OVERSAMPLING_16;
 huart7.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE;
 huart7.Init.ClockPrescaler = UART_PRESCALER_DIV1;
 huart7.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;
 if (HAL_UART_Init(&huart7) != HAL_OK)
 {
 Error_Handler();
 }
 if (HAL_UARTEx_SetTxFifoThreshold(&huart7, UART_TXFIFO_THRESHOLD_1_8) != HAL_OK)
 {
 Error_Handler();
 }
 if (HAL_UARTEx_SetRxFifoThreshold(&huart7, UART_RXFIFO_THRESHOLD_1_8) != HAL_OK)
 {
 Error_Handler();
 }
 if (HAL_UARTEx_DisableFifoMode(&huart7) != HAL_OK)
 {
 Error_Handler();
 }
 /* USER CODE BEGIN UART7_Init 2 */
 
 /* USER CODE END UART7_Init 2 */
 
}