cancel
Showing results for 
Search instead for 
Did you mean: 

STM32 HAL UART Receive Issues

ifarah
Associate
Posted on May 17, 2016 at 22:02

Hi all,

I have recently run into an issue trying to use the HAL_UART_Receieve() function which comes with the HAL library. I am using the Nucle-F303RE board, which uses the STM32F303RE microcontroller. I was able to get the HAL_UART_Transmit function working, where I used the following block to constantly output text which I read using a python shell on a Linux computer:

while
(1)
{
char
*msg = 
''Please work \r\n''
;
HAL_UART_Transmit(&huart2, (uint8_t *)msg, 
strlen
(msg), 0xFFFF);
HAL_Delay(500);
}

The clock, GPIO, and UART settings I have set up are the following:

/** System Clock Configuration
*/
void
SystemClock_Config(
void
)
{
RCC_OscInitTypeDef RCC_OscInitStruct;
RCC_ClkInitTypeDef RCC_ClkInitStruct;
RCC_PeriphCLKInitTypeDef PeriphClkInit;
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;
RCC_OscInitStruct.HSIState = RCC_HSI_ON;
RCC_OscInitStruct.HSICalibrationValue = 16;
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI;
RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL9;
RCC_OscInitStruct.PLL.PREDIV = RCC_PREDIV_DIV1;
HAL_RCC_OscConfig(&RCC_OscInitStruct);
RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_SYSCLK;
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_HSI;
RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;
RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0);
PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_USART2;
PeriphClkInit.Usart2ClockSelection = RCC_USART2CLKSOURCE_PCLK1;
HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit);
HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000);
HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK);
/* SysTick_IRQn interrupt configuration */
HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0);
}
/* USART2 init function */
void
MX_USART2_UART_Init(
void
)
{
huart2.Instance = USART2;
huart2.Init.BaudRate = 9600;
huart2.Init.WordLength = UART_WORDLENGTH_8B;
huart2.Init.StopBits = UART_STOPBITS_1;
huart2.Init.Parity = UART_PARITY_NONE;
huart2.Init.Mode = UART_MODE_TX_RX;
huart2.Init.HwFlowCtl = UART_HWCONTROL_NONE;
huart2.Init.OverSampling = UART_OVERSAMPLING_16;
huart2.Init.OneBitSampling = UART_ONEBIT_SAMPLING_DISABLED ;
huart2.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;
HAL_UART_Init(&huart2);
}
/** Configure pins as 
PA2 ------> USART2_TX
PA3 ------> USART2_RX
*/
void
MX_GPIO_Init(
void
)
{
GPIO_InitTypeDef GPIO_InitStruct;
/* GPIO Ports Clock Enable */
__GPIOC_CLK_ENABLE();
__GPIOF_CLK_ENABLE();
__GPIOA_CLK_ENABLE();
__GPIOB_CLK_ENABLE();
__USART2_CLK_ENABLE();
/*Configure GPIO pin : B1_Pin */
GPIO_InitStruct.Pin = B1_Pin;
GPIO_InitStruct.Mode = GPIO_MODE_EVT_RISING;
GPIO_InitStruct.Pull = GPIO_NOPULL;
HAL_GPIO_Init(B1_GPIO_Port, &GPIO_InitStruct);
/*Configure GPIO pins : USART_TX_Pin USART_RX_Pin */
GPIO_InitStruct.Pin = GPIO_PIN_2|GPIO_PIN_3;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_LOW;
GPIO_InitStruct.Alternate = GPIO_AF7_USART2;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
/*Configure GPIO pin : LD2_Pin */
GPIO_InitStruct.Pin = LD2_Pin;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_LOW;
HAL_GPIO_Init(LD2_GPIO_Port, &GPIO_InitStruct);
}

Next, I tried to get the HAL_UART_Receieve() function working using the following block, where text would only be printed in the terminal window if the function correctly receives an input:

uint8_t rx_buffer[1];
while
(1)
{
if
(HAL_UART_Receive(&huart2, (uint8_t*)rx_buffer, 1, 500) == HAL_OK) {
HAL_Delay(100);
char
*msg = 
''Please work \r\n''
;
HAL_UART_Transmit(&huart2, (uint8_t *)msg, 
strlen
(msg), 0xFFFF);
HAL_Delay(500);
}
}

However, when I do this, the HAL_UART_Receive function is never returning as HAL_OK or actually receiving my transmission (for more context, in the python shell I am running ser.write('1') where ser is set up to read the port the RS232-device attached to UART2 is plugged in to). I am only sending a single byte, yet it does not seem to picking it up. I am not sure whether my input parameters are correct or not, although my past experience with the HAL library makes me think they are. I am looking for a potential reason why this isn't working, whether it be a bug in my code or set-up of the STM32 device. Any help is greatly appreciated, and if any further clarification is needed please let me know. Thanks #stm32-uart-hal-f303re
1 REPLY 1
Amel NASRI
ST Employee
Posted on May 23, 2016 at 17:17

Hi farah.ibrahim,

Try to check the root cause of reception error.

It should be better to implement an error handler (like what is done in the example STM32Cube_FW_F3_V1.4.0\Projects\STM32F303ZE-Nucleo\Examples\UART\UART_TwoBoards_ComPolling\Src) in order to know the root cause.

Then, I recommend you to increase the timeout value and test again.

-Mayla-

To give better visibility on the answered topics, please click on Accept as Solution on the reply which solved your issue or answered your question.