ST意法半导体
直播中

李秀兰

7年用户 1416经验值
私信 关注
[问答]

在STM32H753ZI上使用DMA和UART获取HAL_DMA_ERROR_TE出现传输错误怎么解决?

我正在尝试使用 DMA 设置 UART5 TX。我正在使用 Cube,在 GUI 中我选择 UART5 为异步,并为 UART5_TX 添加了 DMA。然后,在生成的代码中,我添加了这部分,因为我没有看到 DMA 的初始化(在 MX_DMA_Init() 内部):
  •   /* Peripheral DMA init*/
  •   hdma_uart5_tx.Instance = DMA1_Stream0;
  •   //hdma_uart5_tx.Init.Channel = DMA_CHANNEL_4;
  •   hdma_uart5_tx.Init.Direction = DMA_MEMORY_TO_PERIPH;
  •   hdma_uart5_tx.Init.PeriphInc = DMA_PINC_DISABLE;
  •   hdma_uart5_tx.Init.MemInc = DMA_MINC_ENABLE;
  •   hdma_uart5_tx.Init.PeriphDataAlignment = DMA_MDATAALIGN_BYTE;
  •   hdma_uart5_tx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;
  •   hdma_uart5_tx.Init.Mode = DMA_NORMAL;
  •   hdma_uart5_tx.Init.Priority = DMA_PRIORITY_MEDIUM;
  •   hdma_uart5_tx.Init.FIFOMode = DMA_FIFOMODE_DISABLE;
  •     HAL_DMA_Init(&hdma_uart5_tx);
  •     __HAL_LINKDMA(&huart5,hdmatx,hdma_uart5_tx);
Main 函数,除了在 while(1) 中添加了这段代码外,我没有做太多事情:
  • while (1)
  •   {
  •     /* USER CODE END WHILE */
  •     /* USER CODE BEGIN 3 */
  •           if (HAL_UART_Transmit_DMA(&huart5,au8ch, 1) == HAL_OK)
  •           {
  •                   HAL_GPIO_WritePin(GPIOE, GPIO_PIN_1, GPIO_PIN_SET);
  •           }
  •           else
  •           {
  •                   HAL_GPIO_WritePin(GPIOE, GPIO_PIN_1, GPIO_PIN_RESET);
  •           }
  •           HAL_Delay(1000);
  •   }
  •   /* USER CODE END 3 */
这是传输数组第一个字节的代码。我将 Nucleo-H753ZI 板的引脚连接到终端软件,但没有得到任何结果。(请注意,我可以在不使用 DMA 的情况下获得一些东西)。LED 亮起,这意味着函数正在返回 HAL_OK,但屏幕上仍然没有任何内容。
我尝试调试代码,我在函数“ void HAL_DMA_IRQHandler (DMA_HandleTypeDef *hdma)”中放置了一个断点,它停在那里,这意味着它获得了发送某些东西的中断,但随后它进入了这个自动生成的代码:
  • if(IS_DMA_STREAM_INSTANCE(hdma->Instance) != 0U)  /* DMA1 or DMA2 instance */
  •   {
  •     /* Transfer Error Interrupt management ***************************************/
  •     if ((tmpisr_dma & (DMA_FLAG_TEIF0_4 << (hdma->StreamIndex & 0x1FU))) != 0U)
  •     {
  •       if(__HAL_DMA_GET_IT_SOURCE(hdma, DMA_IT_TE) != 0U)
  •       {
  •         /* Disable the transfer error interrupt */
  •         ((DMA_Stream_TypeDef   *)hdma->Instance)->CR  &= ~(DMA_IT_TE);
  •         /* Clear the transfer error flag */
  •         regs_dma->IFCR = DMA_FLAG_TEIF0_4 << (hdma->StreamIndex & 0x1FU);
  •         /* Update error code */
  •         hdma->ErrorCode |= HAL_DMA_ERROR_TE;
  •       }
  •     }
  • ...
  • ...
  • ...
  • /* manage error case */
  •     if(hdma->ErrorCode != HAL_DMA_ERROR_NONE)
  •     {
  •       if((hdma->ErrorCode & HAL_DMA_ERROR_TE) != 0U)
  •       {
  •         hdma->State = HAL_DMA_STATE_ABORT;
  •         /* Disable the stream */
  •         __HAL_DMA_DISABLE(hdma);
  •         do
  •         {
  •           if (++count > timeout)
  •           {
  •             break;
  •           }
  •         }
  •         while((((DMA_Stream_TypeDef   *)hdma->Instance)->CR & DMA_SxCR_EN) != 0U);
  •         /* Process Unlocked */
  •         __HAL_UNLOCK(hdma);
  •         if((((DMA_Stream_TypeDef   *)hdma->Instance)->CR & DMA_SxCR_EN) != 0U)
  •         {
  •           /* Change the DMA state to error if DMA disable fails */
  •           hdma->State = HAL_DMA_STATE_ERROR;
  •         }
  •         else
  •         {
  •           /* Change the DMA state to Ready if DMA disable success */
  •           hdma->State = HAL_DMA_STATE_READY;
  •         }
  •       }
  •       if(hdma->XferErrorCallback != NULL)
  •       {
  •         /* Transfer error callback */
  •         hdma->XferErrorCallback(hdma);
  •       }
  •     }
  •   }
知道我可能会遗漏什么吗?




更多回帖

发帖
×
20
完善资料,
赚取积分