Skip to main content
Visitor II
April 28, 2025
Question

STM32G030 triggering DMA error code in UART without DMA configuration

  • April 28, 2025
  • 1 reply
  • 537 views

Hi everyone,

I have a program with UART communication using interruption and SPI communication using DMA. I realized that when I send a lot of data through SPI, sometimes I get the DMA error code in UART, but I didn't enable DMA in serial. As far as I know UART and SPI are unrelated, so I don't think that the DMA configuration in SPI is affecting UART communication.
Has anyone else experienced similar issues or have some clues?
I am writing in both SPI1 and SPI2 a buffer with 100 bytes every 50 milliseconds using the following function:

HAL_SPI_Transmit_DMA(&hspi1, bufferSPI1, BUFFER_SIZE_SPI1);

Below, I provide the configuration of UART and SPI:

UART configuration:

void HAL_UART_MspInit(UART_HandleTypeDef* huart)
{
 GPIO_InitTypeDef GPIO_InitStruct = {0};
 RCC_PeriphCLKInitTypeDef PeriphClkInit = {0};
 if(huart->Instance==USART1)
 {
 PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_USART1;
 PeriphClkInit.Usart1ClockSelection = RCC_USART1CLKSOURCE_PCLK1;
 if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK)
 {
 Error_Handler();
 }

 __HAL_RCC_USART1_CLK_ENABLE();
 __HAL_RCC_GPIOA_CLK_ENABLE();

 GPIO_InitStruct.Pin = GPIO_PIN_9|GPIO_PIN_10;
 GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
 GPIO_InitStruct.Pull = GPIO_NOPULL;
 GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
 GPIO_InitStruct.Alternate = GPIO_AF1_USART1;
 HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

 /* USART1 interrupt Init */
 HAL_NVIC_SetPriority(USART1_IRQn, 0, 0);
 HAL_NVIC_EnableIRQ(USART1_IRQn);
 }
}

SPI Init:

void HAL_SPI_MspInit(SPI_HandleTypeDef* hspi)
{
 GPIO_InitTypeDef GPIO_InitStruct = {0};
 if(hspi->Instance==SPI1)
 {
 __HAL_RCC_SPI1_CLK_ENABLE();
 __HAL_RCC_GPIOA_CLK_ENABLE();

 GPIO_InitStruct.Pin = GPIO_PIN_1 | GPIO_PIN_2;
 GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
 GPIO_InitStruct.Pull = GPIO_NOPULL;
 GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
 GPIO_InitStruct.Alternate = GPIO_AF0_SPI1;
 HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

 hdma_spi1_tx.Instance = DMA1_Channel1;
 hdma_spi1_tx.Init.Request = DMA_REQUEST_SPI1_TX;
 hdma_spi1_tx.Init.Direction = DMA_MEMORY_TO_PERIPH;
 hdma_spi1_tx.Init.PeriphInc = DMA_PINC_DISABLE;
 hdma_spi1_tx.Init.MemInc = DMA_MINC_ENABLE;
 hdma_spi1_tx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;
 hdma_spi1_tx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;
 hdma_spi1_tx.Init.Mode = DMA_NORMAL;
 hdma_spi1_tx.Init.Priority = DMA_PRIORITY_LOW;
 if (HAL_DMA_Init(&hdma_spi1_tx) != HAL_OK)
 {
 Error_Handler();
 }

 __HAL_LINKDMA(hspi,hdmatx,hdma_spi1_tx);
 }
 else if(hspi->Instance==SPI2)
 {
 __HAL_RCC_SPI2_CLK_ENABLE();
 __HAL_RCC_GPIOA_CLK_ENABLE();

 GPIO_InitStruct.Pin = GPIO_PIN_0;
 GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
 GPIO_InitStruct.Pull = GPIO_NOPULL;
 GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
 GPIO_InitStruct.Alternate = GPIO_AF0_SPI2;
 HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

 GPIO_InitStruct.Pin = GPIO_PIN_4;
 GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
 GPIO_InitStruct.Pull = GPIO_NOPULL;
 GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
 GPIO_InitStruct.Alternate = GPIO_AF1_SPI2;
 HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

 hdma_spi2_tx.Instance = DMA1_Channel2;
 hdma_spi2_tx.Init.Request = DMA_REQUEST_SPI2_TX;
 hdma_spi2_tx.Init.Direction = DMA_MEMORY_TO_PERIPH;
 hdma_spi2_tx.Init.PeriphInc = DMA_PINC_DISABLE;
 hdma_spi2_tx.Init.MemInc = DMA_MINC_ENABLE;
 hdma_spi2_tx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;
 hdma_spi2_tx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;
 hdma_spi2_tx.Init.Mode = DMA_NORMAL;
 hdma_spi2_tx.Init.Priority = DMA_PRIORITY_LOW;
 if (HAL_DMA_Init(&hdma_spi2_tx) != HAL_OK)
 {
 Error_Handler();
 }

 __HAL_LINKDMA(hspi,hdmatx,hdma_spi2_tx);
 }
}

I caught the DMA error code in the error callback routine of UART:

void HAL_UART_ErrorCallback(UART_HandleTypeDef *huart)
{
 if (huart->Instance == USART1)
 {
 if (huart->ErrorCode & HAL_UART_ERROR_DMA)
 {
 // BUG: sometimes enters here!!
 }
 }
}

 

 

    This topic has been closed for replies.

    1 reply

    Graduate II
    April 28, 2025

    So, during SPI communication, the UART error callback is called when the UART is transmitting, receiving or both?

    Visitor II
    April 28, 2025

    Receiving