打印

DMA可以外设到外设的原因

[复制链接]
8250|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
eng588|  楼主 | 2012-12-7 11:44 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
在ST网展上下了AN2548,上面说可以DMA可以直接外设到外设,也有个例子,把ADC的值直接用DMA发送到SPI上,DMA的初始化代码是这样的:
  DMA_InitStructure.DMA_PeripheralBaseAddr = ADC1_DR_Address;
  DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)&SPI1->DR;
  DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;
  DMA_InitStructure.DMA_BufferSize = 1;
  DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
  DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Disable;
  DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;
  DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;
  DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;
  DMA_InitStructure.DMA_Priority = DMA_Priority_VeryHigh;
  DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
  DMA_Init(DMA1_Channel1, &DMA_InitStructure);
在这里,SPI->DR被看作是存储器地址,而非外设地址。这让我有点糊涂,所有外设在DMA控制器看来都可以当存储器吗?
如果所有外设地址都可被看成存储器地址,那么这一句“DMA_InitStructure.DMA_M2M = DMA_M2M_Disable”又表示什么呢?
沙发
ukkara| | 2012-12-7 12:05 | 只看该作者
额,好问题,同求答案1

使用特权

评论回复
板凳
拿起书本| | 2012-12-7 14:31 | 只看该作者
没有验证过,我只是看到手册上没有提到外设与外设之间传输

使用特权

评论回复
地板
pattywu| | 2012-12-7 15:46 | 只看该作者
本帖最后由 pattywu 于 2012-12-7 15:53 编辑

    ST的DMA传输,只要对应通道上的事件有效,就会产生传输。
    而存储器对存储器的DMA传输,则不需要对应通道的事件(存储器对存储器的置位,就相当于相应通道的事件有效)。
    换言之,对应通道的事件有效和存储器对存储器的置位,就是传输的触发位。每次传输的事件置位一次,完成一次传输。如果是由外设引发的DMA传输,则传输完成后,相应传输事件会置为无效,而存储器对存储器的传输,则一次传输完成后,相应事件一直有效,直至完成设定的传输量。
    比如ADC的DMA传输,如果你设定的DMA传输的源地址不是ADC的数据寄存器,则传输一直进行下去,直至完成设定传输量。只有ADC的DMA传输的源地址是ADC的数据寄存器,一次ADC转化完成,ADC的DMA通道的传输事件有效,DMA从ADC的数据寄存器读出数据,写入目的地址(不管目的地址的内存,还是外设寄存器)。当DMA在读取ADC的数据寄存器时,同时使ADC的DMA通道传输事件无效。

使用特权

评论回复
5
byeyear| | 2012-12-7 19:34 | 只看该作者
本质上来说,DMA是“地址到地址”,所谓“外设到内存”或“内存到内存”都不过是更高级别的说法。
如果源地址是外设占着,目标地址是内存占着,那就是外设到内存;
如果源地址是外设占着,目标地址也是外设占着,那就是外设到外设。
所以,统共有M2M、P2P、M2P、P2M四种情况,但本质是一样的。
DMA_InitStructure.DMA_M2M = DMA_M2M_Disable这句话,如4#所说,是表示只有事件产生才传输一次数据。
ST有另外一个AN,是用TIM DMA来模拟外部DMA的。你可以结合着看。

使用特权

评论回复
6
uet_cache| | 2012-12-7 19:55 | 只看该作者
M2M是存储器之前的传输时用的吧,你用的是外设与外设,或者外设与存储器之间应该都不算M2M。

使用特权

评论回复
7
jildlfg| | 2016-12-22 13:01 | 只看该作者
还有一个区别就是M2M不能与循环模式同时使用。 但是不知道为啥,我试了一下貌似可以用。。


QQ截图20161222130050.png (296.72 KB )

QQ截图20161222130050.png

使用特权

评论回复
8
zchong| | 2016-12-22 20:30 | 只看该作者
jildlfg 发表于 2016-12-22 13:01
还有一个区别就是M2M不能与循环模式同时使用。 但是不知道为啥,我试了一下貌似可以用。。



m2m如果循环模式,岂不是永不停息

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:和平時期做牛馬,戰爭時期當炮灰

82

主题

179

帖子

0

粉丝