# UART reception problem when SysTick Interrupt is enabled

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
*/
}

• Why would you want to call HAL_SYSTICK_IRQHandler inside SysTick_Handler? It makes sense only if you are polling the RX rather than using the interrupt. And the HAL_Delay function is heavily depending on the counter incremented by HAL_IncTick, this is why it is not working if you comment it out. And I think, you are not supposed to use HAL_UART_Receive directly with this method.. Dec 11, 2015 at 14:55
• @EugeneSh. I'm not very familiar with the cube stuff, but wouldn't HAL_SYSTICK_IRQHandler be a way to get a user function to be executed in addition to the HAL_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) Dec 11, 2015 at 15:06
• @EugeneSh. I've downloaded it and found: void HAL_SYSTICK_IRQHandler(void) { HAL_SYSTICK_Callback(); } and __weak void HAL_SYSTICK_Callback(void) so the call of HAL_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. Dec 11, 2015 at 15:44
• Oh.. It looks like I got confused with all of the names. I was considering 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? Dec 11, 2015 at 15:48
• @Tibo, I really think it's a CubeMX problem, since it's always mentioned as a buggy project and is under development by ST engineers. Seriously thinking of switching to SPL (Std Peripheral Lib) soon. Dec 18, 2015 at 10:24