4. 微控制器选型:STM32/ESP32选型对比、GPIO分配、时钟与复位电路

好,咱们进入第四章。这一章聊的是智能照明的大脑——微控制器选型。

说实话,我在这个环节上栽过跟头。早些年做一款智能灯控板,拍脑袋选了STM32F103,结果项目做到一半发现需要Wi-Fi功能,硬生生加了个ESP8266模块,板子面积翻倍,信号还互相干扰。后来我学乖了,选型阶段就把通信需求想清楚。

智能照明这块,目前主流就是STM32和ESP32两大阵营。咱们一个一个掰开来看。

4.1 STM32 vs ESP32:怎么选?

先看一张对比表,心里有个底:

对比项 STM32(以F103为例) ESP32
内核 Cortex-M3,32位 Xtensa LX6,双核32位
主频 72MHz 240MHz
无线能力 无(需外挂模块) Wi-Fi + BLE 双模
GPIO数量 最多80个(LQFP100封装) 最多34个(QFN48封装)
ADC精度 12位,最多2个 12位,最多2个
开发成本 芯片约8-15元 芯片约12-20元
功耗(活跃) 约50mA @72MHz 约80mA @240MHz
生态成熟度 非常成熟,资料多 成熟,Arduino/ESP-IDF

我个人习惯这样判断:

  • 如果产品需要联网(手机控制、语音助手、OTA升级),直接上ESP32。省一个Wi-Fi模块的钱,省一路电源,省一堆layout烦恼。
  • 如果产品是纯本地控制(红外遥控、按键、传感器联动),STM32更稳。它的GPIO更多,定时器更丰富,做PWM调光特别顺手。
  • 如果两者都要——嗯,我建议用ESP32做主控,STM32做协处理器。我在一个多路调光项目里就这么干过,ESP32负责通信,STM32负责16路PWM输出,分工明确。

核心建议:智能照明单品,80%的场景用ESP32就够了。别为了省几块钱给自己挖坑。

4.2 GPIO分配:别让布局工程师骂你

GPIO分配这事儿,看着简单,其实特别容易翻车。我见过一个同事,原理图画得飞起,结果PCB布局时发现PWM输出脚全挤在芯片一侧,走线绕了半个板子,信号质量一塌糊涂。

我的分配原则是这样的:

  1. PWM输出优先固定——调光用的PWM引脚,尽量选在芯片同一侧,方便走线到MOSFET驱动。ESP32的话,我习惯用GPIO12-15、GPIO25-27这些。
  2. I2C总线放一起——SDA和SCL必须相邻,且远离高频开关节点。我踩过坑,把I2C放在PWM输出旁边,结果通信时不时出错。
  3. UART留作调试口——不管量产用不用,至少留一组UART。我习惯用GPIO1/3(TX/RX),万一程序跑飞了,还能接个串口看看log。
  4. ADC输入要干净——如果要做光敏或电流检测,ADC引脚周围别放数字信号。ESP32的ADC本身噪声就大,再被干扰就没法用了。
  5. 中断引脚留够——按键、传感器触发、过零检测,这些都需要外部中断。我一般预留4-6个中断引脚。

拿一个典型的ESP32智能灯控板来说,我的GPIO分配表长这样:

GPIO 功能 备注
GPIO12 PWM_CH1(暖光) 上拉电阻10kΩ
GPIO13 PWM_CH2(冷光) 上拉电阻10kΩ
GPIO14 PWM_CH3(RGB-R)
GPIO15 PWM_CH4(RGB-G)
GPIO25 PWM_CH5(RGB-B)
GPIO21 SDA(I2C) 上拉4.7kΩ
GPIO22 SCL(I2C) 上拉4.7kΩ
GPIO1 UART0_TX(调试)
GPIO3 UART0_RX(调试)
GPIO34 ADC1(光敏检测) 仅输入模式
GPIO35 ADC2(电流检测) 仅输入模式
GPIO0 按键(烧录/唤醒) 外部上拉
GPIO2 LED指示灯

一个小技巧:画原理图时,把GPIO分配表直接贴在图纸空白处。这样Layout工程师一眼就能看到,不用来回翻文档。

4.3 时钟电路:晶振选型与布局

时钟是MCU的心脏。心跳乱了,整个系统就乱了。

ESP32和STM32都支持内部RC振荡器和外部晶振。内部RC省成本、省面积,但精度差、温漂大。智能照明里如果有定时功能(比如日落开灯、延时关灯),我建议用外部晶振。

晶振选型要点:

  • 主晶振:ESP32用40MHz,STM32F103用8MHz。别搞错频率,否则MCU不干活。
  • RTC晶振:如果需要低功耗实时时钟,加一颗32.768kHz。ESP32内部有RTC,但精度一般。
  • 负载电容:晶振规格书里会写CL值,一般是12pF或18pF。匹配电容计算公式:C1 = C2 = 2 × CL - 杂散电容。杂散电容大约3-5pF,所以12pF晶振配15pF电容差不多。

布局避坑指南:

我曾经在一个项目里,把晶振放在开关电源旁边,结果系统频繁死机。查了两天才发现是电源噪声耦合进了晶振。从那以后,我对晶振布局特别敏感:

  • 晶振离MCU越近越好,走线不超过10mm
  • 晶振底下不走其他信号线,尤其是高频线
  • 晶振外壳接地,减少辐射
  • 匹配电容靠近晶振引脚放置
  • 远离电感、变压器、大电流回路

警告:ESP32的40MHz晶振,如果布局不好,Wi-Fi灵敏度会下降3-5dBm。别问我怎么知道的——说多了都是泪。

4.4 复位电路:简单但别大意

复位电路看着简单,就一个电阻一个电容。但恰恰是这种简单电路,最容易出问题。

标准复位电路:

VCC (3.3V)
  │
  ┌┴┐
  │R│ 10kΩ
  └┬┘
  │
  ├───── MCU_RST
  │
  ┌┴┐
  │C│ 100nF
  └┬┘
  │
 GND

上电时,电容充电需要时间,RST引脚保持低电平,MCU复位。等电容充满,RST被拉高,MCU开始运行。就这么简单。

但有几个坑要注意:

  • 复位时间:RC时间常数τ = R × C = 10kΩ × 100nF = 1ms。一般MCU需要2-3个τ才能可靠复位,也就是2-3ms。如果电源上电很慢,这个时间可能不够。我习惯把电容加到1μF,τ变成10ms,稳妥。
  • 手动复位按钮:如果板子上有调试接口,加一个按键。按下时RST接地,松开后复位。注意按键要防抖,硬件上串一个100Ω电阻。
  • 外部看门狗:如果产品要求高可靠性(比如商业照明),加一个外部看门狗芯片,比如MAX809或TPS3823。MCU死机时自动复位。
  • ESP32的特殊性:ESP32的EN引脚就是复位脚。它内部有上拉,但外部最好再加一个10kΩ上拉到3.3V。另外,EN引脚对噪声敏感,走线要短,远离电源纹波大的区域。

我的经验:量产产品里,复位电路的成本不到一毛钱,但能省掉80%的启动异常问题。别省这个钱。

好了,微控制器选型这块就聊到这儿。下一章咱们开始画原理图,把今天选的这些器件连起来。到时候我会把GPIO分配表、晶振布局、复位电路都落实到图纸上,咱们一步步来。