STM32F407单片机编程入门(十六) DMA详解及ADC-DMA方式采集含源码

文章目录

    • 一.概要
    • 二.STM32F407VET6单片机DMA外设特点
    • 三.STM32F407单片机DMA内部结构图
    • 四.DMA各通道请求
    • 五.STM32F407VET6单片机ADC-DMA采集例程
    • 六.工程源代码下载
    • 七.小结

一.概要

基本概念:
DMA是Direct Memory Access的首字母缩写,是一种完全由硬件执行数据交换的工作方式。DMA控制器从CPU接管对总线的控制,不经过CPU直接在内存和外设之间进行批量数据交换。DMA控制器向内存发出地址和控制信号,修改地址,对传送的字的个数计数,并且以中断方式向CPU报告传送操作的结束。 DMA方式一般用于高速传送成组数据。

DMA传输的三大要素:
传输源:DMA控制器从传输源读出数据;
传输目标:DMA控制器将数据传输的目标;
触发信号:用于触发一次数据传输的动作,执行一个单位的传输源至传输目标的数据传输;可以用来控制传输的时机。

DMA的主要优点:
由于CPU根本不参加传送操作,因此就省去了CPU取指令、取数、送数等操作。在数据传送过程中,没有保存现场、恢复现场之类的工作。内存地址修改、传送字个数的计数等等,也不是由软件实现,而是用硬件线路直接实现的。所以DMA方式能满足高速I/O设备的要求,也有利于CPU效率的发挥。

二.STM32F407VET6单片机DMA外设特点

● 双 AHB 主总线架构,一个用于存储器访问,另一个用于外设访问
● 仅支持 32 位访问的 AHB 从编程接口
● 每个 DMA 控制器有 8 个数据流,每个数据流有多达 8 个通道(或称请求)
● 每个数据流有单独的四级 32 位先进先出存储器缓冲区 (FIFO),可用于 FIFO 模式或直
接模式:
— FIFO 模式:可通过软件将阈值级别选取为 FIFO 大小的 1/4、1/2 或 3/4
— 直接模式
每个 DMA 请求会立即启动对存储器的传输。当在直接模式(禁止 FIFO)下将 DMA 请求配置为以存储器到外设模式传输数据时,DMA 仅会将一个数据从存储器预加载到内部 FIFO,从而确保一旦外设触发 DMA 请求时则立即传输数据。
● 通过硬件可以将每个数据流配置为:
— 支持外设到存储器、存储器到外设和存储器到存储器传输的常规通道
— 也支持在存储器方双缓冲的双缓冲区通道
● 8 个数据流中的每一个都连接到专用硬件 DMA 通道(请求)
● DMA 数据流请求之间的优先级可用软件编程(4 个级别:非常高、高、中、低),在软
件优先级相同的情况下可以通过硬件决定优先级(例如,请求 0 的优先级高于请求 1)
● 每个数据流也支持通过软件触发存储器到存储器的传输(仅限 DMA2 控制器)
● 可供每个数据流选择的通道请求多达 8 个。此选择可由软件配置,允许几个外设启动 DMA请求
● 要传输的数据项的数目可以由 DMA 控制器或外设管理:
— DMA 流控制器:要传输的数据项的数目是 1 到 65535,可用软件编程
— 外设流控制器:要传输的数据项的数目未知并由源或目标外设控制,这些外设通过
硬件发出传输结束的信号
● 独立的源和目标传输宽度(字节、半字、字):源和目标的数据宽度不相等时,DMA 自动封装/解封必要的传输数据来优化带宽。
● 每个数据流都支持循环缓冲区管理。
● 5 个事件标志(DMA 半传输、DMA 传输完成、DMA 传输错误、DMA FIFO 错误、直接
模式错误),进行逻辑或运算,从而产生每个数据流的单个中断请求。

三.STM32F407单片机DMA内部结构图

在这里插入图片描述

DMA控制器由4部分组成:

AHB 从接口配置DMA
AHB主接口进行数据传输
仲裁器进行DMA请求的优先级管理
数据处理和计数

四.DMA各通道请求

多个外设请求被映射到同一个DMA通道。这些请求信号在经过逻辑或后进入DMA。通过配置对应外设的寄存器,每个外设的请求均可以独立的开启或关闭。用户必须确保同一时间,在同一个通道上仅有一个外设的请求被开启。
在这里插入图片描述

在这里插入图片描述

以ADC1为例,可以映射到DMA2的Channel0

DMA的传输模式:

循环模式:用于处理一个环形的缓冲区,每轮传输结束时数据传输的配置会自动地更新为初始状态,DMA传输会连续不断地进行。 一般采用循环模式。
普通模式:在DMA传输结束时,DMA通道被自动关闭,进一步的DMA请求将不被满足。

外设到存储器传输数据流:
在这里插入图片描述

五.STM32F407VET6单片机ADC-DMA采集例程

STM32F407VET6开发板的PA4 引脚上的进行 ADC 电压采集,杜邦线连接 PA4 引脚与 VDD(3.3V),应该能读到单片机供电的电压值。
在这里插入图片描述

打开STM32CubeMX软件,新建工程
在这里插入图片描述
Part Number处输入STM32F407VE,再双击就创建新的工程
在这里插入图片描述

配置下载口引脚
在这里插入图片描述

配置外部晶振引脚
在这里插入图片描述

PA4,PA5引脚配置成ADC
在这里插入图片描述

DMA配置
在这里插入图片描述

中断使能
在这里插入图片描述

配置系统主频168Mhz,使用外部晶振
在这里插入图片描述

配置工程文件名,保存路径,KEIL5工程输出方式
在这里插入图片描述

生成工程
在这里插入图片描述

用Keil5打开工程
在这里插入图片描述

主要代码:

int ADCData;
uint16_t VolDta1,VolDta2;
__IO   uint16_t   aADCxConvertedData[2]; //存放2组数据,分别是ADC1_CH4,ADC1_CH5
__IO   uint8_t ubDmaTransferStatus = 2;//定义变量,在ADC采样结束,DMA传送完成置位,方便主程序取数据
//ADC数据采样结束回调函数,用于置位采样结束标志位void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef *hadc)
{/* Prevent unused argument(s) compilation warning */ubDmaTransferStatus=1;//置1
}
/* USER CODE END PFP *//* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 *//* USER CODE END 0 *//*** @brief  The application entry point.* @retval int*/
int main(void)
{/* USER CODE BEGIN 1 *//* USER CODE END 1 *//* MCU Configuration--------------------------------------------------------*//* Reset of all peripherals, Initializes the Flash interface and the Systick. */HAL_Init();/* USER CODE BEGIN Init *//* USER CODE END Init *//* Configure the system clock */SystemClock_Config();/* USER CODE BEGIN SysInit *//* USER CODE END SysInit *//* Initialize all configured peripherals */MX_GPIO_Init();MX_DMA_Init();MX_ADC1_Init();/* USER CODE BEGIN 2 */if (HAL_ADC_Start_DMA(&hadc1,(uint32_t *)aADCxConvertedData,2) != HAL_OK)//启动ADC DMA传输{/* ADC conversion start error */Error_Handler();} /* USER CODE END 2 *//* Infinite loop *//* USER CODE BEGIN WHILE */while (1){/* USER CODE END WHILE *//* USER CODE BEGIN 3 */if (ubDmaTransferStatus == 1)//判断数据是否已经转换完成{VolDta1=aADCxConvertedData[0]*3300/4095;//计算通道ADC1_Ch4采样到的电压值VolDta2=aADCxConvertedData[1]*3300/4095;//计算通道ADC1_Ch5采样到的电压值			ubDmaTransferStatus = 0;//完成标志清0}}/* USER CODE END 3 */
}

实验结果:
PA4引脚的电压值VolDta1为3296mV,PA5引脚的电压值VolDta2为3297mV。
在这里插入图片描述

六.工程源代码下载

通过网盘分享的文件:18.ADC_DMA实验.zip
链接: https://pan.baidu.com/s/1dxaaRYC9Bk7E5NJ2vWLhtg 提取码: hfn5
如果链接失效,可以联系博主给最新链接
程序下载下来之后解压就行

七.小结

使用DMA进行数据收发能够提高数据传输的效率和可靠性。其次,使用DMA进行串口数据收发可以减轻CPU的负担。

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

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

相关文章

Kali Linux 2024.3

新版本,新特性 Kali Linux 2024.3 版本带来了一系列新功能和优化改进,包括但不限于: 新增对高通骁龙 SDM845 芯片的支持:Kali NetHunter Pro 设备现在支持更多设备,提升了 Kali 移动渗透测试平台的兼容性和实用性 系统…

如何在openKylin中配置ssh服务并实现远程连接开放麒麟系统(1)

文章目录 前言1. 安装SSH服务2. 本地SSH连接测试3. openKylin安装Cpolar4. 配置 SSH公网地址5. 公网远程SSH连接6. 固定SSH公网地址7. SSH固定地址连接 前言 本文主要介绍如何在openKlyin系统中设置ssh连接,并结合cpolar内网穿透工具实现远程也可以ssh连接本地局域…

HTML+CSS学习笔记

目录 HTML 1.开发环境 2.创建HTML文件 3.HTML元素 3.1HTML文件结构 3.2HTML标签 3.3HTML属性​编辑​编辑 3.4HTML区块 3.4.1块元素 3.4.2行内元素 3.5HTML表单 CSS 1.CSS简介 2.CSS语法​编辑 3.CSS三种导入方式 内联样式 内部样式 外部样式 4.选择器​ 5.C…

【无人机设计与控制】基于蜣螂优化算法求解多无人机集群路径规划问题

摘要 本文基于蜣螂优化算法(Dung Beetle Optimization, DBO)研究了多无人机路径规划问题。目标是优化多无人机的飞行轨迹,在避免障碍物的同时,尽量减少能量消耗并保持集群内的通信。为提高搜索效率和准确性,对DBO进行…

国庆长假出游带什么好?这五款智能设备让你玩得更尽兴

随着国庆长假的临近,许多人已经开始规划他们的旅行计划,期待在这段时间里放松身心,享受假期的乐趣。然而,旅行不仅仅是关于目的地的美景和文化体验,它同样关乎旅途中的舒适度和便利性。在科技日新月异的今天&#xff0…

JAVA工具类

JAVA工具类_常用 下划线转驼峰POI 导出Excel工具类POI 导入Excel工具类下划线转驼峰 /*** 下划线转驼峰* 字符串 "USER_NAME" 会被转换为 "userName"* 字符串 "user_name" 会被转换为 "userName"* @param underscoreStr* @return*/pub…

五类ip地址的区别是什么

IP地址是用于唯一标识网络设备的数字标签,根据网络ID的不同,IP地址可以分为A类、B类、C类、D类和E类五类。本文将详细解析这五类IP地址的区别是什么,帮助读者更好地理解和应用IP地址。 一、A类IP地址 A类IP地址以0开头,其第一段号…

米壳AI:自媒体如何获取高清原画质!真8K视频是这样下载的!

作为一名新手自媒体博主,你是不是也在各种短视频平台上疯狂搜索保存外网视频的方法和软件呢?😃然而,真正能下载真 4K 视频的却寥寥无几。 别苦恼啦!今天我就来给大家分享一个小编亲测过后真实好用的工具 —— 米壳 AI。…

图解VMware通过NAT模式实现互联互通案例

一、概述 在VMware中安装虚拟主机,其中一项重要的任务就是实现互联连互通,达成以下目标: 虚拟主机实现能够随时上互联网。虚拟主机与宿主机之间互联访问。虚拟主机之间互联访问。 其实VMware不仅具有虚拟主机功能,还具有虚拟网络…

Windows X86 远线程注入问题解惑

🏆本文收录于《CSDN问答解惑-专业版》专栏,主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收…

一.python入门

gyp的读研日记,哈哈哈哈,🙂,从复习python开始, 目录 1.python入门 1.1 Python说明书 1.2 Python具备的功能 1.3 学习前提 1.4 何为Python 1.5 编程语言 2.Python环境搭建 2.1 开发环境概述 2.2 Python的安装与…

STM32F407ZGT6-HAL-FreeRTOS-信号量示例

本程序创建了一个二进制信号量,然后创建2个任务:一个用于释放信号量,另一个用于获取信号 量; 发送任务、接收任务的代码和执行流程如下: A:发送任务优先级高,先执行。连续3次释放二进制信号量&…

一文搞懂offset、client、scroll系列及案例

目录 一、offset 1-1、offset系列属性 1-2、offset与style区别 1-3、案例 1-3-1、计算鼠标在盒子内的坐标 1-3-2、拖动模态框 二、client 2-1、client系列属性 三、scroll 3-1、scroll系列属性 3-2、案例 3-2-1、滚动页面一定距离后固定侧边栏 一、offset offset是…

【WRF工具】服务器上使用conda安装NCL

【WRF工具】服务器上使用conda安装NCL NCL概述使用conda下载NCL安装conda安装NCL另:当使用NCL时,则需要激活ncl_stable环境 参考 NCL概述 NCAR Command Language(NCL) 是由美国大气研究中心(NCAR)推出的一…

Spring Boot 中实现任务后台处理的几种常见方式

​ 博客主页: 南来_北往 系列专栏:Spring Boot实战 前言 在现代应用程序中,后台处理对于处理发送电子邮件、处理文件、生成报告等任务至关重要。 Spring Boot 提供了多种机制来高效地实现后台任务。本文探讨了在 Spring Boot 中处理后台处理的各…

大数据新视界 --大数据大厂之 Vue.js 与大数据可视化:打造惊艳的数据界面

💖💖💖亲爱的朋友们,热烈欢迎你们来到 青云交的博客!能与你们在此邂逅,我满心欢喜,深感无比荣幸。在这个瞬息万变的时代,我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而 我的…

java节假日工具类,判断一个日期是否是法定节假日

java节假日工具类,判断一个日期是否是法定节假日 1.HolidayUtil工具类2.工具类生成的日期json文件3.结果展示 无需链接数据库,无需手写节假日集合列表 1.HolidayUtil工具类 import com.alibaba.fastjson.JSONObject; import com.fasterxml.jackson.data…

0-10V 电压转光纤

型号:MS-F155-VM(CE /ISO9001) 功能概述 MS-F155-VM是将0-10V电压转为光纤信号的模块,分发送和接收两个设备发送模块将电流或者电压信号转变为光信号,通过光纤传输,接收端将光信号还原为电流或者电压信号。可以延长通信…

2024源代码加密软件分享TOP10丨保护源代码安全很重要!

在如今的数字时代,源代码是企业的核心资产之一。无论是开发软件、应用程序,还是自动化系统,源代码都是技术的根基,决定了公司的核心竞争力。然而,源代码泄露或被盗可能会给企业带来巨大的安全风险和经济损失。因此&…

03-Docker下载加速

03-Docker下载加速 docker下载加速 方式1:使用 网易数帆、阿里云等容器镜像仓库进行下载。 网易数帆官网:https://sf.163.com/ 例如,下载网易数帆镜像中的mysql。(网易数帆的地址为 hub.c.163.com,网易数帆对dockerh…