Skip to main content
Vaclav Chrascina
Associate II
May 24, 2018
Question

STM32F407 UART Communication

  • May 24, 2018
  • 1 reply
  • 774 views
Posted on May 24, 2018 at 08:42

I am trying to set up a communication between my STM32F4 - Discovery with Open 407V-D development board and a peripheral using UART3 as a RS-485 bus.

I have problem with my communication becouse Rx state of UART remain busy.

Could somebody please explain me what am I doing wrong?

Should I somehow edit HAL_UART_IRQHandler or what setting am I missing?

Here is my code:

#include 'main.h' #include 'stm32f4xx_hal.h' UART_HandleTypeDef huart3; uint8_t Ocular_1_RxBuffer[4]; uint8_t Ocular_1_TxBuffer[2] = {0x01,0x86}; __IO ITStatus UartReady; void SystemClock_Config(void); static void MX_GPIO_Init(void); static void MX_USART3_UART_Init(void); int main(void) { HAL_Init(); SystemClock_Config(); MX_GPIO_Init(); MX_USART3_UART_Init(); HAL_GPIO_WritePin(GPIOB,GPIO_PIN_9,GPIO_PIN_SET); //set RS 485 into transmit mode while (1) { int Timeout = 1000000; while(huart3.gState != HAL_UART_STATE_READY) //wait for UART { Timeout--; if(Timeout == 0) Error_Handler(); } Timeout = 1000000; if(HAL_UART_Transmit_IT(&huart3, (uint8_t*)Ocular_1_TxBuffer, 2) != HAL_OK) //Send request { Error_Handler(); } while(huart3.RxState != HAL_UART_STATE_READY) //wait for UART { Timeout--; if(Timeout == 0) Error_Handler(); } Timeout = 1000000; if(HAL_UART_Receive_IT(&huart3, (uint8_t*)Ocular_1_RxBuffer, 4) != HAL_OK) //Response { Error_Handler(); } while(UartReady == RESET) //Wait for response { Timeout--; if(Timeout == 0) Error_Handler(); } } }

I have successfully received response from my peripheral device, but my code generate Error_Handler() after HAL_UART_RxCpltCallback() function. This Error_Handler() occurs in

while(UartReady == RESET)loop.

Could somebody please explain this behavior to me?

My callback functions:

void HAL_UART_TxCpltCallback(UART_HandleTypeDef *UartHandle) { /* Set transmission flag: transfer complete */ HAL_GPIO_WritePin(GPIOB,GPIO_PIN_9,GPIO_PIN_RESET); UartReady = RESET; } void HAL_UART_RxCpltCallback(UART_HandleTypeDef *UartHandle) { /* Set transmission flag: transfer complete */ HAL_GPIO_WritePin(GPIOB,GPIO_PIN_9,GPIO_PIN_SET); UartReady = SET; }

#stm32f #uart-interrupt #rs485
This topic has been closed for replies.

1 reply

Tesla DeLorean
Guru
August 10, 2018

Sorry, bumping old zombie unanswered threads off my feed

Tips, Buy me a coffee, or three.. PayPal Venmo (See Profile) Up vote any posts that you find helpful, it shows what's working..