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输出脚全挤在芯片一侧,走线绕了半个板子,信号质量一塌糊涂。
我的分配原则是这样的:
- PWM输出优先固定——调光用的PWM引脚,尽量选在芯片同一侧,方便走线到MOSFET驱动。ESP32的话,我习惯用GPIO12-15、GPIO25-27这些。
- I2C总线放一起——SDA和SCL必须相邻,且远离高频开关节点。我踩过坑,把I2C放在PWM输出旁边,结果通信时不时出错。
- UART留作调试口——不管量产用不用,至少留一组UART。我习惯用GPIO1/3(TX/RX),万一程序跑飞了,还能接个串口看看log。
- ADC输入要干净——如果要做光敏或电流检测,ADC引脚周围别放数字信号。ESP32的ADC本身噪声就大,再被干扰就没法用了。
- 中断引脚留够——按键、传感器触发、过零检测,这些都需要外部中断。我一般预留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分配表、晶振布局、复位电路都落实到图纸上,咱们一步步来。