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

在这里插入图片描述

一.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.rhkb.cn/news/402093.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

opencascade Adaptor3d_CurveOnSurface源码学习

opencascade Adaptor3d_CurveOnSurface 前言 用于连接由Geom包中表面上的曲线提供的服务,以及使用这条曲线的算法所要求的服务。该曲线被定义为一个二维曲线,来自Geom2d包,位于表面的参数空间中 方法 1 默认构造函数 Standard_EXPORT Ada…

Windows设置定时任务进行oracle数据库备份

先找到“定时任务计划” 方法1.开始->所有程序->附件->系统工具->定时任务计划 方法2:控制面板->输入计划 进行查询操作 名称随便定,点击下一步 下一步 设置每天的定时执行时间,点下一步 点下一步选择启动程序,点下一步 点…

Lesson 64 Don‘t ... You mustn‘t ...

Lesson 64 Don’t … You mustn’t … 词汇 play n. 戏剧(真人演的,话剧)v. 玩耍 搭配:play with 物体 / 人    玩…… / 和……一起玩 例句:我正在和Leo玩。    I am playing with Leo.演奏(乐器…

ddos造成服务器瘫痪后怎么办

在服务器遭受DDoS攻击后,应立即采取相应措施,包括加强服务器安全、使用CDN和DDoS防御服务来减轻攻击的影响。rak小编为您整理发布ddos造成服务器瘫痪后怎么办。 当DDoS攻击发生时,首先要做的是清理恶意流量。可以通过云服务提供商提供的防护措…

初步融合snowboy+pyttsx3+espeak+sherpa-ncnn的python代码

在前文《将Snowboy语音唤醒的“叮”一声改成自定义语言》中,我已经实现唤醒snowboy后,树莓派会说一句自定义文本。今天,会在此基础上增加ASR的应用(基于sherpa-ncnn)。 首先,编写一个asr.py的程序&#xf…

@DateTimeFormat 和 @JsonFormat 注解详解

目录 一、快速入门1.1 准备工作1.2、入参格式化(前端传参到后端)1.3、出参格式化(后端返回给前端)1.4、如果是请求体RequestBody传参 二、详细解释这两个注解1、JsonFormat2、DateTimeFormat注意:1、这两者的注解一般联…

大型、复杂、逼真的安全服和安全帽检测:SFCHD数据集和SCALE方法

智能守护工地安全:SFCHD数据集与SCALE模块介绍 在人工智能(AI)技术飞速发展的今天,其在建筑工地安全领域的应用正逐渐展现出巨大潜力。尤其是高风险行业如化工厂的施工现场,对工人的保护措施要求极为严格。个人防护装…

Vue 生命周期详解含demo、面试常问问题案例

Vue 生命周期详解、面试常问问题案例 含 demo 文章目录 Vue 生命周期详解、面试常问问题案例 含 demo一、Vue 生命周期是什么二、Vue 中如何使用生命周期钩子1. **beforeCreate**2. **created**3. **beforeMount**4. **mounted**5. **beforeUpdate**6. **updated**7. **beforeD…

使用Arduino IDE生成带有bootloader的烧录文件

使用Arduino IDE生成bin(烧录)文件 1、在“项目”中,选择“导出已编译的二进制文件” 2、在工程目录中,会出现“build”文件夹 3、在build文件夹中,有hex文件,以及包含bootloader的bin和hex文件 bin和h…

小程序营销实战:利用小程序实现精准营销与增长

小程序营销实战:利用小程序实现精准营销与增长 在数字化营销日益重要的今天,小程序以其轻量、便捷的特点,成为了企业实现精准营销与增长的重要工具。本文将从策略规划、用户洞察、内容创新、技术应用以及数据分析等多个维度,特别…

Element-01.快速入门

1.什么是Element 2.快速入门 第二步引入ElementUI组件库,在当前的工程目录下的main.js文件中引入。 import Vue from vue; import ElementUI from element-ui; import element-ui/lib/theme-chalk/index.css; import App from ./App.vue;Vue.use(ElementUI); 第一…

Python深度学习框架库之caffe使用详解

概要 Caffe 是一个由伯克利视觉与学习中心(BVLC)开发的深度学习框架,以其速度快、模块化设计和社区支持而闻名。Caffe 适用于视觉识别任务,广泛应用于学术研究和产业实践中。Caffe 提供了一个强大的 Python 接口,使开发者能够方便地使用 Python 进行深度学习模型的开发和…

前端实现签字效果+合同展示

要做一个这样的功能,后端返回一个合同的整体html,前端进行签字,以下是一些重要思路! 获取一个高度会变的元素的高度 script 代码 let bigBoxHeight ref(0); // 获取到元素 let bigBox document.querySelector(".bigBox&…

催收业务怎么提高接通率

提高催收呼叫业务的接通率是一个综合性的任务,需要从多个方面进行优化。以下是一些具体的策略和建议: 一、优化呼叫时间与频次 1. 选择合适的呼叫时间:通过分析目标客户的活跃时段,选择他们最可能接听电话的时间进行呼叫…

用python的Manim 创建大括号

Brace 是 Manim 中用于创建大括号(curly braces)的一个对象类。它有几个子类,自定义了不同的功能。下面是每个类的简要解释: 1. ArcBrace 功能: 创建一个环绕弧线的括号。适用于需要围绕弧形线条的场景。用法: 通常用于图形中有…

【安卓】Service生命周期与前台活动

文章目录 Service生命周期使用前台Service 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。 点击跳转到网站。 Service生命周期 在项目的任何位置调用了Context的startService()方法,相应的Se…

8/16 机器学习之逻辑回归

逻辑回归看起来是分类问题,但实际上还是建立数学函数模型计算最小化损失函数。 这里的模型就是根据数学知识建立其对应的概率函数

go注册到eureka微服务

// 注册到 Eureka,goeureka会自动30秒发送一次心跳 package mainimport ("fmt""github.com/SimonWang00/goeureka""github.com/gin-gonic/gin""github.com/robfig/cron/v3""time""wbGo/configs" )typ…

TCP机械臂测试

通过w(红色臂角度增大)s(红色臂角度减小)d(蓝色臂角度增大)a(蓝色臂角度减小)按键控制机械臂 注意:关闭计算机的杀毒软件,电脑管家,防火墙 1)基于TCP服务器的机械臂,端口号是8888,ip是Windows的ip; 查看Windows的IP:按住Windowsr按键,输入cmd,输入ipconfig 2)点击软件中的开启监…

KubernetesMonitoring

监控集群中应用 监控集群本身 Control-Plane Components(api-server,coredns,kube-scheduler)Kubelet(cAdvisor)-暴露容器metricsKube-state-metrics-集群层面metrics(deployments,pods metrics)Node-exporter-Host相关metrics(cpu,mem,netw…