简介:
DMA(直接存储器访问),在传输数据的时候,可以不用使用CPU,因此适用与传输大量数据。
功能框图:
(1)DMA请求:
外设要使用DMA传输数据之前,必须发送DMA请求给DMA控制器,DMA控制器接收到请求后发送应答信号,外设收到应答信号后,就可以利用DMA传输数据了。
stm32f103zet6有两个DMA(DMA1 DMA2),其中DMA1有7个传输通道,DMA2有5个传输通道。
(2)通道:
DMA1 7个通道所连外设请求:
DMA2 5个通道所连外设请求:
(3)仲裁器:
当一个通道同时有多个DMA请求,此时就必须有仲裁器决定应答哪一个请求。
仲裁器先根据软件级别的请求优先级来决定应答哪一个请求。可以通过DMA_CCRx来设置软件优先级。
当软件级别无法决定时(有多个高优先级请求),再根据硬件级别的优先级(通道编号小的优先级高于通道编号大,DMA1的优先级大于DMA2)。
数据传输方向:
1.外设到存储器 :如 ADC数据寄存器的数据传输到我们定义的缓冲区中。
2.存储器到外设:如 将我们自定义的数据传输到串口上。
3.存储器到存储器: 如 将内部FLASH的数据复制到SRAM中。
在数据传输的时候要保证发送端跟接收端的数据宽度一致 如:串口发送/接收8位为基本单位的数据,那我们的接收/发送缓冲区的基本单位为8位(uint8_t).
DMA初始化结构体:
传输数目:表示要传输多少数据, 如:uint8_t buff[]="hello world!";此时打算将buff的数据传输到串口中,那么这时传输数目为sizeof(buff)/sizeof(uint8_t).
外设地址/存储器地址增量模式:表示是否传输一个数据,地址是否要自增。一般外设的地址不用增加,数组的地址要增加。上面的例子中串口不用增加,数组要增加
模式选择:一次传输模式还是循环传输模式。上面例子,如果我们要一直发送"hello world",此时选择循环模式。
原文:https://www.cnblogs.com/nwjlq/p/12925916.html