GD32或STM32:DMA循环模式与普通模式(串口IDLE)

USART+DMA+循环队列接收不定长数据-CSDN博客

STM32 DMA 循环模式DMA_Mode_Circular详解-CSDN博客

推荐以上两个链接。

Normal(普通)模式的DMA+串口IDLE中断,流程如下:

1、初始化时:开启串口IDLE中断;dma_circulation_disable,失能DMA的循环;

2、在串口IDLE中断里面:

(1) 清除idle的flag;dma_channel_disable关闭DMA,dma_interrupt_flag_clear清除标记;

(2) 获取串口接收数据的长度,设置标记(在main的while里面会识别标记,解析数据);

(3) dma_transfer_number_config重新配置dma,dma_channel_enable使能DMA;

3、在while里面识别接收成功标记后解析数据;

使用DMA减少了cpu的参与(数据搬移),IDLE(即帧与帧之间的空缺时间会触发idle)解决了频繁的串口中断,又可以处理不定长的数据帧;

normal模式即:到达设定的传输长度(dma_init_struct.number = UART_DMA_SIZE;),或者人为的认为一次传输完成(例如在idle里面关闭DMA),DMA就不能再工作,必须重新配置dma_transfer_number_config,再开启dma_channel_enable;

以下截图来自:STM32 DMA 循环模式DMA_Mode_Circular详解-CSDN博客

你可能感兴趣的:(stm32,嵌入式硬件,单片机)