I2C是通讯协议,就是MCU对外用来通讯的。和USART,SPI,CAN这种一样,而dma是MCU内部的一个功能部件,叫直接存储器访问,用于外设和存储器或者存储器与存储器之间的数据传输。DMA的目的是在无需CPU控制的情况下快速移动数据。

举个例子,我刚做的一个应用。CPU先控制ADC进行采样,然后将采样数据发送给上位机。那我CPU和上位机之间就是通过串口进行连接,DMA没有办法连接到外面。然后我由于采样频率特别高,然后我采集到的数据还得计算,这样的话,整个流程就是:采集数据—处理数据—传输数据,这样循环。前面说了,我这个频率特别高,那这样一个流程下来是需要时间的,频率就受限制了。那这时候我就使用DMA,在处理数据之后,数据保存在flash中,这时候传输数据就可以用DMA来控制,DMA从flash中取出数据,放到USART的发送缓存中,这样就不用CPU进行控制了,CPU就处理完数据后返回采集数据就行,就能有效提高频率。

一般DMA可以配合I2C,SPI,USART等等进行操作,也可以脱离这些,单纯从一块flash搬运到另一块flash,DMA的主要目的是减少CPU的参与,使CPU有更多时间去做别的事。DMA就一控制器,没有办法与外部进行连接。