Electrical Engineering Stack Exchange is a question and answer site for electronics and electrical engineering professionals, students, and enthusiasts. It's 100% free.

Sign up
Here's how it works:
  1. Anybody can ask a question
  2. Anybody can answer
  3. The best answers are voted up and rise to the top

I'm using 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 additional TIMEOUT parameter. As the TIMOUT 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
   */
}
share|improve this question
    
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.. – Eugene Sh. Dec 11 '15 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) – Arsenal Dec 11 '15 at 15:06
    
@Arsenal I am not a pro with the Cube either and I don't have it right now, but I believe there is a section in the handler which is modifiable by user. But it could also be that this type of project is assuming using the HAL_delay only for timings.. – Eugene Sh. Dec 11 '15 at 15:11
2  
@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. – Arsenal Dec 11 '15 at 15:44
1  
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? – Eugene Sh. Dec 11 '15 at 15:48

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Browse other questions tagged or ask your own question.