3
\$\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.
    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
    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
    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.
    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
    Dec 18, 2015 at 10:24

0

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Browse other questions tagged or ask your own question.