打印
[应用相关]

STM32 DMA直接存储器存取

[复制链接]
264|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
tpgf|  楼主 | 2024-10-14 17:17 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式



所谓通道,就是数据转运的路径,数据从一个地方转移到另一个地方,就需要占用一个通道,如果有多个通道进行转运,他们之间可以各转各的,互不干扰

如果DMA实现的是存储器到存储器之间的转运,比如:把flash的数据转运到SRAM中取,可以使用软件触发,DMA就会一股脑的把这批数据,以最快的速度,全部转运完成。但是如果是外设到存储器的转运,那就不能轻易的软件触发了,因为外设的数据转运是有一定时机的,所以这时常用硬件触发, 比如ADC的数据,就得等ADC每个通道完成AD转换后,硬件触发以此DMA,之后DMA开始转运,触发一次,转运一次。

故存储器到存储器之间的转运,一般用软件触发,外设到存储器之间的转运,一般用硬件触发

注意是:特定的硬件通道,每个DMA的通道,他的硬件触发源不一样,你要使用某个外设的硬件触发源,就得连接相对应的通道,不能够任意选择一个通道

存储器映像:






这里可以看成 cpu和存储器两个东西,flash是主闪存,SRAM是运行内存,各个外设也都可以看成是寄存器,也是一种SRAM存储器

寄存器是一种特殊的存储器,一方面cpu可以对寄存器进行读写,就像读写运行内存一样,另一方面,寄存器的背后都链接以一根导线,用于控制外设电路的状态,比如置引脚的高低电平,导通和断开开关,切换数据选择器等,所以说寄存器是软件和硬件之间的桥梁,软件控制寄存器就相当于是控制硬件的执行

DMA进行数据转运可以看成是,从某个地址取数据,在放到另一个地址去。

上面的框图中,左边是主动单元,右边是被动单元,被动单元的存储器只能主动单元来读写,主动单元这里,内核有Dcode和系统总线,可以访问右边的存储器,其中Dcode是专门访问flash的,系统总线是访问其他东西的。   由于DMA也要访问数据,所以DMA也需要有访问权,所以主动单元中除了内核cpu,就剩下DMA总线了。

DMA下方有个仲裁器,虽然DMA多个通道可以同时转运数据,但是DMA总线只有一条,他们需要分时复用这一条总线,如果产生了冲突,那么就会由仲裁器,来根据通道的优先级来分配使用顺序。  在总线矩阵里也会有一个仲裁器,如果DMA和CPU同时访问一个目标,那么DMA就会暂停CPU的访问,以防止冲突,不过总线仲裁器,仍然会保证cpu获得一半的总线带宽,保证其工作

DMA即是总线矩阵上的主动单元,可以读写各种寄存器,也可以AHB总线上的被动单元,CPU可以通过AHB来配置DMA;

上图中的DMA请求,就是DMA触发源,各个外设 ,比如ADC转换完成,串口接收到数据,需要触发DMA的时候,就会通过DMA请求线路,来向DMA发出硬件触发信号,之后dma就可以执行转运数据的工作了





DMA进行转运数据,是可以从外设到存储器或这存储器到外设的,有一个方向参数,可以控制

起始地址决定了从哪里来去那里去,数据宽度指定数据的大小,地址是否自增

外设寄存器也可以放存储器的地址,来实现存储器和存储器之间的数据转运。

传输计数器是一个自减计数器,每传输一次,计数器减一,当计数器为0后,DMA停止转运,另外,当减到0之后,之前自增的地址,也会恢复到起始地址的位置,以方便之后DMA开始新一轮的转运

传输计数器的右边是自动重装器,决定了转运的模式,是否重装,决定是否是单次模式还是循环模式

DMA的触发模式由M2M来决定,软件触发不能和自动重装器一块使用,硬件触发常和外设有关,在一定的时机使用

开关控制:一是DMA_Cmd使能,二是输出计数器必须大于0;3;必须由触发源,写传输计算器时,必须在DMA关闭时进行,不能运行中写输出计数器



DMA通道也分优先级,可以自己设置;



对于不同大小的数据传输,取舍看上标(不够就补零,超了舍弃高位)
————————————————

                            版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

原文链接:https://blog.csdn.net/Hidden_the_past/article/details/142792538

使用特权

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

本版积分规则

1867

主题

15482

帖子

11

粉丝