第三章 主控芯片选型:MCU选型要点、常用MCU对比与最小系统设计

各位同学,欢迎来到第三章。前面我们把血氧仪的传感器、模拟前端都聊透了,现在该聊聊这颗「大脑」了——主控芯片,也就是MCU。

说实话,MCU选型这事儿,看着简单,其实坑不少。我见过不少项目,硬件画好了,软件写完了,结果发现Flash不够用,或者ADC精度差一截,最后只能换芯片,板子重做,那叫一个痛苦。所以这一章,我把自己这些年踩过的坑、总结的经验,一股脑倒给你们。

3.1 MCU选型要点:别光看主频

很多人选MCU,上来就问:「主频多少?ARM Cortex-M几?」 嗯,这当然重要,但血氧仪这种嵌入式医疗设备,你得想得更细。

我个人习惯,会从下面几个维度去卡:

  • 处理能力:血氧算法不算太重,但PPG信号处理、滤波、特征提取,加上驱动OLED屏幕,一般Cortex-M4或M0+就够。M4带FPU(浮点运算单元),做FFT会快很多。
  • 存储资源:Flash至少64KB,RAM至少8KB。为什么?因为血氧算法库、显示字库、协议栈都要占空间。我遇到过用32KB Flash的芯片,最后代码塞不下,硬着头皮优化,累死。
  • 模拟外设:血氧仪需要ADC采集PPG信号。ADC分辨率至少12位,采样率建议1kHz以上。有些MCU内置PGA(可编程增益放大器),能省一颗运放。
  • 通信接口:I2C接传感器、SPI接屏幕、UART接蓝牙模块,这是标配。别选那种接口数量刚好卡边的,留点余量。
  • 功耗:血氧仪很多是电池供电。待机电流要低,运行功耗也要控制。我习惯看「每MHz功耗」这个指标。
  • 封装与成本:QFN封装省空间,但手工焊接难。LQFP好焊,但体积大。成本嘛,批量采购时一颗差几毛钱,一年几万台的量,差距就出来了。

核心观点:选MCU不是选最强的,而是选「刚刚好」的。多一分性能,多一分成本;少一分资源,多一分痛苦。

3.2 常用MCU对比:STM32、GD32、ESP32

市面上MCU太多了,但血氧仪领域,这三款最常见。我一个个说。

3.2.1 STM32:老大哥,稳如狗

STM32是ST意法半导体的产品,生态最成熟。你想想看,网上随便一搜,教程、例程、库函数,铺天盖地。出了问题,论坛里问一句,半天就有人回。

优点

  • HAL库和LL库,开发效率高
  • 文档齐全,勘误表都写得清清楚楚
  • 型号丰富,从M0到M7全覆盖

缺点

  • 价格偏高,尤其是这两年缺芯,涨得离谱
  • 供货不稳定,交期动不动20周+

我建议:如果你做的是医疗认证产品,或者项目周期紧、不想折腾,STM32是首选。稳定压倒一切。

3.2.2 GD32:国产替代,性价比之王

GD32是兆易创新的产品,直接对标STM32。引脚兼容,软件也兼容,很多项目直接替换,改几行代码就跑起来了。

优点

  • 价格便宜,批量采购比STM32便宜30%-50%
  • 供货稳定,国产芯片嘛,交期短
  • 性能不差,主频甚至比同级别STM32还高一点

缺点

  • 生态不如ST,遇到奇怪的问题,网上资料少
  • ADC精度和稳定性,实测比STM32略差

避坑指南:我曾经在一个血氧仪项目里用GD32替换STM32F103,结果发现GD32的ADC在低温下(0℃以下)有偏移。后来加了软件校准才搞定。所以,如果你做的是医疗级产品,一定要做全温测试。

3.2.3 ESP32:Wi-Fi/蓝牙一体,但有点「重」

ESP32是乐鑫的产品,自带Wi-Fi和蓝牙,双核处理器,性能很强。但说实话,血氧仪用ESP32,有点「杀鸡用牛刀」的感觉。

优点

  • 无线通信集成,省一颗蓝牙芯片
  • 性能强,240MHz主频,跑算法绰绰有余
  • 价格便宜,比STM32+蓝牙模块的方案还省

缺点

  • 功耗高,运行电流几十mA,不适合电池供电
  • 启动慢,从复位到跑起来,要几百毫秒
  • 模拟外设弱,ADC精度一般

我个人看法:ESP32适合做「智能血氧仪」,需要联网上传数据的那种。但如果是纯手持设备,还是STM32或GD32更合适。

3.2.4 对比表格

项目 STM32F103 GD32F103 ESP32
内核 Cortex-M3 Cortex-M3 Xtensa LX6
主频 72MHz 108MHz 240MHz
Flash 64KB-512KB 64KB-512KB 4MB(外挂)
SRAM 20KB-64KB 20KB-96KB 520KB
ADC 12位,1μs 12位,1μs 12位,但精度一般
功耗(运行) 约50mA@72MHz 约45mA@108MHz 约80mA@240MHz
价格(批量) ¥8-15 ¥4-8 ¥10-15
生态 ★★★★★ ★★★ ★★★★

3.3 最小系统设计:让MCU跑起来

选好MCU,接下来就是让它「活过来」。最小系统,说白了就是MCU能工作的最低硬件要求。少了任何一个,芯片都跑不起来。

我画过无数次最小系统板,总结下来,就这几样东西:

3.3.1 电源

MCU一般需要3.3V供电。注意,电源要稳。我习惯在VDD引脚附近放一个10μF电解电容和一个100nF陶瓷电容。电解电容负责「蓄水」,陶瓷电容负责「滤高频」。

// 电源去耦电容布局建议
// VDD引脚 -> 100nF陶瓷电容(尽量靠近引脚)
// 然后 -> 10μF电解电容(稍远一点)
// 最后 -> 电源输入

警告:千万别省去耦电容!我曾经见过一个项目,为了省成本,只放了一个10μF电容,结果MCU一跑起来,电源纹波大得离谱,ADC采集的数据全是噪声。后来加上100nF电容,问题立刻解决。

3.3.2 时钟

MCU需要时钟才能工作。一般有两种:

  • 内部RC振荡器:精度低(±1%~±3%),但省成本,不需要外部元件。
  • 外部晶振:精度高(±20ppm),但需要两个20pF左右的负载电容。

血氧仪对时序要求不高,用内部RC也行。但如果你要用到USB通信,或者需要精确的采样率,那就必须用外部晶振。我一般选8MHz或16MHz的晶振,配合12pF-22pF的电容。

3.3.3 复位电路

复位电路保证MCU上电时能正确初始化。最简单的方案:一个10kΩ上拉电阻接到VDD,再加一个100nF电容到GND。嗯,就这样。

有些MCU内部有上拉电阻,连电阻都可以省。但我不建议省,万一内部上拉不够强,复位不可靠,系统会随机死机。

3.3.4 启动模式

STM32和GD32都有BOOT0和BOOT1引脚。一般我们让BOOT0接地,从Flash启动。如果你要用串口下载程序,才把BOOT0拉高。

我习惯在BOOT0引脚上加一个10kΩ下拉电阻,确保默认是低电平。别悬空,悬空等于「听天由命」。

3.3.5 调试接口

SWD接口,两根线:SWDIO和SWCLK。再加一个GND。这是调试和下载程序的命脉。我建议在板子上留一个4针的排针,方便调试。

// SWD接口引脚定义
// 1 - VDD (3.3V)
// 2 - SWDIO
// 3 - SWCLK
// 4 - GND

小技巧:SWDIO和SWCLK上可以各加一个10kΩ上拉电阻,能提高抗干扰能力。尤其是产品要过EMC测试时,这个细节能帮你省不少麻烦。

3.4 总结:选型与设计的黄金法则

好了,这一章的内容就这些。我最后唠叨几句:

  • 选型时:先列需求,再找芯片。别先看芯片,再凑需求。
  • 设计时:最小系统是基础,基础不牢,地动山摇。电源、时钟、复位,这三样一定要做好。
  • 测试时:上电后先量电压、看波形、测复位。别急着写代码,硬件没跑稳,软件再牛也没用。

下一章,我们会把传感器、模拟前端、MCU全部连起来,画一张完整的血氧仪硬件原理图。到时候,你们会发现,原来这些零散的模块,组合起来就是一台能测血氧的设备。期待吗?