3. CubeMX 配置入门:时钟树、ADC 参数与 DMA/中断

好,咱们正式开始动手配置。这一节我会带着你走一遍 CubeMX 的图形化配置流程。说实话,很多人拿到 CubeMX 就懵了——界面上一堆下拉框和复选框,不知道哪些该勾、哪些不该动。

我刚开始用的时候也踩过坑。有一次在时钟树上选错了 PLL 分频系数,ADC 采样出来的数据全是乱的,查了整整两天才发现是时钟源不对。所以这一节,我会把每个关键配置项背后的「为什么」讲清楚。

3.1 时钟树配置——ADC 的“心跳”

ADC 是个数字-模拟混合模块,它需要时钟来驱动采样和转换。时钟不对,采样率就不对,数据自然也不对。

核心原则: ADC 的时钟频率必须在芯片手册规定的范围内。以 STM32F4 为例,ADC 时钟最高 36 MHz,超过这个值转换结果就会非线性。

在 CubeMX 的 Clock Configuration 标签页里,你会看到一整张时钟树。我个人习惯按以下步骤来配:

  1. 选择时钟源——一般用 HSE(外部晶振)或 HSI(内部振荡器)。追求精度就用 HSE,我项目里 90% 都用 8 MHz 晶振。
  2. 配置 PLL——把 HSE 倍频到系统主频。比如 HSE=8 MHz,PLL_M=8,PLL_N=336,PLL_P=2,得到 SYSCLK=168 MHz。
  3. 设置 APB2 预分频器——ADC 挂在 APB2 总线上。APB2 时钟一般配到 84 MHz(2 分频),然后 ADC 内部再分频。
  4. 配置 ADC 时钟分频——在 ADC 参数里选择分频系数,确保最终 ADC 时钟 ≤ 36 MHz。
我的小技巧: 在 Clock Configuration 页面里,鼠标悬停在每个时钟线上,CubeMX 会显示当前频率。养成习惯,配完看一眼 ADC 时钟是不是在安全范围内。

下面这张图是我自己整理的时钟树配置流程,你照着走基本不会错:

ADC 时钟树配置流程 选择时钟源 (HSE/HSI) 配置 PLL 倍频 设置 APB2 预分频 ADC 时钟分频系数 验证 ≤ 36 MHz HSE 精度高,HSI 省成本 我一般选 HSE 8 MHz APB2 通常配 84 MHz ADC 挂在这个总线上 超频会导致采样值非线性 千万别超 36 MHz!

3.2 ADC 参数设置——别被选项吓到

切到 Pinout & Configuration 标签页,找到 Analog → ADC1。点开后你会看到一堆参数。别慌,常用的其实就几个。

参数项 可选值 我的推荐 说明
Resolution 6/8/10/12 bit 12 bit 精度最高,除非你追求极速采样
Scan Conversion Mode Enabled / Disabled 多通道时 Enabled 扫描模式下自动遍历所有配置的通道
Continuous Conversion Mode Enabled / Disabled 看需求 连续模式:启动后一直转;单次模式:转一次就停
Discontinuous Conversion Mode Enabled / Disabled 一般 Disabled 间断模式,特殊场景才用
Number of Conversion 1~16 按通道数设 你配了几个通道就设几个
External Trigger Conversion Source 定时器/软件等 软件触发或定时器触发 定时器触发适合固定采样率场景
我曾经踩过的坑: 有一次我配了 3 个通道,但 Number of Conversion 只设了 1。结果 ADC 只采第一个通道,后面两个通道的数据全是 0。查了半天才发现是这里少设了。记住:通道数和转换次数必须一致。

再说说 Rank 的设置。每个通道都有一个 Rank(采样顺序),从 Rank 1 到 Rank N。你可以在 ADC1 Regular Conversion 下面的列表里添加通道,并设置采样时间。

采样时间这个参数很关键。它决定了 ADC 内部采样电容充电的时间。如果信号源内阻大,采样时间太短,电容充不满,转换结果就会偏小。

经验值: 对于一般模拟信号(比如电位器分压),采样时间设 3~7 个周期就够了。如果信号源内阻超过 10 kΩ,我建议把采样时间拉到 15 个周期以上。保守一点总没错。

3.3 DMA 与中断使能——解放 CPU

ADC 转换完成后,数据放在寄存器里。如果你不用 DMA,就得在中断里手动读数据,或者轮询等待。这两种方式都会占用 CPU 时间。

我个人强烈建议:只要不是单通道低速采样,就用 DMA。DMA 可以把转换结果自动搬运到内存数组里,CPU 完全不用管。

在 CubeMX 里使能 DMA 的步骤:

  1. 在 ADC1 配置页里,找到 DMA Settings 标签。
  2. 点击 Add,选择 ADC1 作为 DMA 请求源。
  3. 设置 DMA 通道参数:
参数 推荐值 原因
Direction Peripheral To Memory ADC 是外设,数据流向内存
Mode Circular 循环模式,DMA 自动从头开始覆盖旧数据
Data Width Half Word (16 bit) ADC 数据寄存器是 16 位,对齐好
Increment Address Memory 勾选 每次传输后内存地址自动 +2

中断方面,我一般只使能 DMA 传输完成中断。这样当 DMA 搬完一轮数据后,会触发中断通知 CPU 来处理。CPU 平时该干嘛干嘛,不用一直盯着 ADC。

配置口诀: ADC 连续转换 + DMA 循环模式 + 传输完成中断 = 最省 CPU 的采样方案。

如果你不用 DMA,只靠中断,那就要在 NVIC Settings 里勾选 ADC1 global interrupt。每次转换完成都会进中断,适合采样率不高、数据量小的场景。

3.4 生成代码前的最后检查

配置完所有参数后,点 Project → Generate Code 之前,我建议你花 30 秒做一次快速检查:

  • 时钟树:ADC 时钟频率是否 ≤ 36 MHz?
  • ADC 参数:通道数和 Number of Conversion 是否一致?
  • DMA:Mode 是不是 Circular?Data Width 是不是 Half Word?
  • 中断:DMA 传输完成中断有没有勾上?