STM32 DMA直接存储器存取

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

如果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通道也分优先级,可以自己设置;

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值