尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

STM32L4在1.8V供电下Flash编程电流翻倍?实测归因与解决策略

STM32L4在1.8V供电下Flash编程电流翻倍?实测归因与解决策略 前阵子调一块基于STM32L496RGT6的低功耗采集板为了让主控和一颗1.8V供电的传感器共用一个电源轨整板直接跑在1.8V上。待机功耗做得挺漂亮睡眠电流能压到3μA以内但一接上ST-Link准备烧录就发现了问题编程时的整板电流明显偏高峰值比同一块板子用3.3V供电时翻了一倍都不止。当时的第一反应是电路哪里短路了或者LDO选型不对但测下来功能一切正常程序也能正常烧进去。后来把示波器、电流探头、万用表全部架齐花了一个下午才把问题彻底想明白。这篇文章把整个排查过程和背后的原理完整整理出来包括1.8V低电压下Flash编程电流为什么会升高、怎么区分正常范围和异常故障、以及几种实测有效的处理方案。适合正在用STM32L4系列做低电压低功耗项目、或者被类似“低压下功耗反常”问题困扰的开发者参考。1. 实测现象1.8V编程时多出来的电流到底有多少1.1 我的测试环境与基础数据先说测试环境避免后面讨论数据时各说各话。板子是一块自研的STM32L496RGT6核心板VDD由外部低噪声LDO供电可调输出1.8V或3.3VVCAP按数据手册接了2.2μF陶瓷电容调试接口是标准SWD使用ST-Link/V2。电流测量采用串联采样电阻法用1Ω电阻串在LDO输出与VDD之间示波器测电阻两端压差换算电流同时用万用表测平均电流做参考。实测下来的基础数据如下MCU跑在8MHz HSI、While(1)空转、无外设开启时3.3V下整板电流约2.5mA1.8V下约1.8mA——这个趋势符合预期因为数字电路动态功耗与VDD平方成正比。但进入Flash编程状态后情况完全不同。测量项VDD3.3VVDD1.8V空闲运行电流8MHz HSI, while(1)约2.5mA约1.8mASWD编程峰值电流擦写瞬间约14-18mA约28-35mASWD编程平均电流约8-10mA约19-23mA擦写脉冲持续周期20-40ms20-40ms需要说明这些数值是手头板子的实测量级不同板子、不同固件会有差异但趋势是一致的1.8V下编程峰值电流大约是3.3V下的2倍左右。如果你的板子和这个比例差距很大那就值得仔细查一查了。1.2 怎么判断“偏高”是正常还是异常这是排查的第一步也是最容易被忽略的一步拿到一个偏高的电流后先别急着改电路先判断它属于物理上的正常现象还是真正的故障。Flash编程不是普通的数字逻辑工作它内部有一个高压发生器在工作这部分功耗有一条固定的基线。我的经验判断方法是用同一块板子分别测3.3V和1.8V下的编程峰值电流做A/B对照。如果1.8V峰值落在3.3V峰值的1.3到2.0倍区间大概率是正常的物理现象如果超过2.5倍甚至3倍才需要怀疑电路、接口或配置有问题。还要区分“持续偏高”和“脉冲尖峰偏高”。持续偏高一般指向静态通路比如调试器电平不匹配、外设被意外使能、电源倒灌脉冲尖峰偏高则多半来自Flash擦写瞬间的高压发生器工作。用手摸一下电流波形的包络心里大概就有数了。2. 原理拆解为什么电压越低编程电流反而越大2.1 Flash编程高压从哪来STM32L4系列的内部Flash擦写不是把VDD直接加到存储单元上完成的。浮栅晶体管的编程需要较高的电压大致在6V量级用来驱动电子隧穿注入浮栅擦除时还要更高的负压或正压偏置。所以芯片内部有一个高压发生器本质上是一个电荷泵升压电路从VDD抽取能量升到Flash工艺需要的编程电压。这里的关键在于Flash编程需要注入的电荷量主要由编程脉冲幅度、宽度和工艺决定基本不随VDD变化。也就是说无论你供电是3.3V还是1.8VFlash编程时高压侧消耗的功率大致是恒定的。输入电压低了为了维持同样的输出功率输入电流必须升高——这是能量守恒决定的跟芯片是否“坏”没有关系。2.2 用功率守恒算一笔账我做一个简化估算来直观展示这个效应。假设某次擦写瞬间芯片内部总功率需求约30mW包含Flash高压发生器、数字逻辑、调试接口、模拟监控电路。3.3V供电时I 30mW / 3.3V ≈ 9.1mA1.8V供电时I 30mW / 1.8V ≈ 16.7mA仅仅因为电压从3.3V降到1.8V电流就涨了83%。实际情况比这更糟因为电荷泵升压倍数变大后转换效率还会下降。3.3V升到6V只需要约1.8倍1.8V升到6V需要约3.3倍多级倍压或更长的充电周期都会带来额外损耗。按70%的效率折算1.8V下输入电流可能在24mA左右再叠加其他开销峰值到30多毫安完全解释得通。打个生活化的比方你家里用变压器给一个固定功率的电器供电如果输入电压从220V降到110V电器功率不变输入电流大约要翻倍。MCU内部电荷泵就是这个变压器。2.3 除了电荷泵还有谁在偷偷耗电电荷泵是主要因素但不是全部。排查过程中我还发现几个次要但不可忽视的电流来源这里一并列出来内部核心LDOSTM32L496的VCAP脚外接电容内部LDO负责把VDD降到核心电压。3.3V供电时LDO压差约2V1.8V供电时压差只有约0.6V压差降低看似省电但在接近Dropout电压时LDO内部的偏置和驱动电路反而可能消耗更多电流瞬态响应也变差。低电压监控电路BOR/PVD这些电路在低电压下需要额外的偏置来维持精度实测下来有μA级的差异虽然不大但在讲究“每个μA都要省”的低功耗项目里也算一笔账。SWD调试接口电平不匹配这是最容易出大问题的地方后面会详细讲。当调试器以3.3V逻辑驱动1.8V的目标板时I/O口可能进入半导通状态产生数毫安甚至十几毫安的额外电流。调试模式下的时钟树调试器连接时有时会把内核时钟配置得比应用默认值更高动态功耗C×V²×f里的f变大电流自然上升。不过1.8V下的C×V²比3.3V低约70%这部分倒不是主要矛盾。Flash位线/字线驱动电路低电压下内部驱动能力下降为了维持相同的编程电压偏置驱动级需要更大的电流补偿。用一个表格汇总这些电流来源的变化趋势看起来更清楚电流来源1.8V下变化趋势量级估计Flash电荷泵显著增大升压倍数翻倍效率下降增加约5-10mA内部核心LDO瞬态在Dropout边缘变差偏置电流增加μA~mA级BOR/PVD监控低电压下偏置略增μA级SWD接口电平不匹配可能产生半导通电流甚至倒灌数mA至十余mA数字逻辑动态功耗降低V²减小减少30%-70%3. 排查实录先排除“假象”再找真凶3.1 第一步确认测量方法没有骗你我一开始直接用万用表的mA档串联在电源路径上测平均电流读数确实比3.3V时高但波形细节完全看不到。Flash编程电流是脉冲性的擦写瞬间有尖峰平时相对较低万用表的积分平均值会把尖峰平滑掉而且万用表的检流电阻在编程大电流时可能产生数百毫伏压降把VDD拖到BOR复位阈值以下导致电流波形直接乱掉。正确的做法是串联一个低阻值采样电阻用示波器测电阻两端压降。但我前面也踩了坑先用10Ω电阻编程峰值35mA压降就是350mV1.8V的VDD被硬生生拉低到1.45V程序进入反复复位状态。换成1Ω后压降只有约35mV波形才干净。对于低电压场景采样电阻建议从1Ω开始如果示波器灵敏度足够0.5Ω更好。这一步看起来基础实际是排查过程中最容易出偏差的环节。测量工具本身改变了电路工作点读出来的数据就全是假象。低电压低功耗场景下这句话尤其要记住。3.2 第二步检查VCAP与内部稳压器配置排除测量问题后我从芯片周边开始查。首先是VCAP脚STM32L496内部核心LDO的输出稳定性完全依赖VCAP外接电容手册要求典型值2.2μFESR不能太大。如果这个电容容值不足或ESR偏大低电压下LDO瞬态响应会变差编程时核心电流大VCAP电压跌落可能导致内部逻辑工作异常间接推高电流。我检查了VCAP电容容值正常示波器看VCAP引脚波形也稳。还检查了目标板是否有外部DC-DC模块因为有的板子会用DC-DC做一级降压再给MCU供电DC-DC的开关频率如果和编程脉冲产生拍频波形上会看到周期性干扰。我的板子是纯LDO方案这一步排除了。还有一个容易被忽略的点如果使用了STM32L4部分型号支持的内部SMPS模式用外部电感做DC-DC1.8V下对电感和电容参数的要求更严格。不过L496RGT6这个封装通常默认用LDO模式除非你手动配置切换到SMPS否则VCAP电容正常基本就够了。3.3 第三步排查SWD接口的电平配合这一步是我这次排查里的重头戏也是最容易出现“编程电流异常高”的元凶。我的ST-Link/V2是标准版本VTREF脚是用来检测目标板逻辑电平的。我之前这块板子一直用3.3V供电调试ST-Link的VTREF也接到了3.3V。这次改成1.8V供电后我犯了一个低级错误没有把VTREF改接到1.8VST-Link内部的电平逻辑还是按3.3V来走。后果是SWDIO和SWCLK信号的高电平仍然是3.3V直接打进了1.8V供电的目标板I/O。目标板I/O的电源轨是1.8V当外部输入电压高于VDD时I/O引脚内部的保护二极管会正向导通把电流从信号线倒灌进VDD轨。编程过程中SWD信号持续翻转这个倒灌电流非常可观。这次实测我特意对比了VTREF接1.8V和VTREF悬空两种状态下的编程电流差异大约有8mA——这正好解释了为什么我最初测到的1.8V编程峰值能达到30多mA而排除这个因素后降到了24mA左右。排查方法很简单把SWD排线拔出用外部电源给板子供电然后手动触发编程或者用示波器单通道抓SWDIO线上的电流对比有无SWD连接时的电流差异。如果差异超过几个毫安基本可以断定是电平匹配问题。正确做法是把ST-Link的VTREF接到目标板的1.8V电源轨或者使用支持1.8V逻辑电平的调试器如果用的是没有VTREF引脚的简化版调试器就需要在SWD信号线上加电平转换芯片。3.4 第四步检查复位、BOOT与供电网络排查到这里剩下的就是一些外围细节了。我用示波器同时抓了编程瞬间的VDD波形和电流波形。1.8V轨在编程时最低跌到1.73V左右没有低于1.62V的BOR阈值说明电源去耦基本够用不是电压跌落导致的异常。然后检查了NRST引脚板子上有一个100nF复位电容加10kΩ上拉电阻。如果编程器使用“connect under reset”模式会反复拉低复位线来同步连接复位电路的时间常数越大这个阶段越容易出现额外电流和时序不稳定。我改成了Normal Mode连接后复位相关的影响就消失了编程电流波形也稳定了一些。BOOT0引脚的状态也值得确认。有些设计为了省事把BOOT0悬空这在低电压下可能采样到不确定电平导致MCU进入意外的启动路径。正确做法是BOOT0接一个100kΩ下拉电阻确保稳定在低电平。如果你的板子BOOT0悬空编程电流偏高且行为诡异先把这个电阻补上再测。排查到这里我的结论已经清晰了1.8V下编程电流比3.3V高主因是电荷泵的物理规律次要因素是SWD接口电平不匹配造成的倒灌电流。后一部分是可以通过连接方式修正的修正后电流从32mA降到24mA左右剩下的就没有太多电路问题了。4. 解决问题把1.8V编程电流压回去的几种有效做法4.1 治本方案编程时临时抬高VDD如果条件允许最干净的做法是正常运行时用1.8V供电编程烧录时临时把VDD切到3.3V。这样Flash编程工作在额定电压范围内编程电流回到正常水平可靠性也最好。实现方式可以这样设计在板上放两个PMOS管一个管VDD连接到3.3V电源另一个管VDD连接到1.8V电源两个PMOS的栅极由控制信号选择导通。或者更简单一点用单个PMOS管源极接3.3V漏极接VDD正常运行时PMOS截止VDD由1.8V LDO供电编程时把PMOS导通3.3V直接供给VDD1.8V的LDO在输出侧被3.3V抬升相当于被强制关断或者自动钳位。需要注意两个电源切换时的时序问题不能在编程器已经建立连接之后再切换应该在连接之前完成。如果担心两个电源同时导通导致倒灌可以在两个电源输出各加一个肖特基二极管隔离。其实量产阶段更常见的做法是在板上预留一个3.3V跳线接口或测试点编程时用跳线帽短接让编程电源给整个板子供电烧录完成后再断开恢复1.8V模式。虽然多一个手工步骤但成本低、可靠、不占PCB面积。如果你做的是电池供电的小批量产品这个方案很实用。4.2 治标方案优化编程器与连接方式如果产品已经定型不方便改硬件那就要从编程器和连接端优化。首先确认VTREF接对。这个动作在研发阶段几乎零成本但收益最大。把ST-Link或J-Link的VTREF引脚接到目标板的1.8V电源轨上调试器就会自动把SWD信号的逻辑电平调整到1.8V彻底消除保护二极管倒灌的问题。实测下来单这一个调整就能让编程峰值电流降低约8mA。其次是降低SWD时钟频率。我把SWD频率从4MHz降到1MHz峰值电流略有下降原因是信号边沿变缓数字翻转时的瞬态电流尖峰减小。但代价是编程总时间变长平均电流未必下降多少。这个调整属于“有所取舍”适合对峰值电流敏感的场景不适合追求速度的场景。第三是缩短SWD排线。长飞线带来的寄生电感和电容会引起信号反射和振铃编程时I/O反复翻转振铃会导致多余的电流消耗。把排线从20cm缩短到10cm以内或者使用带屏蔽的排线能明显改善波形质量。关于编程模式也值得多提一句在ST-Link的调试器设置里如果选择“Connect under reset”模式复位线会在连接时被反复拉低这个过程本身就会产生额外的电流脉冲。对于非极端场景建议使用Normal Mode连接除非目标芯片的SWD口被禁用或者需要复位时序同步。4.3 可选的替代烧录路径UART Bootloader如果你用的是STM32L4系列芯片出厂自带UART bootloader可以通过BOOT0引脚进入系统存储器模式用串口烧录。这个方式在1.8V下有一个天然优势没有SWD持续时钟没有调试器的电平不匹配问题编程过程中芯片内部只有Flash控制器和串口外设在工作电流比SWD编程平稳得多。我特意测试过用官方STM32CubeProgrammer的UART模式在1.8V下烧录整板电流峰值大约只有SWD编程的六成左右而且波形更平缓。对于量产或现场升级场景这是个不错的思路。不过要注意UART bootloader本身需要UART引脚的电平匹配。如果你的目标板只有1.8V UART需要选一个同样支持1.8V逻辑的USB转串口模块否则又会出现信号电平不匹配的问题。另外UART烧录速度比SWD慢适合不以速度为优先的场景。如果应用支持OTA也可以在1.8V下先运行引导程序再通过无线把固件写入应用区。这种方式的好处是可以在固件里控制擦写入节奏比如分块擦写、每块之间加延时让电源“缓一口气”避免瞬间大电流冲击。代价是引导程序本身要占用Flash空间前期开发工作量更大。4.4 软件配置层面的微调最后还有几个软件层面的小技巧虽然对电流影响不如前面几个方案明显但积少成多。一是调试器连接后立刻把系统时钟降到较低频率。某些调试器在连接时会把内核时钟设置为较高值导致数字逻辑的动态功耗上升。在调试器的初始化序列里加入“把SYSCLK降到2MHz”的操作可以降低这部分电流。不过如果编程器在烧录过程中会重新初始化时钟ST-Link通常不会这个调整的效果就会被打折扣。二是确认目标板上没有外设被意外使能。比如编程时某个GPIO正好拉低了LED引脚、传感器模块被上电这会让编程电流里混入外设电流干扰判断。排查时可以测量“仅上电不烧录”和“烧录”两种状态的电流差。三是如果用STM32CubeProgrammer的命令行工具可以通过参数指定连接后的初始化动作。示例STM32_Programmer_CLI -c portSWD modeUR resetHWrst freq1800这个命令指定了SWD频率和复位模式虽然不能直接降低Flash编程本身的高压功耗但可以避免连接阶段因频率/复位策略不当产生的额外电流。对比一下四种方案的适用场景方案改动量效果适用阶段临时切换3.3V供电硬件改动较大最彻底编程电流恢复正常量产/研发均可修正SWD电平VTREF接1.8V零改动消除倒灌可降约8mA研发阶段首选UART Bootloader软件/连接改动电流平稳峰值更低量产/现场升级降低时钟/关闭外设配置改动微调效果有限研发阶段辅助5. 低电压项目设计阶段的几个预防点5.1 电源架构设计上提前留一手在这次排查之后我回头审视了这块板子的原理图最遗憾的就是没有提前在电源树上预留3.3V接入点。如果一开始就在LDO输出侧加一个跳线或PMOS切换节点排查时间至少能省一半。对于确定要用1.8V VDD的新项目我有几个具体建议先查目标芯片手册中Flash编程电流相关的电气参数虽然手册不一定覆盖1.8V下的完整曲线但会给出最大值参考据此设计电源裕量。在板上预留一个3.3V烧录接入点哪怕只是一个焊盘研发阶段和量产阶段都会很方便。去耦电容组合建议用10μF喂瞬态多个100nF滤高频比单纯堆100nF效果好得多。编程电流是几十毫安级别的脉冲10μF电容能明显抑制VDD跌落。如果主电源是LDO注意LDO的瞬态响应能力。有些低功耗LDO带宽很低负载从1mA跳到30mA时会跌出BOR阈值选型时要看负载瞬态响应指标不能只看静态功耗参数。5.2 调试接口电平设计这是我在1.8V项目上最深刻的教训不要把SWD接口当作理所当然的外设它的电平兼容性必须在原理图阶段就设计好。我的建议是在SWD接口旁边预留一个电平转换芯片的位置比如1.8V到3.3V的双向电平转换器哪怕初期不贴片也要在PCB上留好焊盘。一旦遇到调试器输出电平不匹配的问题补焊一颗芯片就解决了不用飞线。另外SWDIO和SWCLK的上下拉电阻不要为了省电而全部省掉。虽然这两个引脚在调试时会有明显电流消耗但完全悬空会导致连接不稳定甚至出现奇怪的电流尖峰。建议按照参考设计保留弱上拉或弱下拉10kΩ-100kΩ并在PCB上引出测试点方便调试时测量。VTREF走线也要注意它是调试器的参考电平信号走线尽量粗短避免被其它信号干扰。有些低成本调试器没有VTREF引脚这时候要么换调试器要么在SWD信号线上加电平转换没有第三条路。5.3 其他值得记录的小教训几个我在这次调试中踩过的坑无论对新手还是老手都会有点参考价值用万用表uA档串在电源里测量低功耗电流时要特别注意检流电阻的压降。万用表uA档的内阻通常很大在几十个μA的电流下就可能产生上百毫伏压降而STM32L4在1.8V时的BOR阈值可能就在1.62V附近压降稍大就会导致芯片反复复位电流读数完全失真。测低功耗电流时优先用示波器采样电阻或者专用电流探头。编程瞬间用示波器同时抓VDD和电流波形是一招非常高效的定位方法。如果电流尖峰出现的同时VDD有大幅跌落那大概率是供电能力或去耦不足如果VDD稳定但电流仍然偏高就转向接口电平、芯片配置方向排查。这个方法在调试任何低电压系统时都通用。如果板子始终存在无法解释的偏高电流拿原厂评估板做同条件对照实验是最快的办法。把评估板也调到1.8V用同一个调试器和同一套连接线测标准板子的编程电流。如果原厂板在同样条件下也是20多mA基本说明你的板子没问题问题出在测量方法或连接方式上。固件库版本也值得关注。早期版本的HAL库在低电压Flash编程时钟配置上可能偏保守导致编程时序延长、总能耗增加。升级到较新版本并核对参考手册中Flash等待周期与电压的对应关系在1.8V下尤为重要。这属于“冷门但真实存在”的优化点。最后说句实在话1.8V低电压下Flash编程电流比3.3V高这在很大程度上是物理规律电压降了、供电电流自然得补不必一看到几十毫安就怀疑板子坏了。真正需要警惕的是那些本不该出现的电流——比如调试器电平不匹配导致的倒灌、VCAP电容失效带来的LDO不稳定。把这几个点挨个查完基本都能定位。如果未来你也要做类似低电压项目建议在原理图阶段就把编程供电切换和调试接口电平转换设计进去后面能省去大量排查时间。
返回列表