Skip to main content
Visitor II
September 23, 2025
Question

Problem in UART INTERRUPT call back function

  • September 23, 2025
  • 4 replies
  • 346 views

Hey guys!

I am currently working on stm32F2 series, the issue i was facing in   HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) when the UART transmit the first byte the interrupt call back function is not called instead calling the RxCpltCallback it call the " USART1_IRQHandler(void) "and the  RxCpltCallback function does not trigger at first byte in UART at the second byte it call the  RxCpltCallback  function and it works fine and i attached the code i was wrote 

#include "main.h"

UART_HandleTypeDef huart1;
UART_HandleTypeDef huart3;

unsigned char ra_buffer[32];

void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_USART1_UART_Init(void);
static void MX_USART3_UART_Init(void);

int main(void)
{
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_USART1_UART_Init();
MX_USART3_UART_Init();

HAL_UART_Receive_IT(&huart1,ra_buffer,12);

while (1)
{

HAL_Delay(1000);

}

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{

HAL_UART_Receive_IT(&huart1,ra_buffer,1);
HAL_UART_Transmit(&huart3,ra_buffer, 1,100);

}

    This topic has been closed for replies.

    4 replies

    Super User
    September 23, 2025

    > HAL_UART_Receive_IT(&huart1,ra_buffer,12);

    will call HAL_UART_RxCpltCallback only after 12 bytes received.

    USART1_IRQHandler is called internally after each byte until the limit you have set (here: 12) ist reached.

     

    ST Employee
    September 23, 2025

    Hi @Ravi_shankar ,

    Your issue is that the first byte received on UART1 does not trigger the HAL_UART_RxCpltCallback immediately, but the second byte does. This behavior usually happens because of how the UART receive interrupt and buffer size are configured and how the callback is re-armed.

    Your initial call is:

    This means the HAL driver waits to receive 12 bytes before triggering the HAL_UART_RxCpltCallback. So the callback will not be called after the first byte, but only after 12 bytes are received.
     

    In the Callback:


    Here you re-arm the receive interrupt to receive only 1 byte at a time. This is why after the first 12 bytes, the callback is triggered, and then subsequent single bytes trigger the callback immediately.

     

    If you want to receive one byte at a time and have the callback called immediately after each byte, you should:

    • Start the receive interrupt with length = 1 from the beginning.
    • In the callback, re-arm the receive interrupt again for 1 byte.

     

    Best Regards,
    Aime
     

    Technical Moderator
    September 25, 2025

    Hello @Ravi_shankar 

    Please any update on this thread?

    ST Employee
    October 24, 2025

    it is good explanation of other replies for how the 'HAL_UART_RxCpltCallback' work, but generally, we don't put any functions in HAL_UART_RxCpltCallback() but just trigger a flag to indicate one RX completely, because IT handler must be process short code and return quickly to avoid conflict with other IT coming.  just like 

    void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
    {

       UART_RX_ready = 1;

    }