问题描述
使用stm32的uart5发送数据,每隔100ms发送一帧,我的代码是基于hal库的,使用HAL_UART_Transmit()阻塞方式发送时电脑上串口助手收到的数据均正确,但改用HAL_UART_Transmit_DMA()非阻塞方式发送时就出现错误,错误表现是只有前几个字节发送正确,但后面几个完全变了样(总共8个字节)
正确数据为:
使用DMA发送时的错误数据为:
解决方法
dma的配置如下:
/* DMA外设通道的配置 */
hdma_usarta_tx.Instance = USARTa_DMAx_STREAMn;
hdma_usarta_tx.Init.Channel = USARTa_DMAx_CHANNELn;
hdma_usarta_tx.Init.Direction = DMA_MEMORY_TO_PERIPH;
hdma_usarta_tx.Init.PeriphInc = DMA_PINC_DISABLE;
hdma_usarta_tx.Init.MemInc = DMA_MINC_ENABLE;
hdma_usarta_tx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;
hdma_usarta_tx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;
hdma_usarta_tx.Init.Mode = DMA_NORMAL;
hdma_usarta_tx.Init.Priority = DMA_PRIORITY_HIGH;
hdma_usarta_tx.Init.FIFOMode = DMA_FIFOMODE_DISABLE;
HAL_DMA_Init(&hdma_usarta_tx);
__HAL_LINKDMA(huart,hdmatx,hdma_usarta_tx);
只要使能FIFO模式后,数据就正常了
hdma_usarta_tx.Init.FIFOMode = DMA_FIFOMODE_ENABLE;