当前位置:网站首页>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);
边栏推荐
- Lua,ILRuntime, HybridCLR(wolong)/huatuo热更新对比分析
- 从零开始,一镜到底,纯净系统搭建除草机(Grasscutter)
- idea工程明明有依赖但是文件就是显示没有,Cannot resolve symbol ‘XXX‘
- HCIP Day 10_BGP Route Summary Experiment
- 手把手实现图片预览插件(三)
- [Cloud Native] DevOps (5): Integrating Harbor
- 论治理与创新 | 2022开放原子全球开源峰会OpenAnolis分论坛圆满召开
- Unity资源管理系列:Unity 框架如何做好资源管理
- ERROR 2003 (HY000) Can't connect to MySQL server on 'localhost3306' (10061)Solution
- 【wpf】wpf中的那些模板之深度解析
猜你喜欢

微信小程序使用云函数更新和添加云数据库嵌套数组元素

The third is the code to achieve

centos7安装mysql5.7

idea工程明明有依赖但是文件就是显示没有,Cannot resolve symbol ‘XXX‘

Interview | Cheng Li, CTO of Alibaba: Cloud + open source together form a credible foundation for the digital world

Unity手机游戏性能优化系列:针对CPU端的性能调优

论治理与创新 | 2022开放原子全球开源峰会OpenAnolis分论坛圆满召开

ERROR 1064 (42000) You have an error in your SQL syntax; check the manual that corresponds to your

STM32HAL library modifies Hal_Delay to us-level delay
![Unity Tutorial: URP Rendering Pipeline Practical Tutorial Series [1]](/img/7c/c9ab32bbf43b933e5f84f0d142f7bd.jpg)
Unity Tutorial: URP Rendering Pipeline Practical Tutorial Series [1]
随机推荐
[Cloud Native] DevOps (5): Integrating Harbor
ERROR 1064 (42000) You have an error in your SQL syntax; check the manual that corresponds to your
Hand in hand to realize the picture preview plug-in (3)
EasyExcel的简单读取操作
MATLAB/Simulink & & STM32CubeMX tool chain completes model-based design development (MBD) (three)
From scratch, a mirror to the end, a pure system builds a grasscutter (Grasscutter)
MySQL基础操作
MySQL事务隔离级别详解
sql语句-如何以一个表中的数据为条件据查询另一个表中的数据
MySQL to revise the root password
WeChat applet uses cloud functions to update and add cloud database nested array elements
mysql使用on duplicate key update批量更新数据
PWN ROP
Unity打灵狐者
Three oj questions on leetcode
Basic knowledge of mysql (2)
Solved (the latest version of selenium framework element positioning error) NameError: name 'By' is not defined
MySQL模糊查询可以使用INSTR替代LIKE
.NET-9.乱七八糟的理论笔记(概念,思想)
【R语言】【3】apply,tapply,lapply,sapply,mapply与par函数相关参数