cancel
Showing results for 
Search instead for 
Did you mean: 

STM32L152 UART code missing in driver

Veldbrand
Associate

Good Day,

Recently I started working with a new MCU (STM32L152). I ported some UART code to handle received data from a different MCU, which worked fine. But as soon as I started testing edge cases I saw some weird things happen. I am using the DMA on the receive, and I rely on the Idle interrupt to send data to a different buffer for processing. It seemed like the Idle interrupt would trigger correctly for the following:
- data length < half buffer length

- data length = half buffer length

- half buffer length < data length < full buffer length

-  full buffer length < data length 

But it does not trigger for:

- data length = full buffer length
It turns out in HAL_UART_IRQHandler (in stm32l1xx_hal_uart.c) there is a missing piece of code that enables this to happen. This code existed in the previous MCU's UART driver. I checked that I had the newest library downloaded for STM32L152. The piece of missing code is attached.

      /*
       * NOTE: This else was manually put in to fix the Idle interrupt not firing on an EXACTLY full buffer
       *       worth of data being received.
       */

      else
      {
        /* If DMA is in Circular mode, Idle event is to be reported to user
           even if occurring after a Transfer Complete event from DMA */
        if (nb_remaining_rx_data == huart->RxXferSize)
        {
          if (HAL_IS_BIT_SET(huart->hdmarx->Instance->CCR, DMA_CCR_CIRC))
          {
            /* Initialize type of RxEvent that correspond to RxEvent callback execution;
               In this case, Rx Event type is Idle Event */
            huart->RxEventType = HAL_UART_RXEVENT_IDLE;

#if (USE_HAL_UART_REGISTER_CALLBACKS == 1)
            /*Call registered Rx Event callback*/
            huart->RxEventCallback(huart, huart->RxXferSize);
#else
            /*Call legacy weak Rx Event callback*/
            HAL_UARTEx_RxEventCallback(huart, huart->RxXferSize);
#endif /* (USE_HAL_UART_REGISTER_CALLBACKS) */
          }
        }
      }

 

1 ACCEPTED SOLUTION

Accepted Solutions

Thanks!


I have removed the image and added the code.
The MCU I copied the code from was the STM32L471.

View solution in original post

2 REPLIES 2
Andrew Neil
Super User

Welcome to the forum.

Please see How to write your question to maximize your chances to find a solution for best results; in particular, How to insert source code - not as images.

 


@Veldbrand wrote:

a different MCU ... This code existed in the previous MCU's UART driver. 


Which MCU was that?

A complex system that works is invariably found to have evolved from a simple system that worked.
A complex system designed from scratch never works and cannot be patched up to make it work.

Thanks!


I have removed the image and added the code.
The MCU I copied the code from was the STM32L471.