原因:
可能是忘记关闭DMA导致串口、下一次DMA无法正常工作
解决办法:
在传输完成之后,关闭DMA,这里是调用串口DMA关闭函数,形参为串口初始化结构体地址,我这里是串口2。
HAL_UART_DMAStop(&huart2); //关闭寄存器——>外设的串口DMA
完美优化:
传输完成标志位
TCX标志位,例如:发送通道为7,即TC7
DAM外设通道表
例如,我使用的是串口2DMA的TX发送模式,即通道为USART2_TX,为通道7
代码解决
调用的是__HAL_DMA_GET_FLAG(__HANDLE__, __FLAG__);宏定义来获取标志位。
第一个形参为串口初始化结构体,第二个形参为通道完成标志位,这里我使用的是通道7,即TC7
if(__HAL_DMA_GET_FLAG(&hdma_usart2_tx,DMA_FLAG_TC7))//获取传输完成标志
{
__HAL_DMA_CLEAR_FLAG(&hdma_usart2_tx,DMA_FLAG_TC7);//清楚传输完成标志位
HAL_UART_DMAStop(&huart2); //关闭DMA传输
}
简单的一种使用办法:
while(1)
{
if((__HAL_DMA_GET_FLAG(&hdma_usart2_tx,DMA_FLAG_TC7)))
{
__HAL_DMA_CLEAR_FLAG(&hdma_usart2_tx,DMA_FLAG_TC7);
HAL_UART_DMAStop(&huart2);
break;
}
}
补充:
如果仍然无法解决的话,再检查一下时钟是否使能,串口中断是否设置。