当前位置:网站首页>STM32——DMA
STM32——DMA
2022-07-31 04:48:00 【山、】
DMA(Direct Memory Access)即直接存储访问。
简单理解,DMA就是不占用CPU资源的数据传输模式。DMA 传输将数据从A地址空间复制到B地址空间,这个过程由 DMA 控制器来完成,CPU只需要把DMA进行初始化设置就可以了,在数据传输时不需要CPU参与。
使用DMA可以大大减轻CPU工作量,尤其是数据量非常大的时候。
比如从ADC或者串口来了3000个数据,CPU复制数据就需要进行3000次操作:
for(int i = 0;i < 3000;i++)
{
buf[i] = data;
}
虽然目前的CPU主频很高,3000个数据马上也能传输完成,但是在某些场合下这是不行的。在数据传输的这时间段,CPU只负责传输数据,十分浪费CPU资源。所以对于大容量数据传输这种情况其实不需要CPU一直参与,只需在A、B之间创建个通道,让它们自己传输即可。这就是DMA,一般对于大量数据转移都用DMA进行数据传输。
使用DMA,只需要提供两个地址和一个数据长度就可以了,目的地址和数据源地址,启动DMA后,DMA自动把数据从数据源地址搬运到目的地址。这样就解放了CPU,使得CPU可以去做其他更重要的事情。
DMA的数据搬运模式有下面三种:
1、内存到外设
2、外设到内存
3、内存到内存
DMA控制器:
从上图可以看到,DMA有八个数据流,每个数据流又有8个通道。
流:数据传输的链路,一次最大传输256KB数据。
通道:每个数据流都有8个通道选择,每个通道对应不同的DMA请求,比如ADC、DAC、串口等。
DMA请求映射:


DMA_SxCR设置DMA通道、数据流、优先级等设置
当多个DMA请求同时来的时候,DMA会通过DMA仲裁器觉决定先处理谁。
软件:DMA_SxCR的PL位决定。
硬件:数据流编号小的优先级高。
同一个数据流只能使用一个通道,同一个DMA控制器可以使用多个数据流。
DMA控制器中的FIFO可以简单认为是一块缓冲区,为数据源和目标之间提供以一个数据中转空间。
DMA数据搬运有直接模式、FIFO模式等。
直接模式就是数据到了FIFO直接传出去。
FIFO可以设置传进来几个字节后在传出去,如传进来4、8、12、16个字节后在开始传出
FIFO突发模式:看你的数据分几次发,一次发送、两次发送等等。
DMA相关结构体和初始化函数(基于标准库):
DMA初始化结构体DMA_ InitTypeDef:
typedef struct
{
uint32_t
uint32_t DMA_PeripheralBaseAddr; // 外设地址
uint32_t DMA_MemoryBaseAddr; // 存储器地址
uint32_t DMA_DIR; // 传输方向:内存到外设、外设到内存、内存到内存
uint32_t DMA_BufferSize; // 传输数目:传输数据的个数
uint32_t DMA_PeripheralInc; // 外设地址是否递增
uint32_t DMA_MemoryInc; // 存储器地址是否递增
uint32_t DMA_PeripheralDataSize; // 外设数据宽度
uint32_t DMA_MemoryDataSize; // 存储器数据宽度
uint32_t DMA_Mode; // 模式选择
uint32_t DMA_Priority; // 通道优先级
uint32_t DMA_M2M; // 存储器到存储器模式
} DMA_InitTypeDef;
源和目标的数据宽度一样,数据不会丢失
源小于目标宽度,数据不会丢失,但是会浪费目标内存
源大于目标宽度,数据会丢失,只以目标宽度接收数据
库函数:
初始化DMA的寄存器到复位状态:
DMA_DeInit(DMA_Stream_TypeDef* DMAy_Streamx);
DMA初始化:
void DMA_Init(DMA_Stream_TypeDef* DMAy_Streamx,DMA_InitTypeDef* DMA_InitStruct);
DMA使能函数:
MDA_Cmd(DMA_Stream_TypeDef* DMAy_Streamx,FunctionalState NewState);
边栏推荐
- ERP Production Operation Control Kingdee
- MySQL数据库增删改查(基础操作命令详解)
- npm、nrm两种方式查看源和切换镜像
- BUG destroyer!!Practical debugging skills are super comprehensive
- MATLAB/Simulink&&STM32CubeMX工具链完成基于模型的设计开发(MBD)(三)
- ERROR 1819 (HY000) Your password does not satisfy the current policy requirements
- Mysql应用安装后找不到my.ini文件
- MySQL修改root账号密码
- 剑指offer专项突击版第15天
- SOLVED: After accidentally uninstalling pip (two ways to manually install pip)
猜你喜欢

The Vue project connects to the MySQL database through node and implements addition, deletion, modification and query operations

Three oj questions on leetcode

Unity教程:URP渲染管线实战教程系列【1】

数字经济时代的开源数据库创新 | 2022开放原子全球开源峰会数据库分论坛圆满召开

手把手实现图片预览插件(三)

Heavyweight | The Open Atomic School Source Line activity was officially launched

Sun Wenlong, Secretary General of the Open Atom Open Source Foundation |

STM32HAL库修改Hal_Delay为us级延时

npm、nrm两种方式查看源和切换镜像

MySQL优化之慢日志查询
随机推荐
Heavyweight | The Open Atomic School Source Line activity was officially launched
npm、nrm两种方式查看源和切换镜像
[debug highlights] Expected input batch_size (1) to match target batch_size (0)
MySQL常见面试题汇总(建议收藏!!!)
马斯克对话“虚拟版”马斯克,脑机交互技术离我们有多远
ERP生产作业控制 金蝶
MySQL忘记密码怎么办
【C语言】操作符详解
input输入框展示两位小数之precision
ENSP,划分VLAN、静态路由,三层交换机综合配置
[Cloud Native] DevOps (5): Integrating Harbor
开放原子开源基金会秘书长孙文龙 | 凝心聚力,共拓开源
STM32HAL library modifies Hal_Delay to us-level delay
三道leetcode上的oj题
CentOS7 install MySQL graphic detailed tutorial
ENSP, VLAN division, static routing, comprehensive configuration of Layer 3 switches
The MySQL database installed configuration nanny level tutorial for 8.0.29 (for example) have hands
参考代码系列_1.各种语言的Hello World
MATLAB/Simulink&&STM32CubeMX工具链完成基于模型的设计开发(MBD)(三)
DVWA之SQL注入