第一章 课程导论与硬件准备

各位同学好,我是你们的讲师。咱们这门课叫《STM32 ADC多通道采样与DMA数据处理调试与故障定位实战》,名字挺长,但说白了就一件事——教你如何把模拟信号准确、高效地采进单片机,再通过DMA把数据搬走,中间出了毛病还能自己查出来。

我做了十几年嵌入式,踩过的坑比你们见过的开发板都多。ADC这玩意儿,看着简单,真到项目里一跑,问题一堆:采样值跳来跳去、DMA传输到一半卡死、多通道切换顺序搞错……嗯,这些咱们后面都会一一拆解。

1.1 ADC基本原理——你得先知道它怎么工作的

ADC,全称模数转换器。就是把连续的模拟电压,变成离散的数字量。你想想看,自然界的声音、温度、光照都是连续的,但单片机只认0和1,所以中间得有个“翻译官”。

常见的ADC类型有好几种,咱们STM32里用的是逐次逼近型(SAR)。它的核心思想很简单:拿一个参考电压去跟输入电压比,从高位到低位逐位逼近。

ADC类型 速度 精度 典型应用
逐次逼近型(SAR) 中速(几MHz) 12~16位 STM32内置,通用场景
Σ-Δ型 低速(几十kHz) 16~24位 高精度测量、音频
流水线型 高速(百MHz) 8~12位 射频、高速数据采集

STM32的ADC分辨率通常是12位,也就是说,参考电压3.3V被分成4096份。每份大约0.8mV。这个精度对大多数传感器来说够用了。

关键公式:数字量 = (输入电压 / 参考电压) × 4095

举个例子:输入1.65V,数字量 = (1.65 / 3.3) × 4095 ≈ 2048

1.2 STM32的ADC外设概述——不只是“采样”那么简单

STM32的ADC外设,功能比你想的丰富。我刚开始用的时候,以为就是调个库函数完事。后来发现,它支持的东西真不少:

  • 多通道扫描:可以一口气采十几个通道,不用手动切换
  • 多种触发源:定时器、外部引脚、软件触发,灵活得很
  • DMA支持:数据自动搬走,CPU只管算数
  • 连续/单次模式:看你要一直采还是采一次
  • 采样时间可调:信号源内阻大,就多等一会儿

咱们这门课主要用F103系列做演示,但原理通用。你换成F4、H7,思路一样,寄存器名稍微变变。

我的习惯:新项目里,我一般先把ADC配成软件触发+单次转换,确认硬件没问题了,再改成定时器触发+DMA。一步到位容易出问题,排查起来也麻烦。

下面这张图,是咱们整个课程的知识体系。你看一眼,心里有个谱:

STM32 ADC多通道采样与DMA数据处理 知识体系 ADC多通道 + DMA数据处理 硬件准备与原理 配置与代码实现 调试与故障定位 ADC基本原理 硬件选型与接线 CubeMX配置 DMA传输代码 常见故障排查 第一章:课程导论与硬件准备 → 打好基础再上路

1.3 所需硬件清单——别等焊好了发现缺东西

做嵌入式,硬件是绕不开的。我见过太多人,代码写得飞起,结果板子没焊对,查了两天。咱们这门课,你至少需要以下东西:

硬件 推荐型号/规格 用途 备注
开发板 STM32F103C8T6(蓝板/黑板) 主控平台 其他系列也行,引脚注意
信号源 信号发生器 或 电位器+分压 提供模拟输入 电位器最简单,0~3.3V可调
示波器 双通道,100MHz带宽 观察波形、时序 没有的话用逻辑分析仪凑合
杜邦线 公对母、母对母若干 连接信号与ADC引脚 尽量短,减少干扰
USB转串口模块 CH340/FT232 打印调试信息 方便看采样值

注意:STM32的ADC输入电压绝对不能超过VDDA(通常是3.3V)。我曾经有个学员,直接把5V信号怼进去,芯片当场冒烟。如果你要测高于3.3V的信号,必须加分压电阻或运放。

1.4 开发环境搭建——Keil还是CubeIDE?

我个人两个都用。Keil MDK是老牌工具,编译快,调试顺手。CubeIDE是ST官方出的,免费,集成了CubeMX配置。咱们这门课,两种环境都会涉及,但核心代码是通用的。

搭建步骤其实不复杂:

  1. 安装Keil MDK(或CubeIDE)——去官网下载,注意选对版本
  2. 安装器件包——Keil里需要装STM32F1xx的DFP包
  3. 安装ST-Link驱动——调试器要用,不然识别不到
  4. 新建工程——选对芯片型号,配置时钟和调试接口
  5. 编写第一段代码——点亮LED,确认环境没问题

我的建议:新手先用CubeIDE,配置外设直观,不容易漏东西。老手随意,Keil的调试体验确实更好。但不管用哪个,一定要先跑通一个最简单的工程,再开始ADC的配置。