一直不理解DMA不需要耗系统时间的原因,今天做了个实验才终于理解了,O(∩_∩)O哈!

我是新手,对于dma听的多,用的少....
偶尔用还是一知半解的.....
反正能用......这是我的想法.......
最近没事又倒腾了一下,终于从实验的角度知道dma是怎么回事了........
实验过程如下:
利用串口和dma搭配,利用keil的debug功能,可以很直观的看到dma无需系统参与的实时过程......
首先 , 利用stm32cubemx软件生存一个串口发送接收程序....
1.png

(切记,先调通了串口能发能收,再去开启DMA接收功能)
其次,默认已经可以正常读写串口了,那么打开工程,写入以下代码:


/[i] USER CODE BEGIN 0 [/i]/
#define size_of_rx_circular_buffer 128
uint8_t rx_circular_buffer;
uint8_t const * rx_tail_ptr;
/[i] USER CODE END 0 [/i]/

++++++++++++++++++++++++++++++++++++++++


/[i] USER CODE BEGIN 2 [/i]/
HAL_UART_Receive_DMA(&huart2, rx_circular_buffer, size_of_rx_circular_buffer);
rx_tail_ptr = rx_circular_buffer;

printf ("hello work!");
/[i] USER CODE END 2 [/i]/

以上,意思是利用DMA接收数据到buffer中,rx_tail_ptr 指向这个buffer指针
然后,连接好板卡和串口,开启debug模式,同时打开串口调试助手.
按照以下图示,
1 , 在 rx_tail_ptr 上面右击,选择查看memory模式
2 , 同样 在 文件usart.c中找到 DMA_HandleTypeDef hdma_usart2_rx;在hdma_usart2_rx上面右击,添加到查看窗口2,同时展开如下图所示:

无标题2.png


无标题3.png


我们首先用串口调试助手写入几个数据,观察memory窗口和观察窗口2的变化,
然后点击debug暂停调试按钮, 此时 仍然去调试助手里面点击发送一次数据,

无标题4.png


再次运行程序,并观察变化.
可以看到如下图所示的现象.

无标题1.png


无标题.png


因为上面我们发送数据的时候是暂停了系统的运行的,但是我们仍然发送数据到串口,串口仍然接收到了数据
这说明dma没有通过系统进行传递数据,而是自主传递,不需要系统干预.
验证完毕!
已邀请:

liujileo - 90后IT

赞同来自:

前几句就有错误

Beloring

赞同来自:

请上传源码,开头就有错误,不要误导人

xiaohuihui - 90后IT

赞同来自:

亲,你的串口接收采用DMA,你是怎样做到不丢帧的?

要回复问题请先登录注册