我正在尝试使用 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);
- }
- }
- }
知道我可能会遗漏什么吗?