news 2026/5/15 2:02:31

STM32配置Timer+DMA读取ADC数据

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
STM32配置Timer+DMA读取ADC数据

STM32 定时器触发ADC + DMA 完整配置流程(保姆级步骤)

我直接给你最标准、工程上最常用的配置流程:
TIM 定时器 → 硬件触发 ADC → DMA 自动搬运数据到内存数组
全程CPU不参与、不阻塞、采样精准、连续采集不掉帧

我用STM32F103(通用所有STM32逻辑一样)举例,库函数/HAL库都讲清楚,你直接照着配就行。


一、整体工作流程(先看懂逻辑)

  1. 定时器每隔固定时间(如1ms)输出一个触发信号
  2. ADC收到触发信号 → 自动采样转换
  3. DMA自动把ADC结果搬到数组里
  4. 数组满了 → 通知CPU处理(中断/标志位)
  5. CPU只需要读数组做滤波、算电压,不用管采集过程

二、必须配置的 4 大模块(按顺序来)

  1. GPIO 模拟输入
  2. ADC 配置(硬件触发模式)
  3. 定时器 配置(输出触发信号)
  4. DMA 配置(搬运ADC数据)

三、详细配置步骤(一步一步跟着做)

1. 开启时钟(GPIO、ADC1、TIM1、DMA1)

所有外设先开时钟,这是第一步!

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_ADC1|RCC_APB2Periph_TIM1,ENABLE);RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1,ENABLE);

2. 配置 GPIO 为模拟输入

ADC 引脚必须设ANALOG 模拟模式

GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0;// ADC_IN0GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AIN;// 模拟输入GPIO_Init(GPIOA,&GPIO_InitStructure);

3. 配置 ADC(关键:设为外部触发模式

这里是核心:必须让ADC等待定时器触发!

ADC_InitTypeDef ADC_InitStructure;// ADC 时钟分频(最大14MHz,必须配)RCC_ADCCLKConfig(RCC_PCLK2_Div6);ADC_InitStructure.ADC_Mode=ADC_Mode_Independent;ADC_InitStructure.ADC_ScanConvMode=DISABLE;// 单通道ADC_InitStructure.ADC_ContinuousConvMode=DISABLE;// 关闭连续转换(等待硬件触发)ADC_InitStructure.ADC_ExternalTrigConv=ADC_ExternalTrigConv_T1_CC1;// 定时器1通道1触发ADC_InitStructure.ADC_DataAlign=ADC_DataAlign_Right;ADC_InitStructure.ADC_NbrOfChannel=1;ADC_Init(ADC1,&ADC_InitStructure);// 配置通道采样时间ADC_RegularChannelConfig(ADC1,ADC_Channel_0,1,ADC_SampleTime_239Cycles5);// 开启 ADC DMAADC_DMACmd(ADC1,ENABLE);// 必须开!// 使能 ADCADC_Cmd(ADC1,ENABLE);

4. 配置定时器(用来定时触发 ADC)

目标:让定时器每隔 X ms 产生一个触发信号

TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;TIM_OCInitTypeDef TIM_OCInitStructure;// 定时器基本配置:72MHz / 72 / 1000 = 1ms 中断一次TIM_TimeBaseStructure.TIM_Period=1000-1;TIM_TimeBaseStructure.TIM_Prescaler=72-1;TIM_TimeBaseStructure.TIM_ClockDivision=0;TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;TIM_TimeBaseInit(TIM1,&TIM_TimeBaseStructure);// 配置通道1为 PWM 模式,用于触发 ADCTIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM1;TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable;TIM_OCInitStructure.TIM_Pulse=500;TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_High;TIM_OC1Init(TIM1,&TIM_OCInitStructure);// 使能定时器TIM_Cmd(TIM1,ENABLE);

现在定时器每 1ms 自动触发一次 ADC 转换


5. 配置 DMA(自动搬运 ADC 数据到数组)

DMA_InitTypeDef DMA_InitStructure;// 定义一个数组存采样数据(比如存10个)uint16_tADC_ConvertedValue[10];DMA_InitStructure.DMA_PeripheralBaseAddr=(uint32_t)&ADC1->DR;// ADC数据寄存器地址DMA_InitStructure.DMA_MemoryBaseAddr=(uint32_t)ADC_ConvertedValue;// 数组地址DMA_InitStructure.DMA_DIR=DMA_DIR_PeripheralSRC;// 外设作为源DMA_InitStructure.DMA_BufferSize=10;// 数组大小DMA_InitStructure.DMA_PeripheralInc=DMA_PeripheralInc_Disable;DMA_InitStructure.DMA_MemoryInc=DMA_MemoryInc_Enable;// 内存地址自增DMA_InitStructure.DMA_PeripheralDataSize=DMA_PeripheralDataSize_HalfWord;DMA_InitStructure.DMA_MemoryDataSize=DMA_MemoryDataSize_HalfWord;DMA_InitStructure.DMA_Mode=DMA_Mode_Circular;// 循环模式(一直采集)DMA_InitStructure.DMA_Priority=DMA_Priority_High;DMA_InitStructure.DMA_M2M=DMA_M2M_Disable;DMA_Init(DMA1_Channel1,&DMA_InitStructure);// 使能 DMADMA_Cmd(DMA1_Channel1,ENABLE);

四、最终效果(你完全不用管采集)

  • 定时器每1ms触发一次ADC
  • ADC自动转换
  • DMA自动把值放进数组ADC_ConvertedValue[]
  • 数组循环覆盖,连续采集永不停止
  • CPU 完全解放

你只需要:

// 读数组里的最新值uint16_tval=ADC_ConvertedValue[0];// 转成电压floatvoltage=val*3.3f/4096;

五、最关键的 3 个配置要点(新手必看)

  1. ADC 必须关闭连续转换,选择外部硬件触发
  2. 定时器必须配置为 PWM 触发模式
  3. DMA 必须设为循环模式 Circular Mode

六、我可以直接给你

你告诉我:

  1. 你用的是标准库还是HAL库
  2. 你要单通道还是多通道

我直接给你完整可编译的工程代码,复制就能跑。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/15 1:59:07

突破百度网盘限速:Python直链解析工具实战指南

突破百度网盘限速:Python直链解析工具实战指南 【免费下载链接】baidu-wangpan-parse 获取百度网盘分享文件的下载地址 项目地址: https://gitcode.com/gh_mirrors/ba/baidu-wangpan-parse 还在为百度网盘下载速度慢而烦恼吗?当重要文件卡在几十K…

作者头像 李华
网站建设 2026/5/15 1:58:12

离线语音控制窗帘DIY:本地化智能家居改造实战指南

1. 项目概述:当传统窗帘遇上离线语音家里的窗帘,每天都要手动拉来拉去,尤其是早上想赖床或者晚上已经躺下的时候,总觉得有点麻烦。智能家居的概念火了这么多年,但很多方案要么需要复杂的布线,要么得依赖手机…

作者头像 李华
网站建设 2026/5/15 1:58:11

CircuitPython库管理与引脚操作:从零到精通的嵌入式开发指南

1. 项目概述:从零开始掌握CircuitPython的库与引脚如果你刚开始接触CircuitPython,面对一堆传感器和开发板,最常遇到的两个问题可能就是:“为什么我的代码说找不到这个库?”以及“这个引脚在代码里到底应该叫什么名字&…

作者头像 李华
网站建设 2026/5/15 1:54:05

智能体框架构建指南:从核心原理到工程实践

1. 项目概述:从代码仓库到智能体构建框架的深度解读最近在开源社区里,一个名为1kurepin/agentify的项目引起了我的注意。乍一看,这只是一个普通的 GitHub 仓库名,但如果你对当前 AI 领域,特别是智能体(Agen…

作者头像 李华
网站建设 2026/5/15 1:53:05

基础地理信息中心 GIS 指南

🗺️ 基础地理信息中心 GIS 考编深度指南 📋 文章摘要 本文是一份针省基础地理信息中心(地信中心)GIS岗位考编的深度指南,基于对59篇公众号文章的数据分析,系统梳理了备考所需的核心信息。主要内容包括&a…

作者头像 李华