做硬件开发最头疼的就是选型。去年我接了个智能农业监测系统的活儿,客户要求设备能实时上传土壤数据到云端,还得控制灌溉阀门。当时在ESP32-S3和STM32F103之间纠结了两周,最后发现选型就像找对象——没有最好的,只有最合适的。
先看两个典型场景:如果你要做带屏幕的共享单车锁,STM32F103的80个GPIO能轻松驱动液晶屏和电机;但如果是需要Wi-Fi联网的智能插座,ESP32-S3内置的无线模块能省掉额外芯片。我总结了个快速判断法:但凡项目需求里出现"实时联网""低功耗待机""OTA升级"这些关键词,直接重点考虑ESP32-S3;要是看到"精密定时""多路PWM""工业级稳定性",就该把STM32F103放进购物车。
有个容易踩的坑是盲目追求性能参数。曾见过新手用240MHz的ESP32-S3做电机控制,结果被实时性坑得怀疑人生。后来换72MHz的STM32F103反而稳定了,就因为Cortex-M3内核的中断响应时间硬是比Xtensa快了两个数量级。这就像用跑车拉货——马力再大也不如货车实在。
ESP32-S3的双核Xtensa LX7看着唬人,实测跑FreeRTOS时调度延迟能到500μs。有次做语音唤醒项目,死活达不到200ms响应要求,后来发现是第二个核抢占了Wi-Fi栈资源。而STM32F103的Cortex-M3虽然单核,但配合NVIC中断控制器,最差中断响应只要12个时钟周期(约167ns)。
内存配置更是门学问。ESP32-S3的512KB SRAM看着阔绰,但Wi-Fi和蓝牙协议栈启动后就吃掉200KB。去年做多传感器融合时,内存碎片导致系统随机崩溃,最后是靠ESP-IDF的内存监控工具才定位问题。反观STM32F103的20KB SRAM,虽然小但管理简单,用CubeMX配置后基本不会出幺蛾子。
ESP32-S3的240MHz主频要分情况看:跑神经网络推理时确实爽,但做精密定时就露怯了。它的时钟树结构复杂,PLL抖动能达到±3%,我做过测试,生成1MHz PWM波时实际频率波动有30kHz。而STM32F103虽然只有72MHz,但内部HSI时钟稳如老狗,配合TIM1定时器,输出1MHz信号误差不超过100Hz。
有个骚操作是ESP32-S3的时钟门控功能,做智能门锁时靠这个把待机功耗压到5μA。但要注意唤醒后的时钟稳定时间,我有次没加延时直接读传感器,数据全是乱码。STM32F103的时钟配置就憨厚多了,CubeMX点点鼠标就能搞定,特别适合对时序要求严苛的工业场景。
ESP32-S3的Wi-Fi/蓝牙确实方便,但实测发现连续传输时芯片温度能飙到85℃。去年夏天有个户外项目,设备在高温下频繁断连,最后是加了散热片和温度监控固件才解决。它的RF性能也受PCB设计影响,我见过最惨的案例是天线匹配没做好,传输距离从标称100米缩水到10米。
STM32F103虽然没有无线功能,但外设稳定性堪称教科书级别。它的USART接口在485总线上能扛4000V浪涌,我做过的煤矿监控设备稳定运行了3年没重启。不过要加无线模块就得占用SPI接口,这个坑我踩过:同时接Wi-Fi和显示屏时,DMA传输会偶发冲突,最后是改了驱动优先级才解决。
ESP32-S3的44个GPIO看着比STM32F103少,但每个引脚都支持矩阵式功能映射。做过最骚的操作是把I2S接口重定义到任意引脚,硬是在拥挤的PCB上腾出了传感器位置。不过要注意它的驱动能力只有20mA,直接驱动继电器会烧IO,我就因此报销过两块开发板。
STM32F103的80个GPIO分属不同bank,其中PC13-PC15还能组成防拆检测电路。有个安防项目就利用这个特性,当外壳被打开时自动擦除密钥。它的5V容忍特性也很实用,直接接旧设备省了电平转换芯片。但要注意同一bank的IO同时翻转时会引发电源波动,我有次驱动8个LED时就导致了ADC采样异常。
乐鑫的开发框架确实强大,内置的Wi-Fi配网、OTA升级都是开箱即用。但环境搭建能劝退新手——去年带实习生时,光配个工具链就花了半天。最坑的是不同版本IDF的API不兼容,我有次升级后整个项目报错,最后是回退到v4.2才解决。
STM32的CubeMX则是另一个极端,图形化配置爽到飞起,自动生成代码还能避免低级错误。但它的HAL库抽象层有时太厚,想调优性能就得啃寄存器手册。有个PID控制项目就因为HAL库的延时问题超调严重,换成LL库后立马稳定。
ESP32-S3的JTAG调试是个玄学,经常遇到OpenOCD连不上的情况。后来发现规律:一定要先按复位键再点调试,而且USB线必须带屏蔽。最抓狂的是它的panic信息像谜语,有次报错"invalid header"其实是SPIFFS分区表配错了。
STM32F103的SWD接口就靠谱多了,5块钱的ST-Link能玩出花来。它的错误寄存器也设计得人性化,有次硬件错误直接定位到是堆栈溢出。不过要注意它的flash擦写寿命,频繁烧录时建议开写保护,我有个样机就是因为每天刷50次固件,三个月后程序开始跑飞。
ESP32-S3的低功耗模式宣传很美好,但实测发现light sleep模式下Wi-Fi重连要3秒。有个电池供电项目就被这个坑了,后来改用modem sleep才平衡了功耗和响应速度。它的RF功耗也要特别注意,发射功率每提高3dBm,电流就翻倍,我做过极限测试:20dBm时整机电流能到300mA。
STM32F103的功耗控制就像老干部——不玩虚的。stop模式实测1.5μA,唤醒只要2μs,做水表累计跑了8年不用换电池。但它的外设漏电要小心,我有次ADC没关闭,待机电流多了50μA。还有个神坑是IO状态,悬空输入pin会微安级漏电,最好配置成模拟输入或者输出固定电平。
ESP32-S3的BOM成本看着低,但外围电路要求严格。它的射频部分需要13个无源器件,国产料和进口料价差10倍但性能天壤之别。去年为降本换了国产电感,结果Wi-Fi距离直接腰斩。STM32F103的外围就简单多了,甚至能用阻容振荡器代替晶振,在消费级产品上省到极致。
现在芯片缺货是常态,ESP32-S3的供货周期经常波动。有个量产项目就被迫做了二手准备:PCB同时预留ESP32和STM32的焊盘。STM32F103的兼容型号多,GD32、AT32都能pin to pin替换,不过要注意GD32的flash等待周期不同,直接烧录原厂固件会跑飞。