【STM32F4】——DMA初始化结构体详解

news2024/9/24 15:25:34

在这里插入图片描述

一.DMA_InitTypeDef 初始化结构体

typedef struct
{
  uint32_t DMA_Channel;      		//通道选择     
  uint32_t DMA_PeripheralBaseAddr;//外设地址
  uint32_t DMA_Memory0BaseAddr;  //存储器 0 地址
  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_FIFOMode;         //FIFO 模式
  uint32_t DMA_FIFOThreshold;    //FIFO 阈值  
  uint32_t DMA_MemoryBurst;      //存储器突发传输  
  uint32_t DMA_PeripheralBurst;  //外设突发传输  
}DMA_InitTypeDef;

1、DMA_Channel:

DMA 请求通道选择,可选通道 0 至通道 7,每个外设对应固定的通道,具体设置值需要查表 DMA1 各个通道的请求映像 和表 DMA2 各个通道的请求映像 ;它设定 DMA_SxCR寄存器的 CHSEL[2:0] 位的值。

在这里插入图片描述

外设通道选择要解决的主要问题是决定哪一个外设作为该数据流的源地址或者目标地址。
DMA 请求映射情况参考表 DMA1 各个通道的请求映像 和表 DMA2 各个通道的请求映像 。
例如,我们使用模拟数字转换器 ADC3 规则采集 4 个输入通道的电压数据,查表 DMA2 各个通道的请求映像 可知使用通道 2。
在这里插入图片描述在这里插入图片描述

补充:DMA数据流

在这里插入图片描述

一个数据流会对应着8个通道选择,1个DAM拥有8 个 DMA 控制器数据流。每个外设请求都占用一个数据流通道,相同外设请求可以占用不同数据流通道。比如 SPI3_RX请求,即 SPI3 数据发送请求,占用 DMA1 的数据流 0 的通道 0,因此当我们使用该请求时,我们需要在把DMA_S0CR 寄存器的 CHSEL[2:0] 设置为“000”,此时相同数据流的其他通道不被选择,处于不可用状态,比如此时不能使用数据流 0 的通道 1 即 I2C1_RX 请求等等。
查阅表 DMA1 各个通道的请求映像 可以发现 SPI3_RX 请求不仅仅在数据流 0 的通道 0,同时数据流 2 的通道 0 也是 SPI3_RX 请求,实际上其他外设基本上都有两个对应数据流通道,这两个数据流通道都是可选的,这样设计是尽可能提供多个数据流同时使用情况选择。
配置DMA的数据流函数就是DMA的初始化函数:

//DMA1_Stream0:为DMA1的数据流0
DMA_Init(DMA1_Stream0, &DMA_InitStructure); //初始化DMA数据流

2、DMA_PeripheralBaseAddr:

外设地址。
例如: ADC3 转化的规则通道数据保存在数据寄存器ADC_DR中,其地址为 ((uint32_t)ADC3+0x4C)。ADC3是个宏定义,0x4C是寄存器的偏移量,可查阅数据手册。
在这里插入图片描述
注意:不同的传输模式对应的地址稍微有点变化,DMA_PeripheralBaseAddr:此变量配置的为DMA_SxPAR(x 为 0~7) 寄存器的值,根据模式的不同,可以作为源地址或者目标地址。
在这里插入图片描述

3、DMA_Memory0BaseAddr:

存储器地址。内容与上一个一样。

4、DMA_DIR:

数据传输方向,就是上面常说的外设到存储器存储器到外设存储器到存储器

在这里插入图片描述在这里插入图片描述在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

5、DMA_BufferSize:

设定待传输数据数目,根据自己的需求来设置,当传输完我们设定的数目值DMA才停止传输。例如:ADC要采集4个通道数据,所以待传输数目为4。
在这里插入图片描述

6、DMA_PeripheralInc:

外设地址自动递增
如果配置为 DMA_PeripheralInc_Enable,使能外设地址自动递增功能,它设定 DMA_SxCR 寄存器的 PINC 位的值;一般外设都是只有一个数据寄存器,所以一般不会使能该位。例如: ADC3 的数据寄存器地址是固定并且只有一个所以不使能外设地址递增。

7、DMA_MemoryInc:

存储器地址自动递增
如果配置为 DMA_MemoryInc_Enable,使能存储器地址自动递增功能,它设定 DMA_SxCR 寄存器的 MINC 位的值;我们自定义的存储区一般都是存放多个数据的,所以使能存储器地址自动递增功能。我们之前已经定义了一个包含 4 个元素的数字用来存放数据,使能存储区地址递增功能,自动把每个通道数据存放到对应数组元素内。

8、DMA_PeripheralDataSize:

外设数据宽度,可选字节 (8 位)、半字 (16 位) 和字 (32 位),它设定DMA_SxCR 寄存器的 PSIZE[1:0] 位的值。
例如:ADC 数据寄存器只有低 16 位数据有效,使用半字数据宽度

9、DMA_MemoryDataSize:

存储器数据宽度,可选字节 (8 位)、半字 (16 位) 和字 (32 位),它设定DMA_SxCR 寄存器的 MSIZE[1:0] 位的值。
例如:保存 ADC 转换数据也要使用半字数据宽度,这跟我们定义的数组是相对应的。

10、DMA_Mode:

DMA 传输模式选择,可选正常模式或者循环模式,它设定 DMA_SxCR 寄存器的 CIRC 位的值。
例如:ADC 采集可以是持续循环进行的,所以使用循环传输模式。
在这里插入图片描述

11、DMA_Priority:

软件设置数据流的优先级,有 4 个可选优先级分别为非常高、高、中和低,它设定 DMA_SxCR 寄存器的 PL[1:0] 位的值。
DMA 优先级只有在多个 DMA 数据流同时使用时才有意义,这里我们设置为非常高优先级就可以了。
拓展: ( 仲裁器管理数据流方法分为两个阶段。
第一阶段属于软件阶段,我们在配置数据流时可以通过寄存器设定它的优先级别,具体配置 DMA_SxCR 寄存器 PL[1:0] 位,可以设置为非常高、高、中和低四个级别。
第二阶段属于硬件阶段,如果两个或以上数据流软件设置优先级一样,则他们优先级取决于数据流编号,编号越低越具有优先权,比如数据流 2 优先级高于数据流 3。 )

12、DMA_FIFOMode:

FIFO 模式使能,如果设置为 DMA_FIFOMode_Enable 表示使能 FIFO 模式功能;它设定 DMA_SxFCR 寄存器的 DMDIS 位。FIFO 用于在源数据传输到目标地址之前临时存放这些数据。可以通过 DMA 数据流 xFIFO 控制寄存器 DMA_SxFCR 的 FTH[1:0] 位来控制 FIFO 的阈值,分别为 1/4、 1/2、 3/4 和满。如果数据存储量达到阈值级别时, FIFO 内容将传输到目标中。
如果设置为 DMA_FIFOMode_Disable表示使能直接模式功能,在直接模式下,如果 DMA 配置为存储器到外设传输数据时, DMA 会将一个数据从存储器预加载到内部 FIFO,从而确保一旦外设触发 DMA 请求时则立即传输数据。为了避免 FIFO 饱和,建议使用高优先级配置相应的数据流。
(在存储器到存储器模式配置下不能使用直接模式。)

例如: ADC 采集传输使用直接传输模式即可,不需要使用 FIFO 模式。

13、DMA_FIFOThreshold:

FIFO 阈值选择,可选 4 种状态分别为 FIFO 容量的 1/4、 1/2、 3/4 和满;它设定 DMA_SxFCR 寄存器的 FTH[1:0] 位。
DMA_FIFOMode 设置为 DMA_FIFOMode_Disable,那 DMA_FIFOThreshold 值无效。ADC 采集传输不使用 FIFO 模式,设置该值无效。
(FIFO 对于要求源地址和目标地址数据宽度不同时非常有用,比如源数据是源源不断的字节数据,而目标地址要求输出字宽度的数据,即在实现数据传输时同时把原来 4 个 8 位字节的数据拼凑成一个 32 位字数据。此时使用 FIFO 功能先把数据缓存起来,分别根据需要输出数据。)
在这里插入图片描述

14、DMA_MemoryBurst:

存储器突发模式选择,可选单次模式、 4 节拍的增量突发模式、 8 节拍的增量突发模式或 16 节拍的增量突发模式,它设定 DMA_SxCR 寄存器的 MBURST[1:0] 位的值。
例如:ADC 采集传输是直接模式,要求使用单次模式。
拓展:突发传输就是用非常短时间结合非常高数据信号率传输数据,相对正常传输速度,突发传输就是在传输阶段把速度瞬间提高,实现高速传输,在数据传输完成后恢复正常速度,有点类似达到数据块“秒传”效果。为达到这个效果突发传输过程要占用 AHB 总线,保证要求每个数据项在传输过程不被分割,这样一次性把数据全部传输完才释放 AHB 总线;而单次传输时必须通过 AHB 的总线仲裁多次控制才传输完成。

15、DMA_PeripheralBurst:

外设突发模式选择,可选单次模式、 4 节拍的增量突发模式、 8 节拍的增量突发模式或 16 节拍的增量突发模式,它设定 DMA_SxCR 寄存器的 PBURST[1:0] 位的值。
例如:ADC 采集传输是直接模式,要求使用单次模式。
在这里插入图片描述## 15、DMA_PeripheralBurst:

二.DMA相关库函数

/* Optional Configuration functions ***************** 可选配功能**************************/

void DMA_PeriphIncOffsetSizeConfig(DMA_Stream_TypeDef* DMAy_Streamx, uint32_t DMA_Pincos);

//配置外设增量偏移量
DMA_PINCOS_Psize :用于计算外设地址的偏移量与 PSIZE 相关,
DMA_PINCOS_WordAligned:用于计算外设地址的偏移量固定为 4( 32 位对齐)。

void DMA_FlowControllerConfig(DMA_Stream_TypeDef* DMAy_Streamx, uint32_t DMA_FlowCtrl);

//配置外设流控制器
DMA_FlowCtrl_Memory:DMA 是流控制器
DMA_FlowCtrl_Peripheral:外设是流控制器

/* Data Counter functions ******************* 数据计数器功能**********************************/

void DMA_SetCurrDataCounter(DMA_Stream_TypeDef* DMAy_Streamx, uint16_t Counter);

//设置DMA 数据流 x 要传输的数据项数目

uint16_t DMA_GetCurrDataCounter(DMA_Stream_TypeDef* DMAy_Streamx);

//读取DMA 数据流 x 要传输的数据项数目

/* Double Buffer mode functions *** ******** 双缓冲模式函数 *********/

void DMA_DoubleBufferModeConfig(DMA_Stream_TypeDef* DMAy_Streamx, uint32_t Memory1BaseAddr,
                                uint32_t DMA_CurrentMemory);

//在禁用DMAy Streamx时,配置双缓冲区模式和当前内存目标。

void DMA_DoubleBufferModeCmd(DMA_Stream_TypeDef* DMAy_Streamx, FunctionalState NewState);

//启用或禁用所选DMA流的双缓冲区模式

void DMA_MemoryTargetConfig(DMA_Stream_TypeDef* DMAy_Streamx, uint32_t MemoryBaseAddr,
                            uint32_t DMA_MemoryTarget);

//在双缓冲区模式下(动态使用)为下一次缓冲区传输配置内存地址。当启用DMA流和传输正在进行时,可以调用此函数。

uint32_t DMA_GetCurrentMemoryTarget(DMA_Stream_TypeDef* DMAy_Streamx);

//返回双缓冲区传输所使用的当前内存目标。

/* Interrupts and flags management functions **********************************/

FunctionalState DMA_GetCmdStatus(DMA_Stream_TypeDef* DMAy_Streamx);

//读取DMAy_Streamx的使能状态。

uint32_t DMA_GetFIFOStatus(DMA_Stream_TypeDef* DMAy_Streamx);

//读取FIFO的存放状态

FlagStatus DMA_GetFlagStatus(DMA_Stream_TypeDef* DMAy_Streamx, uint32_t DMA_FLAG);

//检查指定的DMAyStreamx标记是否设置。

void DMA_ClearFlag(DMA_Stream_TypeDef* DMAy_Streamx, uint32_t DMA_FLAG);

清除DMAy Streamx的中断标志位。

void DMA_ITConfig(DMA_Stream_TypeDef* DMAy_Streamx, uint32_t DMA_IT, FunctionalState NewState);

//启用或禁用指定的DMAyStreamx中断。

ITStatus DMA_GetITStatus(DMA_Stream_TypeDef* DMAy_Streamx, uint32_t DMA_IT);

//检查是否发生了指定的DMAy Streamx中断

void DMA_ClearITPendingBit(DMA_Stream_TypeDef* DMAy_Streamx, uint32_t DMA_IT);

//清除DMAyStreamx的指定的中断等待位。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2046385.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

售后服务认证的价值:权威认证带来的全方位优势

在当今竞争激烈的市场环境中,企业要想脱颖而出,不仅仅需要过硬的产品质量,更需要卓越的售后服务。售后服务认证作为一种权威认证,正日益成为企业在全国范围内展示服务领先性的关键工具。本文将详细阐述售后服务认证所带来的多重价…

virtualbox 安装 win7 系统注意事项

win7可用ISO镜像 virtualbox安装Windows 7 64位旗舰版 (包含镜像文件)_virtual pc安装64位windows7-CSDN博客 视图设为了自动缩放,没有菜单了怎么办? 通过按右侧CtrlC/F/L进行切换 复制黏贴不公用怎么办? 宿主机有…

《计算机组成原理》(第3版)第10章 控制单元的设计 复习笔记

第10章 控制单元的设计 一、组合逻辑设计 (一)组合逻辑控制单元框图 简化的控制单元框图,如图10-1所示。 图10-1 带译码和节拍输入的控制单元框图 (二)微操作的节拍安排 安排微操作节拍时应注意以下3点&#xff1a…

OpenCv学习-python

一.OpenCv介绍 简介 OpenCV(Open Source Computer Vision Library:opencv官网地址)是一个开源的基于BSD许可的库,它包括数百种计算机视觉算法。文档OpenCV 2.x API描述的是C API,相对还有一个基于C语言的OpenCV 1.x API&#xf…

生成式人工智能服务大模型——安全评估要求

(推荐性条款是指能愿动词为“宜”或“不宜”的条款)正式稿许多调整有调整。 自行开展安全评估的,评估报告应至少具有三名负责人共同签字。 单位法定代表人(表述更正)。 整体负责安全评估工作的负责人,应为单…

多串口互传指令代码遇到的问题

1.首先是字节格式,因为串口底层是一字节一字节的传输,所以每个要传输的字符与16进制数都要经过设计一定要保证是一字节一字节的发送 下面是把字符串拆分成字节一个一个发送示例 void Serial_SendString(char *String) {uint8_t i;for (i 0; String[i]…

泛微OA流程监控设置

泛微OA的流程监控设置问题 简单介绍 给流程设置监控主要是为了对系统中流转的流程进行相应的监控,例如对流程进行流程干预、强制归档、删除、查看等操作 如何设置 监控设置这个需要有相应后台权限账号的用户进行设置,进入流程引擎----->监控管理-…

用uniapp写app,想要打包后横屏显示的方法

在网络上找了很多方法,打包之后都没什么用,该竖屏还是竖屏,挺无语的,最后试了一种方法才解决了打包后也横屏显示的方法 在 pages.json 文件中: "pageOrientation": "auto" 这一条属性即可 设置…

可视化大屏适不适合组件化?报表类的很适合,数字孪生也可以

有小伙伴们问,可视化大屏能不能组件化,其实没问题的,而且已经很常见 也很成熟了,比如一些报表软件,把组件拖到画布上,设置一下,对接一下数据源,很快就做好了。 即便在UI设计环节&am…

【docker】docker资源管理

docker资源管理 docker cpu管理 Docker提供了多种方式来管理容器的CPU使用情况,包括以下几种方法: CPU限制:使用--cpus参数可以限制容器使用的CPU核心数。例如,docker run --cpus 2将限制容器使用2个CPU核心。CPU共享&#xff…

iPhone如何全选删除照片:一步到位的清理指南

随着时间的推移,iPhone中的照片会迅速累积,最终可能占据大量的存储空间。无论是为了释放空间,还是整理照片库,iPhone如何全选删除照片成为许多用户的需求。然而,iPhone原生的“照片”应用并没有直接提供“全选删除”功…

软考学习笔记(0):软考准备

文章目录 前言软考的优点软考项目的选择资料选择时间安排 前言 最近因为某些原因,我又开始上班了。新工作是纯内网开发,那以后发博客的频率我估计就会很少了。 软考的优点 简单来说,软考考上了,大概一个月的薪资可以涨1000-300…

使用JvisualVM 连接linux远程服务器

一、添加配置 在 java 启动参数中添加如下配置 -Dcom.sun.management.jmxremotetrue -Djava.rmi.server.hostname服务器IP(公网) -Dcom.sun.management.jmxremote.port端口号 -Dcom.sun.management.jmxremote.sslfalse -Dcom.sun.management.jmxremote.authenticatefalse添加…

树莓派智能语音助手之ASR2 – sherpa-ncnn

前几天虽然让树莓派学会了“听”(《树莓派智能语音助手之ASR – SpeechRecognitionPocketSphinx》),但是,PocketSphinx的识别效果真心不咋的。可我的树莓派因为系统等原因,一直装不了sherpa-onnx。正当我只能无奈地接受…

Windows配置开机直达桌面并跳过锁屏登录界面在 Windows 10 中添加在启动时自动运行的应用

目录 Win10开机直达桌面并跳过锁屏登录界面修改组策略修改注册表跳过登录界面 在 Windows 10 中添加在启动时自动运行的应用设置系统级别服务一、Windows下使用sc将应用程序设置为系统服务1. 什么是sc命令?2. sc命令的基本语法3. 创建Windows服务的步骤与示例创建服…

spring boot同时连接两个数据库

一、需求说明 1. 项目要求同时操作两个数据库&#xff0c;一个在本地服务器&#xff0c;一个在云服务器。 2. 两个数据库均为SQL server数据库。 二、实现 1. 在pom中导入多数据源依赖 <dependency><groupId>com.baomidou</groupId><artifactId>dynam…

【Kubernetes】身份认证与鉴权

一&#xff0c;认证 所有 Kubernetes 集群有两类用户&#xff1a;由Kubernetes管理的ServiceAccounts(服务账户)和(Users Accounts)普通账户。 两种账户的区别&#xff1a; 普通帐户是针对(人)用户的&#xff0c;服务账户针对Pod进程普通帐户是全局性。在集群所有namespaces…

ansible安装K8s

部署Kubernetes (k8s) 集群使用Ansible是一个常见的自动化解决方案。下面我将提供一个基本的步骤概述和所需的命令&#xff0c;用于在CentOS 7.8上使用Ansible部署k8s集群&#xff0c;包括Master节点和Worker节点&#xff08;Web和DB节点&#xff09;。 步骤 1: 准备环境 确保所…

# 利刃出鞘_Tomcat 核心原理解析(七)

利刃出鞘_Tomcat 核心原理解析&#xff08;七&#xff09; 一、Tomcat专题 - Tomcat管理配置 - host-manager 1、Tomcat 管理配置 从早期的Tomcat版本开始&#xff0c;就提供了Web版的管理控制台&#xff0c;他们是两个独立的Web应用&#xff0c;位于webapps目录下。Tomcat …

C语言典型例题40

《C程序设计教程&#xff08;第四版&#xff09;——谭浩强》 题目 例题3.8 运输公司对用户计算运费。路程&#xff08;以s表示&#xff0c;单位为千米&#xff09;&#xff0c;吨/千米运费越低。标准如下&#xff1a; s<250 没…