STM32H745xI双核芯片SMPS与LDO配置不当导致复位失败排查实录

发布时间:2026/9/20 12:42:48
STM32H745xI双核芯片SMPS与LDO配置不当导致复位失败排查实录 1. 项目背景与核心问题拆解STM32H745xI 这颗双核芯片Cortex-M7 跑 480MHz、Cortex-M4 跑 240MHz片上还集成了 SMPS开关电源和 LDO低压差线性稳压器两套供电架构。很多人第一次上手 H745 的时候注意力全放在双核通信、Cache 一致性、内存分配这些高级话题上结果板子一上电就卡在复位阶段——连main函数都进不去调试器连上去发现内核停在0xFFFFFFFE或者反复触发上电复位。这种问题十有八九不是代码写错了而是 SMPS/LDO 的配置没搞对。我最近刚做完一个基于 STM32H745XIH6 的项目板子是自己画的电源部分参考了官方评估板的思路但做了简化。结果第一批板子回来五块里有三块上电后调试器识别不到内核另外两块能识别但跑几秒钟就复位。折腾了整整两天从电源纹波查到 Option Bytes最后定位到问题出在 SMPS 和 LDO 的配置组合上。这篇文章就把整个排查过程、原理分析和最终解决方案完整复盘一遍适合正在用 H745/H747/H750 系列、或者准备画双核 H7 板子的朋友参考。核心关键词先摆出来STM32H745xI、SMPS、LDO、复位失败、双核芯片。这几个词贯穿全文也是所有问题的交汇点。LDO 的工作原理、LDO 电路设计这些基础概念我会在必要的地方用生活化的方式解释清楚确保没有电源背景的读者也能跟上。2. 为什么 H745 的供电架构容易踩坑2.1 SMPS 和 LDO 到底是怎么分工的STM32H745xI 内部集成了一个 SMPS 降压转换器和一个 LDO。这两个模块不是二选一的关系而是可以协同工作的。芯片的供电输入是 VDD典型 3.3V内部核心电压 VCORE 需要 1.0V 到 1.2V 左右具体取决于频率等级。这个 VCORE 可以由 LDO 单独提供也可以由 SMPS 提供或者 SMPS 和 LDO 并联一起供。LDO 的工作原理说白了就是一个自动可变电阻输入 3.3V输出 1.2V中间那 2.1V 的压差全部变成热量耗散掉。它的优点是输出纹波极低、响应快、电路简单缺点是效率低、发热大。SMPS 则是一个开关降压电路效率能到 85% 以上但输出纹波比 LDO 大需要外接电感和电容。H745 的设计逻辑是默认情况下用 LDO 给 VCORE 供电保证上电就能跑如果你的应用对功耗敏感可以切换到 SMPS 模式或者用 SMPSLDO 并联模式来兼顾效率和纹波。问题就出在这个切换上——切换的配置是通过 Option Bytes 和电源控制寄存器共同决定的一旦配置和实际硬件不匹配芯片就会在复位阶段反复重启。2.2 复位失败的典型现象和根因分类我把实际遇到的复位失败现象归了三类每类的根因不同现象可能根因排查方向调试器完全识别不到内核SMPS 配置为启用但外部电感未焊接或参数错误检查 SMPS 外围电路能识别但反复复位LDO 和 SMPS 同时使能但 VCORE 建立时序冲突检查 Option Bytes 和 PWR 寄存器运行几秒后复位SMPS 输出纹波过大导致 VCORE 跌落示波器测 VCORE 纹波这三类现象我全遇到了。最坑的是第二类因为调试器能连上你会以为是代码问题实际上芯片在复位和运行之间反复横跳调试器的连接也是断断续续的。2.3 官方文档里没明说的几个细节参考手册 RM0399 里关于 SMPS 和 LDO 的章节写得很详细但有几个关键点藏得很深第一SMPS 的使能不是单纯写一个寄存器位就完事它和 Option Bytes 里的SMPS_EN以及SMPS_EXT位有联动关系。如果你在代码里直接写 PWR 寄存器使能 SMPS但 Option Bytes 里没配置对应的外部元件类型芯片会进入一个未定义状态。第二LDO 在 SMPS 使能后并不会自动关闭而是进入并联模式。这个模式下 LDO 仍然在输出电流只是分担的比例降低了。如果你以为 LDO 关了就不管它的散热长时间运行可能会触发过热保护。第三双核芯片的复位行为比单核复杂。M7 和 M4 有各自的复位源但 VCORE 的建立是全局的。如果 VCORE 还没稳定M7 先跑起来去访问 M4 的域就会触发总线错误表现为复位。注意在调试 SMPS/LDO 相关问题时先把调试器的复位方式改成Connect under reset否则芯片反复复位会导致调试器无法建立稳定连接。3. 硬件设计阶段的避坑要点3.1 SMPS 外围电感选型不是随便找个 2.2uH 就行STM32H745xI 的 SMPS 推荐电感值是 2.2uH但这个 2.2uH 是有条件的饱和电流要大于 SMPS 的峰值电流直流电阻要足够小自谐振频率要高于 SMPS 的开关频率。我第一批板子用的是某国产 2.2uH 电感饱和电流标称 1.5A看起来够用但实际上 SMPS 在启动瞬间的峰值电流能到 1.2A 以上加上温度降额电感进入饱和区输出电压直接塌了。选电感的实操标准饱和电流至少留 50% 余量建议选 2A 以上的直流电阻小于 50mΩ否则效率掉得厉害自谐振频率大于 10MHzSMPS 开关频率典型 2MHz 左右封装优先选屏蔽式减少 EMI我后来换了一颗 2.2uH/3A 的屏蔽电感复位问题直接少了一半。3.2 输出电容的 ESR 和容值搭配SMPS 输出端的电容不是越大越好。容值太大启动时的充电电流会触发限流容值太小纹波压不住。官方推荐是 2 颗 10uF 的陶瓷电容并联再加一颗 100nF 的高频去耦。我实际测试下来用 2 颗 22uF 的 X5R 陶瓷电容效果更稳但要注意 X5R 在 1.2V 偏压下的容值衰减能到 30% 以上实际有效容值可能只有 15uF 左右。LDO 输出端的电容也有讲究。LDO 对输出电容的 ESR 有要求ESR 太低反而可能导致环路不稳定。我用的是 10uF 陶瓷电容串联一个 10mΩ 的电阻实测纹波和稳定性都很好。3.3 VCORE 和 VDD 的去耦布局双核芯片的电流需求比单核大得多M7 全速跑的时候 VCORE 电流能到 400mA 以上。去耦电容必须尽量靠近芯片的 VCORE 引脚走线要短而粗。我第一版 PCB 把去耦电容放在了芯片背面过孔只有 0.3mm结果 VCORE 纹波在 M7 满载时飙到 80mV远超手册要求的 40mV 以内。改进后的布局每个 VCORE 引脚配一颗 100nF 电容放在同一层距离不超过 3mm每两个引脚配一颗 1uF 电容整体再并一颗 10uF 电容过孔用 0.5mm 以上每个焊盘至少两个过孔4. 软件配置与 Option Bytes 的联动关系4.1 Option Bytes 里 SMPS 相关位的含义STM32H745xI 的 Option Bytes 里有两个关键位SMPS_EN和SMPS_EXT。这两个位的组合决定了芯片上电时对 SMPS 的初始化行为SMPS_ENSMPS_EXT行为0xSMPS 禁用仅 LDO 供电10SMPS 使能使用内部功率管11SMPS 使能使用外部功率管这里最容易踩的坑是SMPS_EN1且SMPS_EXT0时芯片认为你用的是内部功率管但 H745xI 的内部功率管驱动能力有限如果你的负载电流超过 200mAVCORE 会跌落。我一开始就是设了这个组合结果 M7 一跑浮点运算就复位。正确的做法是如果你的板子上有外部电感和功率管把SMPS_EXT设为 1如果只是用内部功率管确保负载电流不超过 150mA或者干脆用 LDO 模式。4.2 代码里切换 SMPS/LDO 的正确顺序在代码里动态切换 SMPS 和 LDO 是有严格顺序的顺序错了就会触发复位。正确的流程是确保系统时钟切换到 HSI 或 CSI不要用 PLL关闭所有外设时钟降低负载配置 PWR 寄存器使能目标电源模式等待PWR_CSR1里的ACTVOSRDY位稳定切换系统时钟回 PLL重新使能外设我一开始图省事直接在 PLL 全速运行时写 PWR 寄存器结果芯片立刻复位。后来老老实实按顺序来问题消失。4.3 双核启动时的电源时序H745 的双核启动有个默认顺序M7 先启动然后 M7 释放 M4 的复位。但如果 VCORE 在 M7 启动时还没完全稳定M7 去访问 M4 的域就会触发 HardFault。我的做法是在 M7 的启动代码里加一段等待// 等待 VCORE 稳定 while ((PWR-CSR1 PWR_CSR1_ACTVOSRDY) 0) { // 空转等待 } // 再释放 M4 RCC-GCR | RCC_GCR_BOOT_C2;这段代码看起来简单但少了它M4 的启动成功率大概只有 70%。5. 复位失败后的精准排查流程5.1 第一步确认复位源STM32H745xI 的RCC_RSR寄存器记录了上一次复位的原因。上电后第一件事就是读这个寄存器把复位源打印出来。常见的复位源有BORRSTF欠压复位说明 VCORE 或 VDD 跌落PINRSTF外部复位引脚触发SFTRSTF软件复位IWDGRSTF看门狗复位LPWRRSTF低功耗模式复位如果读到BORRSTF基本可以确定是电源问题直接往 SMPS/LDO 方向查。5.2 第二步用示波器抓 VCORE 波形调试器读寄存器只能告诉你发生了什么示波器才能告诉你为什么发生。把示波器探头接到 VCORE 的测试点上触发方式设为下降沿阈值设 0.9V。正常情况下的 VCORE 应该是一条平稳的 1.2V 直线纹波在 40mV 以内。我抓到的异常波形有三种启动时有一个明显的凹陷跌到 0.8V 再恢复——这是 SMPS 启动电流不足周期性跌落间隔几毫秒——这是 LDO 和 SMPS 打架高频振荡幅度 100mV 以上——这是电感或电容选型不对5.3 第三步分步禁用 SMPS 和 LDO如果示波器波形看不出明显问题可以用二分法排查先把 SMPS 完全禁用只用 LDO 供电看复位是否消失。如果消失了问题在 SMPS如果还在问题在 LDO 或别的地方。禁用 SMPS 的方法有两种改 Option Bytes 把SMPS_EN清零或者在代码里写 PWR 寄存器。推荐改 Option Bytes因为这是芯片上电时的默认行为不受代码影响。5.4 第四步检查 Option Bytes 的实际值Option Bytes 有时候会被意外修改尤其是用了某些烧录工具或者跑了不规范的代码。用 STM32CubeProgrammer 连上芯片读一遍 Option Bytes 的实际值和你的预期对比。我遇到过一次代码里明明没动 Option Bytes但实际读出来SMPS_EN是 1后来发现是之前烧录的一个测试程序改了它没改回来。提示每次修改 Option Bytes 后芯片会自动复位一次。如果你在调试过程中发现芯片莫名其妙复位先想想是不是刚改了 Option Bytes。6. 常见问题速查与独家避坑技巧6.1 问题速查表问题现象最可能原因快速验证方法解决方案调试器识别不到内核SMPS 使能但电感未焊万用表测电感两端是否导通补焊电感或禁用 SMPS上电后立即复位VCORE 建立时间不足示波器抓 VCORE 启动波形增加软启动延时运行中随机复位SMPS 纹波过大示波器测 VCORE 纹波更换电感或增加输出电容M4 核启动失败VCORE 未稳定就释放 M4读 RCC_RSR 确认复位源加等待 ACTVOSRDY 的代码发热严重LDO 和 SMPS 同时满载测 LDO 输出电流降低负载或切换纯 SMPS 模式6.2 独家避坑技巧第一个技巧在 PCB 上给 SMPS 的电感和电容预留多个焊盘位置方便后期调整。我第二版板子就留了三个电感位置分别对应 1.5uH、2.2uH、3.3uH调试的时候直接换不用飞线。第二个技巧VCORE 的测试点一定要留而且要用小焊盘减少探头引入的寄生电容。我一开始用大焊盘示波器探头一碰上去波形就变了后来换成 0.5mm 的测试点波形真实多了。第三个技巧如果实在搞不定 SMPS直接用 LDO 模式也能跑只是功耗高一点。H745 在 LDO 模式下M7 全速跑的电流大概 300mA芯片表面温度能到 60 度左右加个小散热片就能长期稳定运行。对于不追求极致功耗的项目LDO 模式是最省心的选择。第四个技巧双核项目的调试顺序很重要。先让 M7 单独跑起来确认电源稳定再释放 M4。我见过有人一上来就双核同时跑结果复位问题查了一周最后发现只是 M4 的启动地址配错了。6.3 关于 LDO 工作原理的一个补充很多人对 LDO 的理解停留在降压层面其实 LDO 的核心是一个负反馈环路采样输出电压和基准电压比较误差放大器控制调整管的导通程度。这个环路的稳定性取决于输出电容的 ESR 和负载电流。负载电流越小环路越容易振荡。所以如果你在低功耗模式下发现 VCORE 有低频振荡大概率是 LDO 环路不稳定换一个 ESR 合适的输出电容就能解决。7. 最终方案与实测数据经过两天的排查和三轮改板最终确定的方案是SMPS 使能使用外部功率管模式SMPS_EN1, SMPS_EXT1电感选用 2.2uH/3A 屏蔽式直流电阻 35mΩ输出电容 2 颗 22uF X5R 并联 1 颗 100nFLDO 保持使能作为并联备份M7 启动代码里加ACTVOSRDY等待Option Bytes 用 CubeProgrammer 锁定防止意外修改实测数据VCORE 纹波在 M7 满载时 28mVM4 满载时 32mV双核同时满载 38mV都在手册要求的 40mV 以内。连续运行 72 小时无复位芯片表面温度 45 度。这套方案不是唯一解但在我这个项目里验证下来是最稳的。如果你也在用 H745xI 或者同系列的 H747/H750遇到复位问题可以先从 SMPS/LDO 的配置查起大概率能少走很多弯路。