4、微控制器选型:STM32系列介绍、选型依据(性能、功耗、外设)、最小系统设计

好,咱们进入第四章。这一章聊的是微控制器选型,说白了就是「选哪个芯片来干活」。我做了这么多年嵌入式,见过太多项目因为选型失误而返工。有的选了个性能过剩的,成本压不住;有的选了个太弱的,跑不动算法。嗯,今天咱们就拿 STM32 系列来拆解一下,看看怎么选才靠谱。

4.1 STM32 系列概览

STM32 是意法半导体(ST)的拳头产品。它基于 ARM Cortex-M 内核,从 M0 到 M7 全覆盖。我个人习惯把 STM32 分成三大梯队:

  • 入门级:STM32F0、G0 系列,Cortex-M0/M0+ 内核。主频 48MHz 左右,适合做简单的控制、传感器采集。功耗低,价格也低。
  • 主流级:STM32F1、F3、G4 系列,Cortex-M3/M4 内核。F1 是经典款,F3 带 DSP 和 FPU,G4 主打电机控制。这是项目里用得最多的。
  • 高性能级:STM32F2、F4、F7、H7 系列,Cortex-M4/M7 内核。主频能到 400MHz+,带硬件浮点、Cache、MPU。适合跑算法、做图形界面。

你想想看,一个理疗仪的控制系统,需要什么?无非是按键检测、屏幕显示、电机驱动、温度采集、通信上报。这些活儿,主流级的 F1 或 F4 基本都能搞定。

核心观点:选型不是越强越好,而是「够用 + 有余量」。我一般会留 30% 的 CPU 余量,防止后期加功能时捉襟见肘。

4.2 选型依据:性能、功耗、外设

选型时我主要看三个维度。咱们一个一个说。

4.2.1 性能

性能看什么?主频、内核、内存。

  • 主频:理疗仪的控制周期通常在 1ms 到 10ms 之间,主频 72MHz 的 F103 完全够用。如果你要跑 PID 算法或者 FFT 分析,建议上带 FPU 的 M4 内核,比如 F405。
  • Flash 和 RAM:代码量不大,64KB Flash 起步。但如果你要存波形数据、用户配置,建议选 128KB 以上的。RAM 至少 20KB,否则跑 FreeRTOS 会吃力。
  • DSP 指令:M4 和 M7 内核支持 DSP 指令集。我在做理疗仪波形合成时,用 DSP 指令做正弦波查表插值,速度比纯 C 快了 3 倍。

我的经验:别只看主频。同样的 72MHz,M3 和 M4 的运算能力差不少。M4 有单周期乘法和硬件除法,算 PID 时优势明显。

4.2.2 功耗

理疗仪通常是电池供电或者 USB 供电。功耗不是最敏感的参数,但也不能忽视。

  • 运行模式:STM32 在 72MHz 下运行电流约 50mA 左右。如果你用电池,建议选低功耗系列,比如 STM32L0 或 L4。
  • 睡眠模式:理疗仪大部分时间在待机。STM32 的 Stop 模式电流可以降到几微安。我建议用 RTC 定时唤醒,这样既省电又能保持实时性。
  • 动态电压调节:部分 STM32L 系列支持动态调节内核电压,跑低频时自动降压。这个功能在电池供电项目里很实用。

注意:低功耗模式下,外设的时钟会被关闭。比如 ADC、定时器、USART 都可能无法工作。你需要仔细看数据手册里的「外设时钟门控」部分。我曾经因为没注意这个,导致低功耗唤醒后串口丢数据,排查了两天。

4.2.3 外设

理疗仪需要哪些外设?我列个清单:

外设 用途 推荐配置
GPIO 按键、LED、继电器 至少 16 个,带外部中断
定时器 PWM 输出、输入捕获 至少 2 个高级定时器
ADC 温度、压力传感器 12 位精度,至少 2 通道
DAC 波形输出(可选) 2 通道,12 位
USART 蓝牙/WiFi 通信 至少 1 个,带流控
I2C OLED 屏幕、EEPROM 1 个,400kHz
SPI SD 卡、Flash 1 个,18MHz

我个人建议选 STM32F103C8T6 或 STM32F405RGT6。前者便宜、资料多,后者性能强、外设丰富。你想想看,一个理疗仪的控制板,用 F103 做原型,用 F405 做量产,这个路线很成熟。

4.3 最小系统设计

最小系统,就是让芯片能跑起来的最简电路。说白了,就是「供电 + 时钟 + 复位 + 下载」。我见过很多新手在这上面翻车。

4.3.1 供电电路

STM32 需要 3.3V 供电。一般用 AMS1117-3.3 或 RT9013 这类 LDO。注意输入输出电容不能省:输入侧 10μF + 0.1μF,输出侧 10μF + 0.1μF。我习惯在芯片的每个 VDD 引脚旁边再加一个 0.1μF 去耦电容,离引脚越近越好。

避坑指南:我曾经在一个项目里省掉了输出侧的 10μF 电容,结果芯片上电后偶尔复位。后来查了三天,发现是电源纹波太大,加上电容后问题消失。嗯,从此我再也不敢省电容了。

4.3.2 时钟电路

STM32 有两个时钟源:HSE(外部高速晶振)和 LSE(外部低速晶振)。

  • HSE:8MHz 晶振,配两个 20pF 负载电容。注意晶振的走线要短,不要靠近高频信号。我一般把晶振放在芯片旁边,地线包一圈。
  • LSE:32.768kHz 晶振,用于 RTC。这个晶振对负载电容很敏感,建议用 6pF 或 12.5pF 的,具体看数据手册。

如果你对成本敏感,也可以用内部 RC 振荡器。但精度不高,温度漂移大。做理疗仪这种需要定时精度的设备,我建议还是用外部晶振。

4.3.3 复位电路

STM32 的 NRST 引脚是低电平复位。最简单的做法是:一个 10kΩ 上拉电阻到 3.3V,再加一个 0.1μF 电容到地。这样上电时电容充电,产生一个低脉冲,芯片复位。

如果你需要手动复位,可以加一个按键,并联在电容两端。按下时短路电容,拉低 NRST。

我的习惯:在 NRST 引脚上串联一个 100Ω 电阻,防止外部干扰。这个电阻很小,但能有效防止静电打坏芯片。

4.3.4 下载调试电路

STM32 支持 SWD 和 JTAG 两种调试接口。我推荐用 SWD,只需要 4 根线:SWDIO、SWCLK、VCC、GND。再加一个可选的 SWO 用于输出调试信息。

下载器我用的是 ST-Link V2,便宜又好用。接线时注意 SWDIO 和 SWCLK 要分别上拉 10kΩ 到 3.3V,否则可能连不上。

// 最小系统引脚连接示例(STM32F103C8T6)
// VDD: 3.3V
// VSS: GND
// NRST: 10kΩ 上拉 + 0.1μF 到 GND
// OSC_IN: 8MHz 晶振 + 20pF 到 GND
// OSC_OUT: 8MHz 晶振 + 20pF 到 GND
// PA13 (SWDIO): 10kΩ 上拉到 3.3V
// PA14 (SWCLK): 10kΩ 上拉到 3.3V
// BOOT0: 10kΩ 下拉到 GND(正常模式)
// BOOT1: 10kΩ 下拉到 GND(正常模式)

4.3.5 BOOT 模式设置

STM32 的 BOOT0 和 BOOT1 引脚决定启动模式。正常运行时,BOOT0 接 GND,从 Flash 启动。如果你要下载程序,可以把 BOOT0 接 3.3V,从系统存储器启动(内置 Bootloader)。

我建议在 BOOT0 上留一个跳线或者按键,方便调试。量产时直接焊死到 GND。

注意:BOOT1 引脚在正常模式下也要接 GND。如果悬空,芯片可能进入奇怪的启动模式。我见过有人因为 BOOT1 没接,导致芯片上电后不跑程序,查了半天才发现是引脚浮空。

4.4 小结

这一章咱们聊了 STM32 的系列划分、选型的三要素(性能、功耗、外设),以及最小系统的设计要点。说白了,选型就是「匹配需求 + 留有余量」,最小系统就是「供电 + 时钟 + 复位 + 下载」。你把这些搞清楚了,理疗仪的控制核心就稳了。

下一章咱们开始讲软件架构,包括裸机编程和 RTOS 的选择。到时候我会分享一些实际项目里的代码结构,敬请期待。