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