ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

自绘STM32F103C8T6最小系统板:锂电池供电与SWD调试优化实战

自绘STM32F103C8T6最小系统板:锂电池供电与SWD调试优化实战 每次做便携式小设备我都会遇到同一个尴尬某宝几块钱的STM32F103C8T6最小系统板确实便宜但真正拿到项目里用锂电池供电和SWD调试这两件事总让人不省心。板载LDO在电池电压掉到3.4V以下时输出就开始抖SWD接口又往往只是简单引出四根排针没有保护、没有阻抗匹配连上ST-Link偶尔还会掉线。后来我干脆自己重新画了一块针对锂电池供电与SWD调试优化的STM32F103C8T6最小系统板从电源路径到调试接口逐一理清。这篇文章就复盘整个设计过程包括方案对比、参数计算、PCB布局和一些实际调试中踩过的坑给同样想自己画最小系统板或者做低功耗便携设备的同学做个参考。1. 整体设计思路与方案选型1.1 为什么自己画最小系统板而不是买现成核心板很多人的第一反应是核心板才几块钱自己画还要打样、焊接、调bug图什么我图的是三样东西电源拓扑可控、引脚定义顺手、调试接口可靠。现成核心板为了兼容各种场景电源部分一般就是一个AMS1117-3.3线性稳压器。AMS1117的dropout电压大约在1V以上输入至少要4.3V才能稳定输出3.3V而锂电池满电4.2V、标称3.7V、截止3.0V用AMS1117等于说电池从4.2V开始输出电压就一直在临界状态根本不适合锂电池直接供电。这是我最不能忍的一点。另外核心板的排针定义是别人定的经常出现我需要的ADC引脚被引到内排、要用的PWM引脚被LED占用这类情况。自己画板就可以完全按照项目需求规划引脚SWD、串口、电池检测、I2C、SPI都放在外排用起来顺手很多。打样成本也早不是门槛了普通两层板5片包邮也就二三十块比买五块核心板贵不了多少但手里的原理图和PCB文件是能一直复用的。1.2 锂电池供电的最小系统板要解决的三个核心矛盾设计这块板子之前我把需求拆成了三个核心矛盾后面所有选型都围绕这三个矛盾展开。第一个矛盾是电压范围。锂电池单节电压在3.0V到4.2V之间波动而STM32F103C8T6虽然是2.0V到3.6V宽压供电但板载外设、传感器、通信模块通常都要求稳定的3.3V。能不能用一颗LDO直接拉可以但必须选低压差的型号而且还要接受电池容量利用率打折的现实。第二个矛盾是功耗。便携设备对静态电流很敏感DC-DC效率高但是自身空载损耗比LDO大LDO虽然静态电流小但在压差大的时候效率又很难看。这个矛盾决定了电源方案不能拍脑袋选。第三个矛盾是调试和生产。SWD调试接口既是开发阶段的救命稻草又是量产之后被攻击的窗口。设计时既要保证调试阶段稳定连接又要给量产留出禁用调试口、加密固件的余地。1.3 系统架构与板级规划整块板子的架构其实非常简单核心就是一条完整的电源链锂电池 → 充电管理 → 电池保护 → 主电源转换 → STM32F103C8T6最小系统 → SWD调试接口。如果细分下来板级规划我分成了四块电源区充电IC、保护IC、主电源芯片、电感、输入输出电容、电池电压采样分压电阻最小系统区MCU、8MHz晶振、复位电路、BOOT跳线、去耦电容、VBAT连接调试区SWD四针或五针接口、串阻、上下拉电阻、ESD保护器件扩展区两排2.54mm排针把空闲GPIO全部引出这个分区在后面PCB布局时会直接影响走线质量所以画原理图之前就先把功能模块规划清楚比边画边想高效得多。2. 锂电池供电设计电压轨、充电与保护2.1 锂电池电压特性与系统供电路径锂电池不是稳定的电压源。一颗标称3.7V的单节电芯刚充满时4.2V放出一半电量时大概在3.7V左右再往后电压会快速跌到3.0V保护板在2.4V到2.8V左右切断输出防止过放损坏电芯。也就是说给STM32F103C8T6供电的电压源实际范围是4.2V降到3.0V而且这个下降过程不是线性的带负载时还会有瞬时跌落。设计供电路径时必须接受这个电压波动而不是假设电池永远稳在3.7V。我在这块板上走的是独立供电路径电池正极先经过保护IC再进主电源转换芯片输出稳定的3.3V给MCU和其他外设。同时在电池正极放了一组分压电阻到ADC引脚用来实时检测电池电压这样固件里可以在电量过低时主动进入低功耗模式或者关机而不是等着保护板强行断电。这里有个很重要的设计细节电池检测分压电阻的阻值不能取太大也不能取太小。太大会引入高阻抗噪声ADC采样不稳太小又会白白消耗电池。我用的两个10k电阻串联分压满电4.2V时分压点约2.1V电池3.4V时分压点1.7V都在STM32的ADC量程内分压支路自身消耗约0.2mA对一块几百毫安时的电池来说可以接受。2.2 电源方案对比LDO、Buck、Buck-Boost怎么选这是电源设计最核心的决策。三种方案我都实际用过直接说结论。第一是普通LDO方案。AMS1117这种压差大的LDO直接排除不讨论。低压差LDO比如ME6211、XC6206系列dropout电压可以做到几十到一百毫伏静态电流只有几十微安。优点非常明显外围只需输入输出两颗电容输出纹波极小成本一两毛钱。缺点是输入电压必须始终高于输出电压加上dropout所以电池电压跌到3.4V左右时3.3V输出就会跟着下坠系统只能被迫在电量还有大约10%的时候关机。如果你的项目对成本极度敏感、又愿意在固件里做电池电压监测和低压关机这个方案完全成立。第二是Buck降压方案。Buck只能降压输入必须高于输出和LDO面临同样的问题电池低于3.6V后输出就可能掉出3.3V所以不适合单节锂电池输出3.3V这种场景。除非你的系统是直接从电池取电、不需要稳定3.3V否则不建议用Buck。第三是Buck-Boost升降压方案比如TI的TPS63000、TPS63020这一系列。输入电压从2.5V到5.5V都能输出稳定的3.3V意味着电池从4.2V一直放到2.5V3.3V纹丝不动电池容量利用率最高。缺点是外围多一个电感、静态电流比LDO大不少、芯片价格也贵不少。我最终在这块板子上选的是Buck-Boost方案用TPS63020原因是我做的是有屏幕和无线模块的设备负载电流经常到几百毫安电池容量利用率比那几微安静态电流重要得多。如果做的是遥控器、传感器节点这类常年待机、平均电流很低的设备我反而会选低压差LDO加低电压关断策略。2.3 关键参数计算与器件选型选定TPS63020后参数计算就按数据手册来。TPS63020输入范围2.5V到5.5V输出电流最大3A内部集成了开关管同步整流效率在锂电电压段能到90%以上静态电流典型值50uA左右对我来说够用。外围参数的选取我直接抄了数据手册的参考设计再根据实际负载做了微调电感选择2.2uH饱和电流要大于最大负载电流加纹波电流我用的2.2uH/2.5A规格功率电感尺寸是4.0x4.0mm两层板完全放得下输入电容10uF陶瓷电容靠近芯片的VIN引脚同时并联一颗0.1uF高频去耦输出电容22uF陶瓷电容靠近VOUT引脚保证负载瞬态响应这里有个很容易踩的坑TPS63020这类DC-DC对输入输出电容的ESR有要求不要用大电解电容代替陶瓷电容我一开始为了方便用了钽电容结果纹波反而变大后来换回X5R或X7R陶瓷电容才正常。电源效率这块我做了一个简单估算。假设系统负载电流200mA测得效率约90%那么输出功率为3.3V乘以0.2A等于0.66W输入功率约0.73W在电池3.7V时电池侧电流约0.2A。如果用的是1000mAh电池理论工作时间大约5小时考虑到电池容量随温度衰减实际打个八折大约4小时。这个估算在立项阶段很有用能帮你快速判断电池容量够不够。2.4 充电管理与电池保护电路既然板子要配锂电池充电电路也得一起设计否则每次都要外接一个充电板太别扭了。充电IC我选的是TP4056单节锂电线性充电外围简单最大充电电流1A用一颗电阻就能设定电流。PROG引脚对地接电阻关系式是RPROG等于1000除以充电电流单位是千欧。我设定500mA充电电流所以用了2kΩ电阻充电电流不需要太大对电池寿命友好发热也小。TP4056的典型外围是VCC接5V电源BAT引脚接电池正极GND接地。充电过程中CHRG引脚拉低充满后STDBY引脚拉低这两个引脚可以接双色LED作指示。需要注意的是TP4056没有电池防反接功能电池接反会烧芯片所以我板子上电池座的正负极做到了明显标记同时在电池正极串了一个防反接的MOS管或者干脆用带保护板的电池组。电池保护芯片我用了DW01A加FS8205A双MOS方案这是市面上最成熟的锂电保护组合有过充、过放、过流和短路保护。DW01A监测电池电压和电流FS8205A是两颗背靠背的N沟道MOS管正常时导通异常时断开。虽然现在很多锂电池出厂就自带保护板但板级再加一道保护更稳妥尤其是设备在开发调试阶段插拔电源频繁多一重保护少很多麻烦。3. 最小系统外围电路与引脚规划3.1 三大基础电路时钟、复位、启动配置最小系统之所以叫最小系统核心就三件事时钟能起振、复位能释放、启动模式正确。只要这三件事没问题MCU就能跑起来。时钟电路我用的是8MHz无源晶振并联两个负载电容到地。负载电容的取值不是随手用的要按晶振厂商标称的负载电容CL来算。假设晶振的CL是20pF寄生电容Cs按3到5pF估两个匹配电容C1和C2取值约等于2倍CL减去2倍寄生电容代入之后大概是30到34pF所以我用了两颗33pF的NPO电容。如果CL是12pF的晶振匹配电容就要小很多约15到20pF。用错负载电容最直接的后果就是晶振起振困难或者频率偏差大这在USB通信时特别致命。复位电路我用了10kΩ上拉电阻加100nF电容到地同时接了一个贴片按键到地方便手动复位。NRST引脚内部其实已经有上拉了但外部加一颗上拉更牢固。这里要特别提醒复位电容不要贪大我见过有人用10uF结果上电复位脉冲太长SWD调试器经常连不上目标芯片。100nF已经是比较保守的值了。启动配置就是BOOT0和BOOT1两个引脚。F103系列BOOT0为低电平时从Flash启动这是正常模式BOOT0拉高、BOOT1拉低时进入系统存储器也就是串口ISP模式。我把BOOT0通过10kΩ电阻下拉到地同时预留了一个焊盘想进ISP模式时可以用跳线帽强制拉高。BOOT1就是PB2引脚我把它也经10kΩ下拉到地避免悬空导致启动行为不确定。3.2 电源引脚去耦与参考电压处理STM32F103C8T6是LQFP48封装电源引脚不算多但去耦一个都不能省。我在原理图上给每个VDD引脚配一颗100nF陶瓷电容放在PCB上尽量靠近引脚的位置另外在芯片附近加了一颗4.7uF钽电容作为低频储能。VDDA引脚是模拟电源域我用一颗10Ω电阻把3.3V引过来再接100nF去耦电容这样数字电路的高频噪声不会直接串进ADC参考源。还有VBAT引脚很多人会忽略。这个引脚给RTC和备份寄存器供电如果不打算用外部纽扣电池直接把VBAT接到3.3V不要悬空。悬空的话内部上电时序可能不稳个别芯片还会出现备份域读写异常。因为选了LQFP48封装F103C8T6的VREF和VREF-其实是独立引脚。VREF我直接接VDDAVREF-接地没有单独接精密基准源。如果ADC精度要求高可以外接一个REF3030之类的基准但大多数项目直接用VDDA做参考就够了。3.3 快速引脚规划哪些IO留出来画原理图之前把引脚规划好能避免布线时来回改。我在这块板上的规划是PA13、PA14固定给SWD调试接口代码里绝对不把它们当普通GPIO复用否则固件一旦把这两个引脚配置成输入或输出调试器就可能连不上PA9、PA10串口1的TX和RX引到排针用作日志输出PB0、PB1其中一个接电池电压采样的分压电阻输出另一个备用PC13板上板载LED的驱动引脚低电平点亮PA11、PA12保留给USB D-/D因为F103的USB需要外部晶振我已经放了8MHz晶振所以USB功能是完整的其余IO全部按顺序引到两排排针电源、地、复位也一起引出这样规划下来大部分项目拿这块板子都能直接开干需要什么外设就从排针飞线或者接模块不需要再重新画板。4. SWD调试接口设计与优化实践4.1 SWD信号特性与两线、四线接法SWD调试接口在F103上就是两根线SWDIO对应PA13SWCLK对应PA14再加上GND和VCC最少四根线就能调试。相比传统的JTAGSWD节省了两个IO口调试速度却完全不差支持最高10MHz以上的时钟非常适合Cortex-M3芯片。实际调试时我更推荐四线加复位的接法就是把NRST也接到调试器上。这样做最大的好处是当目标芯片进入休眠模式或者被代码卡死时调试器可以通过复位引脚把芯片拉出来重新连接。很多ST-Link的说明图里只画了SWDIO、SWCLK、GND三个引脚但我在项目里吃过亏芯片进Stop模式后光靠两线SWD是唤不醒的接上NRST硬复位一下就解决了。SWD还有一个特性值得注意SWDIO和SWCLK在芯片内部是带弱上拉和弱下拉的。具体来说SWDIO内部有上拉SWCLK内部有下拉。但内部弱上下拉的驱动能力有限如果调试线比较长或者环境干扰大信号电平可能不确定所以最好在外部再显式加上下拉电阻。4.2 调试接口外围电路优化这块板上SWD接口我加了三层优化串联电阻、外部上下拉、ESD保护。串联电阻选用33Ω分别串在SWDIO和SWCLK上位置靠近MCU引脚。为什么要串这个电阻因为调试器和目标芯片之间的杜邦线或FPC排线是有寄生电感的加上调试器输出端的驱动能力很强信号边沿会非常陡容易产生振铃和过冲严重时导致通信误码。串一个33Ω电阻可以降低信号振铃虽然会轻微增加上升时间但对10MHz以内的SWD时钟来说完全够用。外部上下拉我按照SWDIO上拉10kΩ到3.3V、SWCLK下拉10kΩ到地的标准做法来设计。这样在调试器还没有主动驱动总线的时候两条信号线有确定电平不会因为悬空产生随机翻转也提高了抗干扰能力。ESD保护器件我选了USBLC6-2SC6这是一颗双通道的ESD保护二极管专门用在USB之类的高速信号上钳位电压低、响应时间快。SWD排针会暴露在机壳外面调试时人体静电很容易通过信号线打进MCU引脚没有ESD保护的话运气不好调试器插拔几下MCU就挂了。保护器件放在排针座旁边走线先经过保护器件再到串阻这样泄放路径最短。4.3 布线规范与调试稳定性提升技巧SWD接口的布线其实没有高速信号那么苛刻毕竟SWD时钟通常也就几MHz但以下几个规则我还是严格遵守了。第一SWDIO和SWCLK这两根线在PCB上尽量等长不要一根走得很长另一根贴着芯片就走完了长度差太大会带来时序偏差调试器频率调高之后容易出现偶发错误。第二两根线下面要有完整的地平面尽量不要跨过电源分割区域同时和其他信号线保持距离避免被PWM这类高频信号串扰。第三SWD排针放在板子边缘让调试线能直接插上去减少从排针绕到芯片中间的长走线。还有一个软件层面的小技巧用ST-Link调试时如果线长超过20厘米或者连接不稳定优先把ST-Link的SWD频率从4MHz降到1MHz。不要觉得降频就是性能打折SWD调试瓶颈通常在被调试代码的执行速度上连接稳定性比那点时钟速度重要得多。我调试这类板子时默认就设置在1.8MHz左右很少出问题。5. PCB布局布线实战记录5.1 元件摆放顺序决定布线成败布局布线是最能体现经验的部分。我习惯的摆放顺序是先MCU再电源然后最小系统周边最后调试接口和排针。MCU放在板子中心偏上的位置方向保证所有引脚能自然向两侧引出。LQFP48的引脚分布其实很有规律电源引脚集中在左侧和底部IO引脚分布在四周。先把MCU摆放正了后面布线会顺畅很多。电源模块是第二优先级的。TPS63020芯片、电感、输入输出电容这几个器件必须紧挨在一起特别是电感的走线要短粗。输入电容要靠近VIN引脚输出电容靠近VOUT引脚环路面积越小开关噪声辐射越小。这个环路面积是Buck-Boost布线真正的核心如果输入输出电容离芯片太远PCB上的寄生电感会导致输出电压纹波明显增大甚至影响系统稳定性。最小系统的晶振和去耦电容我放在MCU附近晶振摆在MCU的OSC引脚旁边负载电容紧挨晶振下面全部铺地。去耦电容分别放在对应电源引脚旁边走线尽量先经过电容再进MCU引脚。排针放在板子左右两侧把MCU的IO引出去。这样即使排针上插了杜邦线也不会遮挡中间的电源和晶振区域。5.2 电源与地平面处理两层板的电源和地处理是决定成败的关键。顶层我主要走信号和电源底层作为完整的地平面尽量少分割。地平面越完整回流路径越短信号质量越好。电源走线我做了加宽处理特别是电池供电路径和3.3V主供电路径走线宽度至少1mm过孔打了多个并联降低电阻和寄生电感。DC-DC芯片的电感下方我在底层做了局部挖空处理避免电感磁场在铜箔上感应出涡流这也是一个细节。模拟地和数字地我没有做物理分割。因为F103C8T6只是中等规模MCU板子也不大物理分割地平面反而可能破坏回流路径引发更严重的EMI问题。我用10Ω电阻隔离VDDA的电源域地则单点连接实际测量ADC稳定性完全够用。5.3 打样加工与焊接注意事项打样我走的常规PCB打样流程两层板、1.6mm厚、蓝油或绿油、沉金工艺。沉金焊盘平整度比喷锡好适合手工焊接高密度引脚价格也就贵一点但体验提升明显推荐第一次画板的人直接选沉金。焊接顺序我总结了一条血的教训先焊电源部分再焊MCU最后焊排针和插座。如果先把排针焊上去电源芯片和MCU在板子中间被排针挡住烙铁根本伸不进去。电源部分焊完后先不焊MCU上电测一下3.3V电压是否正常确认没有短路再接MCU。这个习惯救了我很多次。LQFP48手工焊接并不难。先在引脚上均匀涂一层助焊剂把芯片对准焊盘用烙铁固定对角两个引脚然后拖焊整排引脚最后用洗板水清理残留。拖焊时烙铁温度不要太高380度左右锡丝用0.5mm的细锡丝焊出来的效果和机器贴片差不多。6. 上电联调、问题排查与量产隐患6.1 上电前必做的检查清单第一次上电不要急着插电池先用可调电源限流100mA给板子的3.3V网络单独供电确认没有短路。把万用表打到蜂鸣档量一下3.3V对地和电池正极对地的阻抗如果接近零就直接排查焊接。检查清单我整理成这几项3.3V对地阻抗正常应该在几百欧以上MBED核心板这类有LED的会更低但不会接近零电池正极到保护IC、保护IC到TPS63020输入的连线是否导通BOOT0确实是低电平不是悬空8MHz晶振两个引脚对地都能量到几十皮法的电容确认没有虚焊SWD排针的四根线特别是SWDIO和SWCLK有没有和旁边引脚短路这套检查做完再上电至少能排除八成的低级错误。我见过太多人焊完板子直接接电池结果芯片冒烟或者ST-Link报错追查半天发现只是某个电容焊反了。6.2 SWD无法连接问题排查SWD连不上是这类板子最典型的问题我把它单拎出来说。下面这张表基本覆盖了我实际遇到过的所有情况现象可能原因处理方法ST-Link报No target connected3.3V没供上或MCU虚焊万用表确认VDD引脚电压补焊MCU连接失败且芯片发热电源短路或芯片焊接方向错误断电检查3.3V对地阻抗排查短路点能识别芯片但烧录校验失败SWD信号线串阻过大或线缆过长降低SWD时钟到1MHz检查线缆连接板子上电后无法进入调试BOOT0被拉高进入ISP模式确认BOOT0为低电平休眠后调试器连不上MCU进入Stop/Standby模式接上NRST引脚在调试器里配置reset连接烧录一次后第二次连不上代码把PA13/PA14复用成普通IO按住复位键同时点击连接趁机擦除芯片最后一条要重点展开说。F103的SWD引脚是可以被软件重新配置成GPIO的一旦程序在初始化时把PA13或PA14设成了推挽输出调试器就再也无法连接。解决办法是按住复位按键让MCU一直处于复位状态然后在IDE里点击连接在连接成功的一瞬间松手调试器就能趁复位释放前进入调试模式并擦除Flash。如果复位电容太大这个窗口可能很短所以之前强调复位电容不要用太大就是为这种场景留后路。6.3 锂电池供电下的稳定性问题锂电池供电和USB供电一个很大的区别是动态响应。锂电池内阻会随着电量降低而增大当系统突然启动电机、射频模块或者屏幕背光时电池电压会瞬间跌落几百毫伏。如果3.3V电源的储能电容不够MCU就可能发生欠压复位。我的解决方案是在3.3V输出端加了一颗470uF的电解电容同时确保DC-DC的环路的瞬态响应足够快。加了这颗电容之后负载突变时的电压跌落从将近200mV降到50mV以内系统非常稳定。还有一个容易忽略的问题ADC采集电池电压时如果分压电阻离MCU的ADC引脚太远采样值会在充电器接入和断开瞬间跳变。我在固件里做了软件滤波连续采样8次去掉最大最小值再取平均效果立竿见影。如果你追求更高精度可以用两个10kΩ电阻分压后再接一个100nF电容到ADC引脚构成一个简单的低通滤波器截止频率大概在160Hz左右能滤掉大部分开关噪声。量产阶段我建议在固件里开启读保护也就是RDP Level 1。开启之后SWD接口只能执行全片擦除和重新烧录不能直接读出Flash内容这对保护固件代码很重要。但要注意一旦设置了读保护后续每次调试都要先擦除整个芯片所以开发阶段不要开只有准备量产或发样机时才开。另外现在国产替代型号越来越多GD32F103、AT32F103等封装和引脚基本兼容硬件上一般可以直接替代但烧录算法和部分外设寄存器细节有差异开新项目前务必查一下对应厂商的参考手册。这块板子在设计时我已经预留了兼容国产芯片的考虑项目切BOM时不用改PCB只需要换元件和烧录算法即可。说到最后我自己最深的体会是自己画最小系统板这件事收益其实是复利式的。第一次画的时候确实慢电源选型、去耦布局、SWD保护这些都要查资料、做实验但画完一次之后原理图模块、PCB封装、调试经验都沉淀了下来后面再做任何STM32的项目都是从这个底座上迭代效率反而比一直买核心板更高。如果你也想动手试我建议第一版不要贪功能电源加MCU加SWD加一颗LED跑通之后再去加充电、加传感器、加屏幕。先把最小闭环跑起来后面的路会顺很多。
返回列表