[STM32F1] STM32的DMA是模拟的,还是真正的?

[复制链接]
1546|8
 楼主| bear1 发表于 2014-9-29 15:17 来自手机 | 显示全部楼层 |阅读模式
真正的DMA是由硬件抢占总线后同时启动两端设备,在一个周期内这边读,那边写。但很多嵌入CPU内的DMA只是模拟而已,启动每一次DMA之前要做不少准备工作(设起始地址和长度等),在传输时往往是先读到芯片内暂存,然后再写出去,即搬一次数据需两个时钟周期,比软件来搬要快一些(不需要取指令,没有循环跳转等额外工作),但如果一次只搬几个字节,还要做一堆准备工作,一般还涉及函数调用,效率并不高。所以这种DMA只对大
数据块才适用。
aozima 发表于 2014-9-29 16:13 | 显示全部楼层
本帖最后由 aozima 于 2014-9-29 18:31 编辑

不管你理解的真正和模拟的是什么样的,DMA都只是适合大的数据块(也可以是非常慢的小数据块,如I2C)。

DMA主要用于慢速外设传输数据,所以DMA的性能只要高于外设的速度就可以了。
准备时间不要大于外设的超时即可(如UART的话只要在发送下一字节前DMA把数据搬来即可)。

DMA一次搬多少数据一般是由接收方决定的,比如没有FIFO的UART一次只能搬一字节,不管你DMA和CPU有多NB。
所以使用DRAM和CACHE的芯片上面,UART这类设备尽量要有FIFO,不然浪费挺大。

从数据手册的总线矩阵上面,DMA的数据搬运是master接口,所以应该属于“真正”的。
不见,你见过的“模拟”的DMA又是什么样的?
s_f_tan 发表于 2014-9-29 17:09 | 显示全部楼层
模拟的DMA好像没有见过
mmuuss586 发表于 2014-9-29 20:05 | 显示全部楼层
传输数据时,不用软件干预的,应该都算是DMA;
包括你说的模拟DMA,也算是DMA;
pattywu 发表于 2014-9-30 00:55 | 显示全部楼层
lz厉害,发明了模拟DMA这个名词。^_^
huzi2099 发表于 2014-9-30 01:48 | 显示全部楼层
对于某些情况还是有优势的,比如ADC,dma可以在ADC转换完成后自动发起传送,这样可以实现采样后自动刷新存储。可以设置dma循环在整块完成后再次刷新。
shdjdq 发表于 2014-9-30 10:06 | 显示全部楼层
DMA用的好,还是很有好处的。慢速的无所谓,当你是高速处理时,那边还有高速干扰,那时就分身无术了。
zitral 发表于 2014-9-30 10:24 | 显示全部楼层
最近被DMA弄的好头疼!LZ说的模拟的DMA应该是带点模仿的意思吧!不应该是区别于“数字”的“模拟”!
PIGYONG801 发表于 2014-9-30 13:37 | 显示全部楼层
我想不是模拟的,因在SLEEP时,DMA也在工作,只是为了避免总线冲突才有优先级
您需要登录后才可以回帖 登录 | 注册

本版积分规则

151

主题

970

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部