STM32F103RB多通道ADC转换功能实现(DMA)

目录

概述

1 硬件

1.1 硬件实物介绍

1.2 nucleo-f103rb

1.3 软件版本

2 软件实现

2.1 STM32Cube配置参数

 2.2 项目代码

3 功能代码实现

3.1 ADC功能函数

3.2 函数调用

4  测试

4.1 DMA配置data width:byte

4.2  DMA配置data width:Half word 

4.3  DMA配置data width: word 


源代码下载地址:

STM32F103RB多通道ADC转换功能实现(DMA)资源-CSDN文库

概述

本文主要介绍使用STM32F103RB实现多通道数据转换的功能,采用DMA方式,每个模拟通道对应一个DMA channel,实现高速的数据模数转换功能。还验证了配置DMA的数据宽度对输出数据的影响。

1 硬件

1.1 硬件实物介绍

STM32 Nucleo-64板基于MB1136参考板(NUCLEO-F030R8,Nucleo-f070rb, nucleo-f072rb, nucleo-f091rc, nucleo-f103rb,Nucleo-f302r8, nucleo-f303re, nucleo-f334r8, nucleo-f401re
Nucleo-f410rb, nucleo-f411re, nucleo-f446re, nucleo - 1010rb,Nucleo-l053r8, nucleo-l073rz, nucleo-l152re, nucleo-l452re,NUCLEO-L476RG)为用户提供了一种经济实惠且灵活的方式来尝试新概念并使用LQFP64封装中的STM32微控制器构建原型,选择从性能、功耗和特性的各种组合中。的ARDUINO®Uno V3连接支持和ST morpho头提供了一个简单的扩展了Nucleo开放开发平台的功能选择专门的盾牌。STM32 Nucleo板不需要任何单独的探头因为它们集成了ST-LINK/V2-1调试器和编程器。STM32 Nucleo板提供全面的免费软件库和示例STM32Cube MCU封装,以及直接访问Arm®Mbed™在线资源在http://mbed.org/上。

1.2 nucleo-f103rb

笔者选择CN8接口,实现多通道的ADC转换功能。其接口定义如下:

1.3 软件版本

软硬件信息版本信息
STM32 MCUSTM32F103RB
KeilMDK ARM 5.38
调试工具:st-linkST-LINK/V2-1
STM32CubeProgrammerv2.16.0

2 软件实现

2.1 STM32Cube配置参数

1)ADC端口配置,选择ADC1,同时使能DMA功能

ADC chanel 对应的端口 

2)使能ADC的DMA通道中断

3)DMA通道数选择,总共使能6个channel,那么DMA数据buff需要配置6个长度的数组

4) 采样数据模式选择

 2.2 项目代码

完成参数配置之后,使用GENERATE PROJECT 生成项目,打开项目文件如下:

3 功能代码实现

 3.1 ADC功能函数

STM32Cube生成的代码已经完成ADC和DMA的初始化工作,要启动ADC的数据转换功能,只需调用启动函数即可。本文主要介绍使用DMA的方式启动ADC数据转换该功能。

笔者专门编写一个函数用于启动ADC功能

代码第24行:  定义ADC的通道总数

代码第29行:  启动ADC转换标定功能

代码第30行:  启动DAM方式数据转换功能。

源代码函数如下:

/* USER CODE BEGIN 0 */
#define TOTAL_CHANNEL        6static uint16_t adcDMAValue[TOTAL_CHANNEL];
void ADC_ConvInit( ADC_HandleTypeDef* hadc )
{HAL_ADCEx_Calibration_Start(&hadc1); HAL_ADC_Start_DMA(hadc, (uint32_t*)adcDMAValue, TOTAL_CHANNEL);
}/* USER CODE END 0 */

3.2 函数调用

在MX_ADC1_Init函数,已经完成了ADC模块的初始化,如果打算启动ADC功能,只需在MX_ADC1_Init的尾部调用ADC_ConvInit函数实现ADC的启动。

4  测试

4.1 DMA配置data width:byte

在STM32Cube中配置如下参数

DMA通道buff配置如下:

生成代码下载到板卡中运行

DMA采集数据buff数据字节数

#define TOTAL_CHANNEL        6

static uint16_t adcDMAValue[TOTAL_CHANNEL];

根据仿真数据可知:

adcDMAValue[0]: 

                       ch0:  (byte)adcDMAValue[0],   

                       ch1:  (byte)(adcDMAValue[0]>>8),   

adcDMAValue[1]: 

                       ch2:  (byte)adcDMAValue[1],   

                       ch3:  (byte)(adcDMAValue[1]>>8),   

adcDMAValue[2]: 

                       ch4:  (byte)adcDMAValue[2],   

                       ch5:  (byte)(adcDMAValue[2]>>8),   

仿真数据值:

4.2  DMA配置data width:Half word 

在STM32Cube中配置如下参数

 DMA通道buff配置如下:

 生成代码下载到板卡中运行

因为每个通道采样的数据为两个字节,此时:

adcDMAValue[0]:  ch-0

adcDMAValue[1]:  ch-1

adcDMAValue[2]:  ch-2

adcDMAValue[3]:  ch-3

adcDMAValue[4]:  ch-4

adcDMAValue[5]:  ch-5

4.3  DMA配置data width: word 

在STM32Cube中配置如下参数

 DMA通道buff配置如下:

 生成代码下载到板卡中运行

因为每个通道采样的数据为两个字节,此时:

(adcDMAValue[1]<<8)| adcDMAValue[0]  :   ch-0

(adcDMAValue[3]<<8)| adcDMAValue[2]  :   ch-1

(adcDMAValue[5]<<8)| adcDMAValue[4]  :   ch-2

(adcDMAValue[7]<<8)| adcDMAValue[6]  :   ch-3

(adcDMAValue[9]<<8)| adcDMAValue[8]  :   ch-4

(adcDMAValue[11]<<8)| adcDMAValue[10]  :   ch-5

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

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

相关文章

java如何实现一个死锁 ?

死锁(Deadlock)是指在并发系统中,两个或多个线程(或进程)因争夺资源而互相等待,导致它们都无法继续执行的一种状态。 一、简易代码 public class DeadlockExample {private static final Object lock1 = new Object();private

如何在 ASP.NET MVC 项目中使用身份验证器应用程序实现多因素身份验证?

介绍 增强安全性对于任何应用程序都至关重要&#xff0c;而多因素身份验证 (MFA) 是实现此目标的有效方法。在本文中&#xff0c;我们将介绍在 ASP.NET MVC 项目中使用身份验证器应用程序集成 MFA 的过程。无论您是从头开始还是将 MFA 添加到现有项目&#xff0c;本指南都将提…

生物素标记降钙素Biotin-α-CGRP, rat 中间体

生物素标记降钙素Biotin-α-CGRP, rat 中间体是一种特定的生物化学试剂&#xff0c;主要用于科学研究领域。以下是对该产品的详细介绍&#xff1a; 一、基本信息 产品名称&#xff1a;生物素标记降钙素Biotin-α-CGRP, rat 中间体 英文名称&#xff1a;Biotin-α-CGRP, rat 纯度…

Qt 线程同步机制 互斥锁 信号量 条件变量 读写锁

qt线程同步 Qt提供了丰富的线程同步机制来帮助开发者更高效和安全地进行多线程编程。其主要包括: QMutex:为共享数据提供互斥访问能力,避免同时写入导致的数据冲突。利用lock()/unlock()方法实现锁定和解锁。 QReadWriteLock:读写锁,允许多个读线程同时访问,但写操作需要独占…

springboot社区物资交易互助平台+lw+源码+调试+讲解

第3章 系统分析 用户的需求以及与本系统相似的在市场上存在的其它系统可以作为系统分析中参考的资料&#xff0c;分析人员可以根据这些信息确定出本系统具备的功能&#xff0c;分析出本系统具备的性能等内容。 3.1可行性分析 尽管系统是根据用户的要求进行制作&#xff0c;但…

windows USB 设备驱动开发-USB带宽

本文讨论如何仔细管理 USB 带宽的指导。 每个 USB 客户端驱动程序都有责任最大程度地减少其使用的 USB 带宽&#xff0c;并尽快将未使用的带宽返回到可用带宽池。 在这里&#xff0c;我们认为USB 2.0 的速度是480Mbps、12Mbps、1.5Mbps&#xff0c;这分别对应高速、全速、低速…

Python面试宝典第9题:买卖股票

题目 给定一个整型数组&#xff0c;它的第i个元素是一支给定股票第i天的价格。如果最多只允许完成一笔交易&#xff08;即买入和卖出一支股票一次&#xff09;&#xff0c;设计一个算法来计算你所能获取的最大利润。注意&#xff1a;你不能在买入股票前卖出股票。 示例 1&#…

LabVIEW平台从离散光子到连续光子的光子计数技术

光子计数技术用于将输入光子数转换为离散脉冲。常见的光子计数器假设光子是离散到达的&#xff0c;记录到来的每一个光子。但是&#xff0c;当两个或多个光子同时到达时&#xff0c;计数器会将其记录为单个脉冲&#xff0c;从而只计数一次。当连续光子到达时&#xff0c;离散光…

python学习-容器类型

列表 列表&#xff08;list&#xff09;是一种有序容器&#xff0c;可以向其中添加或删除任意元素. 列表数据类型是一种容器类型&#xff0c;列表中可以存放不同数据类型的值,代码示例如下&#xff1a; 列表中可以实现元素的增、删、改、查。 示例代码如下&#xff1a; 增 …

基于Unity3D的Rokid AR Glass项目开发环境搭建

初识Rokid AR 一、SDK简介二、准备工作1.软件环境2.硬件环境 三、快速接入SDK1.配置Package Manager2.安装UXR2.0 SDK 四、导入官方Demo进行模拟器测试五、Rokid AR系列教程 一、SDK简介 UXR2.0 SDK是Rokid为Unity开发者提供的AR开发工具包&#xff0c;提供空间定位跟踪、双目…

Windows 网络重置及重置网络可能出现的问题( WIFI 没有了 / WLAN 图标消失)

netsh int ip reset 命令是用于重置 Windows 操作系统中的网络设置和配置的命令。 在网络故障排除、修复网络连接问题以及清除可能存在的网络配置冲突时非常有用。 命令详解&#xff1a; netsh: 用于配置各种网络设置 int: 用于管理网络接口 ip: 用于管理网络接口的 IP 配…

学习嵌入式对于学历有要求吗?

学习嵌入式系统开发通常并不对学历有严格的要求&#xff0c;尤其是在技术行业中&#xff0c;实际的技能和经验往往比学历更为重要。我收集归类了一份嵌入式学习包&#xff0c;对于新手而言简直不要太棒&#xff0c;里面包括了新手各个时期的学习方向编程教学、问题视频讲解、毕…

Swift 中 map 和 flatMap 的区别 (入门版)

在 Swift 中&#xff0c;map 和 flatMap 是用于处理集合类型&#xff08;如数组、字典、集合等&#xff09;的两个重要方法。尽管它们看起来相似&#xff0c;但它们在处理集合中的元素和结果时有着不同的行为。 map 方法 map 方法会对集合中的每一个元素应用一个变换&#xff…

Ubuntu 24.04 LTS (Linux) 安装二维码生成工具 QRencode 二维码生成和识别

1 Ubuntu 安装 sudo apt update sudo apt-get install qrencode 2 查看版本 qrencode -V 3 生成二维码 qrencode -o test.png http://www.baidu.com 可以下载test.png图片,用手机浏览器扫描下看(⊙﹏⊙)

FPGA 项目菜单功能比较

为了帮助您更好地理解每个FPGA功能模块的实用场合、区别和特点&#xff0c;以下是详细的比较&#xff1a; 功能模块实用场合区别特点FPGA I/O自动控制系统、数据采集系统直接与FPGA板卡上的物理端口交互&#xff0c;配置和使用外部I/O设备灵活配置输入输出端口&#xff0c;支持…

Day62 单调栈part01

LC739每日温度(未掌握) 暴力解法&#xff1a;两层for循环&#xff0c;时间复杂度O(n^2)&#xff0c;会超时未掌握原因分析&#xff1a;只想到了从栈顶到栈底是递减的情况&#xff0c;忽略了从栈顶到栈底是递增的情况 因为需要找到一个元素右边第一个更大元素&#xff0c;只有…

寂静孤独的404页面源码

寂静孤独的404页面源码&#xff0c;灯光闪烁动态效果&#xff0c;源码由HTMLCSSJS组成&#xff0c;记事本打开源码文件可以进行内容文字之类的修改&#xff0c;双击html文件可以本地运行效果&#xff0c;也可以上传到服务器里面&#xff0c;重定向这个界面 寂静孤独的404页面源…

【深度学习】PyTorch深度学习笔记01-Overview

参考学习&#xff1a;B站视频【《PyTorch深度学习实践》完结合集】-刘二大人 ------------------------------------------------------------------------------------------------------- 1. 基于规则的深度学习 2. 经典的机器学习——手动提取一些简单的特征 3. 表示学习…

深入理解 LXC (Linux Containers)

目录 引言LXC 的定义LXC 的架构LXC 的工作原理LXC 的应用场景LXC 在 CentOS 上的常见命令实验场景模拟总结 1. 引言 在现代 IT 基础设施中&#xff0c;容器技术已经成为一种重要的应用和部署方式。与虚拟机相比&#xff0c;容器具有更高的效率、更轻量的特性和更快的启动速度…

AI应用观:从“卷模型”到“卷应用”的时代跨越

在2024年世界人工智能大会的舞台上&#xff0c;百度创始人李彦宏的发言如同一股清流&#xff0c;为当前如火如荼的人工智能领域注入了深刻的思考。他提出的“大家不要卷模型&#xff0c;要卷应用”的观点&#xff0c;不仅是对当前AI技术发展趋势的精准洞察&#xff0c;更是对未…