I'm using a STM32F411RE-Nucleo board and generating a project with Cube MX for System Workbench. The problem is that HAL_UART_Receive
function doesn't receive input from the user, even though I don't change any UART, GPIO, RCC or NVIC configuration.
Surprisingly, when I comment two lines in SysTick Interrupt Handler function i.e. SysTick_Handler
, HAL_UART_Receive
starts working but this comes with another problem.
void SysTick_Handler(void)
{
HAL_IncTick();
HAL_SYSTICK_IRQHandler();
}
HAL_Delay()
function doesn't work when I disable those two lines. I guess it's because the processor can't handle the ticks.
How to work HAL_UART_Receive
and HAL_Delay
work at the same time? I'm a bit new in embedded programming and I'm sorry if I couldn't get myself clear.
Thanks.
Edit:
I use this function for receiving user input:
if( HAL_UART_Receive_IT(&huart2, (uint8_t*) RxMessage, RXBUFFERSIZE) != HAL_OK )
{
while(1)
{
}
}
I don't want the timer to run while using HAL_UART_Receive()
function, which is the same as HAL_UART_Receive_IT()
but with an additional TIMEOUT
parameter. As the TIMEOUT
might call the SYSTICK
interrupt, I decided to use HAL_UART_Receive_IT()
.
Also, the full assert is OFF, if it's necessary to know.
Other parts of my code are as follows:
#define RXBUFFERSIZE 3
uint8_t RxMessage[RXBUFFERSIZE];
void SysTick_Handler(void)
{
HAL_IncTick(); //enabled
HAL_SYSTICK_IRQHandler(); //enabled
}
void HAL_SYSTICK_IRQHandler(void)
{
HAL_SYSTICK_Callback();
}
/**
* @brief SYSTICK callback.
* @retval None
*/
__weak void HAL_SYSTICK_Callback(void)
{
/* NOTE: This function Should not be modified, when the callback is needed,
the HAL_SYSTICK_Callback could be implemented in the user file
*/
}
HAL_SYSTICK_IRQHandler
insideSysTick_Handler
? It makes sense only if you are polling the RX rather than using the interrupt. And theHAL_Delay
function is heavily depending on the counter incremented byHAL_IncTick
, this is why it is not working if you comment it out. And I think, you are not supposed to useHAL_UART_Receive
directly with this method.. \$\endgroup\$HAL_SYSTICK_IRQHandler
be a way to get a user function to be executed in addition to theHAL_IncTick()
? It's the ST HAL, so it shouldn't be modified by the user, but how would he get a callback/additional method to be handled on systick? (not that it would be a great idea to do much on the timer basis, but who knows) \$\endgroup\$void HAL_SYSTICK_IRQHandler(void) { HAL_SYSTICK_Callback(); }
and__weak void HAL_SYSTICK_Callback(void)
so the call ofHAL_SYSTICK_IRQHandler()
is indeed placed by ST and there to call a callback (why they use another function just to call the callback is beyond me). I could imagine that the MCU is clocked too slowly for it to handle the UART and SysTick in a timely enough manner. \$\endgroup\$HAL_SYSTICK_IRQHandler
to be a UART interrupt handler. So perhaps the OP have added some code to the callback, so it is blocking or breaking something? \$\endgroup\$