Skip to main content
fpalarmini
Associate
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!!
 }
 }
}

 

 

1 reply

Karl Yamashita
Principal
April 28, 2025

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

If a reply has proven helpful, click on Accept as Solution so that it'll show at top of the post.CAN Jammer an open source CAN bus hacking toolCANableV3 Open Source
fpalarmini
Associate
April 28, 2025

Receiving