STM32 HAL库实战:高效整合DMA与ADC开发指南
STM32 HAL库实战:高效整合DMA与ADC开发指南
一、DMA与ADC基础介绍
1. DMA:解放CPU的“数据搬运工”
DMA(Direct Memory Access) 是STM32中用于在外设与内存之间直接传输数据的硬件模块。其核心优势在于无需CPU干预,可显著提升系统效率。
-
功能特点:
-
支持存储器↔外设、存储器↔存储器的数据传输。
-
多通道管理,每个通道独立控制一个外设的数据传输。
-
传输完成后触发中断通知CPU。
-
-
典型应用场景:
-
ADC多通道连续采样数据的自动存储。
-
串口大数据收发、SPI/I2C通信等。
-
2. ADC:模拟世界的“数字翻译器”
ADC(Analog-to-Digital Converter) 负责将模拟信号(如电压、温度)转换为数字信号。STM32的ADC模块支持多通道、高精度采样。
-
关键参数:
-
分辨率:12位(0~4095)。
-
采样速率:最高1MHz(STM32F1系列)。
-
输入通道:16个外部通道 + 2个内部通道(温度传感器、VREF)。
-
-
工作模式:
- 单次转换、连续转换、扫描模式(多通道轮询)。
二、DMA+ADC整合开发步骤
1. 硬件与工程配置
硬件连接示例
- ADC通道:PA1(通道1)接模拟输入(如MQ2烟雾传感器、电位器等)。
- DMA通道:ADC1使用DMA1通道1(见STM32参考手册)。

硬件代码配置
ADC基础配置
void adc_config(void)
{adc_handle.Instance = ADC1;adc_handle.Init.DataAlign = ADC_DATAALIGN_RIGHT;adc_handle.Init.ScanConvMode = ADC_SCAN_DISABLE;adc_handle.Init.ContinuousConvMode = ENABLE;adc_handle.Init.NbrOfConversion = 1;adc_handle.Init.DiscontinuousConvMode = DISABLE;adc_handle.Init.NbrOfDiscConversion = 0;adc_handle.Init.ExternalTrigConv = ADC_SOFTWARE_START;HAL_ADC_Init(&adc_handle);HAL_ADCEx_Calibration_Start(&adc_handle);
}
ADC硬件配置
void HAL_ADC_MspInit(ADC_HandleTypeDef* hadc)
{if(hadc->Instance == ADC1){RCC_PeriphCLKInitTypeDef adc_clk_init = {0};GPIO_InitTypeDef gpio_init_struct = {0};__HAL_RCC_ADC1_CLK_ENABLE();__HAL_RCC_GPIOA_CLK_ENABLE();gpio_init_struct.Pin = GPIO_PIN_1;gpio_init_struct.Mode = GPIO_MODE_ANALOG;HAL_GPIO_Init(GPIOA, &gpio_init_struct);adc_clk_init.PeriphClockSelection = RCC_PERIPHCLK_ADC;adc_clk_init.AdcClockSelection = RCC_ADCPCLK2_DIV6;HAL_RCCEx_PeriphCLKConfig(&adc_clk_init);}
}
ADC通道配置
void adc_channel_config(ADC_HandleTypeDef* hadc, uint32_t ch, uint32_t rank, uint32_t stime)
{ADC_ChannelConfTypeDef adc_ch_config = {0};adc_ch_config.Channel = ch;adc_ch_config.Rank = rank;adc_ch_config.SamplingTime = stime;HAL_ADC_ConfigChannel(hadc, &adc_ch_config);
}
DMA配置:
void dma_config(void)
{__HAL_RCC_DMA1_CLK_ENABLE();dma_handle.Instance = DMA1_Channel1;dma_handle.Init.Direction = DMA_PERIPH_TO_MEMORY;//内存相关配置dma_handle.Init.MemDataAlignment = DMA_MDATAALIGN_HALFWORD;dma_handle.Init.MemInc = DMA_MINC_ENABLE;//外设相关配置dma_handle.Init.PeriphDataAlignment = DMA_PDATAALIGN_HALFWORD;dma_handle.Init.PeriphInc = DMA_PINC_DISABLE;dma_handle.Init.Priority = DMA_PRIORITY_MEDIUM;dma_handle.Init.Mode = DMA_CIRCULAR;HAL_DMA_Init(&dma_handle);__HAL_LINKDMA(&adc_handle, DMA_Handle, dma_handle);
}
2. 关键代码实现
初始化并启动DMA
void adc_dma_init(uint32_t *mar)
{adc_config();adc_channel_config(&adc_handle, ADC_CHANNEL_1, ADC_REGULAR_RANK_1, ADC_SAMPLETIME_239CYCLES_5);dma_config();HAL_ADC_Start_DMA(&adc_handle, mar, 1);
}
在主函数中,调用该函数,DMA将会一直将值存放在mar所指的内存上。
3. 优化技巧与常见问题
提升ADC精度
-
硬件优化:
-
添加0.1μF滤波电容到ADC输入引脚。
-
单独为VDDA和VSSA供电。
-
-
软件优化:
- 丢弃前几次采样值(避免电源不稳定)。
常见问题排查
-
数据错位:检查DMA数据宽度(需与ADC对齐方式一致)。
-
采样值跳动:增加采样时间或添加软件滤波(如滑动平均)。
-
DMA不触发:确认DMA通道与ADC的映射关系(参考数据手册)。
三、项目实战:DMA单通道采集(烟雾)
功能需求
- 使用PA1烟雾报警模拟输入。
- 每3秒计算一次并通过串口输出。
核心代码片段
#include "sys.h"
#include "delay.h"
#include "led.h"
#include "uart1.h"
#include "adc.h"#define CAL_PPM 10 // 校准环境中PPM值
#define RL 10 // RL阻值
#define R0 97 // R0阻值uint16_t adc_result = 0;
int main(void)
{float RS ;float ppm;HAL_Init(); /* 初始化HAL库 */stm32_clock_init(RCC_PLL_MUL9); /* 设置时钟, 72Mhz */led_init(); /* 初始化LED灯 */uart1_init(115200);adc_dma_init((uint32_t *)&adc_result);printf("hello world!\r\n");while(1){
// printf("adc result: %f\r\n", (float)adc_result / 4096 * 3.3);RS = (3.3f - (float)adc_result / 4096 * 3.3) / (float)adc_result / 4096 * 3.3 * RL;ppm = 98.322f * pow(RS/R0, -1.458f);printf("adc result: %f\r\n", ppm);delay_ms(3000);}
}
四、总结
通过DMA+ADC的高效整合,开发者可以实现低CPU占用率的模拟信号采集系统。关键点在于:
- 合理配置ADC的扫描模式与DMA循环传输。
- 利用HAL库的中断回调机制处理数据。
- 通过硬件与软件优化提升信号质量。
掌握这一技术后,可轻松应对传感器数据采集、工业控制等高实时性场景的需求。
相关文章:
STM32 HAL库实战:高效整合DMA与ADC开发指南
STM32 HAL库实战:高效整合DMA与ADC开发指南 一、DMA与ADC基础介绍 1. DMA:解放CPU的“数据搬运工” DMA(Direct Memory Access) 是STM32中用于在外设与内存之间直接传输数据的硬件模块。其核心优势在于无需CPU干预,…...
什么是机器学习?从零基础到自动驾驶案例全解析
Langchain系列文章目录 01-玩转LangChain:从模型调用到Prompt模板与输出解析的完整指南 02-玩转 LangChain Memory 模块:四种记忆类型详解及应用场景全覆盖 03-全面掌握 LangChain:从核心链条构建到动态任务分配的实战指南 04-玩转 LangChai…...
正点原子[第三期]Arm(iMX6U)Linux移植学习笔记-4 uboot目录分析
前言: 本文是根据哔哩哔哩网站上“Arm(iMX6U)Linux系统移植和根文件系统构键篇”视频的学习笔记,在这里会记录下正点原子 I.MX6ULL 开发板的配套视频教程所作的实验和学习笔记内容。本文大量引用了正点原子教学视频和链接中的内容。 引用: …...
Unity开发——点击事件/射线检测
一、IPointerClickHandler接口 通过为 UI 元素添加自定义脚本,实现IPointerClickHandle接口,在点击事件发生时进行处理。 这种方式适用于对特定 UI 元素的点击检测。 using UnityEngine; using UnityEngine.EventSystems;public class UIClickHandler…...
【零基础入门unity游戏开发——unity3D篇】3D物理系统之 —— 3D刚体组件Rigidbody
考虑到每个人基础可能不一样,且并不是所有人都有同时做2D、3D开发的需求,所以我把 【零基础入门unity游戏开发】 分为成了C#篇、unity通用篇、unity3D篇、unity2D篇。 【C#篇】:主要讲解C#的基础语法,包括变量、数据类型、运算符、流程控制、面向对象等,适合没有编程基础的…...
微信小程序接入DeepSeek模型(火山方舟),并在视图中流式输出
引言: DeepSeek,作为一款先进的自然语言处理模型,以其强大的文本理解和生成能力著称。它能够处理复杂的文本信息,进行深度推理,并快速给出准确的回应。DeepSeek模型支持流式处理,这意味着它可以边计算边输…...
55年免费用!RevoUninstaller Pro专业版限时领取
今天,我要给大家介绍一款超给力的卸载工具——RevoUninstaller Pro。这是一款由保加利亚团队精心打造的专业级卸载软件,堪称软件卸载界的“神器”。 RevoUninstaller分为免费版和专业版。专业版功能更为强大,但通常需要付费才能解锁全部功能。…...
Markdig:强大的 .NET Markdown 解析器详解
在现代开发中,Markdown 已经成为了一种广泛使用的轻量级标记语言,特别是在文档、博客和内容管理系统中,Markdown 为开发者提供了快速、简洁的格式化文本方式。而在 .NET 生态中,Markdig 是一款非常强大的 Markdown 解析器…...
基于ensp的IP企业网络规划
基于ensp的IP企业网络规划 前言网络拓扑设计功能设计技术详解一、网络设备基础配置二、虚拟局域网(VLAN)与广播域划分三、冗余协议与链路故障检测四、IP地址自动分配与DHCP相关配置五、动态路由与安全认证六、广域网互联及VPN实现七、网络地址转换&#…...
谷歌Chrome或微软Edge浏览器修改网页任意内容
在谷歌或微软浏览器按F12,打开开发者工具,切换到console选项卡: 在下面的输入行输入下面的命令回车: document.body.contentEditable"true"效果如下:...
初探大模型开发:使用 LangChain 和 DeepSeek 构建简单 Demo
最近,我开始接触大模型开发,并尝试使用 LangChain 和 DeepSeek 构建了一个简单的 Demo。通过这个 Demo,我不仅加深了对大模型的理解,还体验到了 LangChain 和 DeepSeek 的强大功能。下面,我将分享我的开发过程以及一些…...
【Linux】进程(1)进程概念和进程状态
🌟🌟作者主页:ephemerals__ 🌟🌟所属专栏:Linux 目录 前言 一、什么是进程 二、task_struct的内容 三、Linux下进程基本操作 四、父进程和子进程 1. 用fork函数创建子进程 五、进程状态 1. 三种重…...
关闭win11根据内容自动调整屏幕亮度
在win11笔记本上使用编程软件的时候,用的是深色背景,但是屏幕会慢慢变暗;等切换回明亮的桌面时,又会慢慢变亮,带来不适应的感觉。这个博客记录一下解决这个问题的办法 ps:有些人修改的是电源选项ÿ…...
2021-05-23 C++百元百鸡
此是草稿,有值得优化的地方,如从公鸡先循环再母鸡再小鸡这样可以提高效率,且有输出后也可优化为公鸡母鸡小鸡初始化。 void 百元百鸡() {//缘由https://ask.csdn.net/questions/7434093?spm1005.2025.3001.5141int xj 1, mj 1, gj 1, y …...
理解langchain langgraph 官方文档示例代码中的MemorySaver
以下是langchain v0.3官方示例代码 from langgraph.checkpoint.memory import MemorySaver from langgraph.graph import START, MessagesState, StateGraph# 可以理解为:定义一个流程,这个流程中用到的数据类型是Messages。 <---定义一个有向图&…...
C# 建造者模式(Builder Pattern)详细讲解
一、什么是建造者模式? 建造者模式(Builder Pattern)是一种创建型设计模式,它通过将一个复杂对象的构建过程与其表示分离,使得同样的构建过程可以创建不同的表示。这个模式主要应用于那些构建过程复杂且涉及多个步骤的…...
Android自动化测试工具
细解自动化测试工具 Airtest-CSDN博客 以下是几种常见的Android应用自动化测试工具: Appium:支持多种编程语言,如Java、Python、Ruby、JavaScript等。可以用于Web应用程序和原生应用程序的自动化测试,并支持iOS和Android平台。E…...
【蓝桥杯】24省赛:数字串个数
思路 本质是组合数学问题: 9个数字组成10000位数字有9**10000可能 不包括3的可能8**10000 不包括7的可能8**10000 既不包括3也不包括77**10000 根据容斥原理:结果为 9 ∗ ∗ 10000 − 8 ∗ ∗ 10000 − 8 ∗ ∗ 10000 7 ∗ ∗ 10000 9**10000 - 8**10…...
SpringBoot中使用kaptcha生成验证码
简介 kaptcha是谷歌开源的简单实用的验证码生成工具。通过设置参数,可以自定义验证码大小、颜色、显示的字符等等。 Maven引入依赖 <!-- https://mvnrepository.com/artifact/pro.fessional/kaptcha --><dependency><groupId>pro.fessional<…...
解密乐天音乐如何通过抗指纹浏览器刷变现
作者:药尘-韩立----->🚀🌍❤️( hanli068 ) 专栏:反反爬技术 日期:2025年3月15日 原创声明:本文为作者原创,未经允许不得转载 在音乐流媒体平台(“日本乐天音乐”)中…...
自定义tiptap插件
本文为开发开源项目的真实开发经历,感兴趣的可以来给我的项目点个star,谢谢啦~ 具体博文介绍: 开源|Documind协同文档(接入deepseek-r1、支持实时聊天)Documind 🚀 一个支持实时聊天和接入 - 掘…...
软考网络安全专业
随着信息技术的迅猛发展,网络安全问题日益凸显,成为社会各界普遍关注的焦点。在这样的背景下,软考网络安全专业应运而生,为培养高素质的网络安全人才提供了有力支撑。本文将对软考网络安全专业进行深入剖析,探讨其在信…...
蓝桥杯嵌入式赛道复习笔记1(led点亮)
前言 基础的文件创建,参赛资源代码的导入,我就不说了,直接说CubeMX的配置以及代码逻辑思路的书写,在此我也预祝大家人人拿国奖 理论讲解 原理图简介 1.由于存在PC8引脚到PC15引脚存在冲突,那么官方硬件给的解决方案…...
订单超时自动取消功能如何设计
在一个 Java 电商项目中,订单超时自动取消功能可以通过多种方式设计和实现。常见的实现方式包括使用定时任务(例如 ScheduledExecutorService 或 Spring 的 Scheduled 注解)或者基于事件驱动的方式(如使用消息队列)。以…...
FPGA为何要尽量减少组合逻辑的使用
在FPGA设计中,组合逻辑的使用确实需要谨慎,尤其是要尽量减少它的复杂性。这并不是因为组合逻辑本身不好,而是因为它在实际应用中容易引发一系列问题,而这些问题往往与FPGA的设计哲学和硬件特性相冲突。让我从几个关键点来和你聊聊…...
六十天前端强化训练之第十七天React Hooks 入门:useState 深度解析
欢迎来到编程星辰海的博客讲解 看完可以给一个免费的三连吗,谢谢大佬! 目录 一、知识讲解 1. Hooks 是什么? 2. useState 的作用 3. 基本语法解析 4. 工作原理 5. 参数详解 a) 初始值设置方式 b) 更新函数特性 6. 注意事项 7. 类组…...
芯科科技推出的BG29超小型低功耗蓝牙®无线SoC,是蓝牙应用的理想之选
具有扩大的内存和超低功耗特性的超小型BG29是互联健康设备的理想之选 低功耗无线领域内的领导性创新厂商Silicon Labs(亦称“芯科科技”,NASDAQ:SLAB)今日宣布:推出全新的第二代无线开发平台产品BG29系列无线片上系统…...
联想小新 Pro16 锐龙版本 type c 充电掉速降频问题
小新Pro-16 2021 锐龙版 Type-C接口连接电源适配器卡顿降频的解决方案 通过网盘分享的文件:小新Pro-16 2021 锐龙版 Type-C接口连接电源适配器卡顿降频的解决方案.zip 链接: https://pan.baidu.com/s/1713s9AO5QC31bdsf8g1ZIw?pwd1234 提取码: 1234 --来自百度网盘…...
export、export default 和 module.exports 深度解析
文章目录 1. 模块系统概述1.1 模块系统对比1.2 模块加载流程 2. ES Modules2.1 export 使用2.2 export default 使用2.3 混合使用 3. CommonJS3.1 module.exports 使用3.2 exports 使用 4. 对比分析4.1 语法对比4.2 使用场景 5. 互操作性5.1 ES Modules 中使用 CommonJS5.2 Com…...
qwen2.5-vl多机多卡分布式部署
记录一下工作中进行多机多卡部署qwen2.5-vl多模态大模型踩过的坑 第一个天坑就是官方提供的镜像qwenllm/qwenvl:2.5-cu121有问题,在titan显卡会抛出cuda error:no kernel image is availabe for execution on the device. 这是cuda内核与GPU不兼容的问题,…...
