4
\$\begingroup\$

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
   */
}
\$\endgroup\$
12
  • \$\begingroup\$ 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.. \$\endgroup\$
    – Eugene Sh.
    Commented Dec 11, 2015 at 14:55
  • \$\begingroup\$ @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) \$\endgroup\$
    – Arsenal
    Commented Dec 11, 2015 at 15:06
  • 2
    \$\begingroup\$ @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. \$\endgroup\$
    – Arsenal
    Commented Dec 11, 2015 at 15:44
  • 1
    \$\begingroup\$ 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? \$\endgroup\$
    – Eugene Sh.
    Commented Dec 11, 2015 at 15:48
  • 1
    \$\begingroup\$ @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. \$\endgroup\$
    – baqx0r
    Commented Dec 18, 2015 at 10:24

0

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Browse other questions tagged or ask your own question.