ARTICLE DETAIL

资讯详情

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

STM32电源引脚完全指南:VDD/VDDA/VBAT接法与去耦电容详解

STM32电源引脚完全指南:VDD/VDDA/VBAT接法与去耦电容详解 先把结论放在前面市面上那些标着“VCC”的STM32最小系统板绝大多数是把3.3V电源网络直接冠了个通用名而STM32芯片自己的引脚命名里并没有VCC。真正决定你能不能点亮芯片、能不能让ADC读数稳定、能不能让RTC掉电后继续走时的是VDD、VSS、VDDA、VSSA、VBAT这几组引脚的正确接法。搞错一个轻则数据乱跳重则芯片直接冒烟。我最早焊自己的STM32F103C8T6核心板时就是因为没搞明白VDDA和VBAT的接法折腾了整整一个周末。板子能通过ST-Link下载程序GPIO翻转也正常但一旦开启ADC采集读出来的数值就像喝醉了酒一样乱飘换了三块传感器板子都无解。后来老老实实翻开数据手册对照电源引脚逐一检查才发现VDDA被我用一根飞线悬空了。改过来以后ADC数据立刻安静下来。从那以后我对电源引脚再也不敢凭感觉接。这篇文章就把STM32的电源引脚一次性讲透从命名规则、功能划分到完整的接线参考图、去耦电容选型再到不同应用场景下的接法以及接错之后的典型症状和排查方法。适合正在画第一块STM32板子的新手也适合毕业设计做到一半发现电源部分有问题想查漏补缺的同学。1. 先搞清楚STM32为什么没有VCC引脚1.1 VCC这个称呼到底是从哪来的VCC这个叫法历史比STM32早得多。早期晶体管电路里VCC指连接到集电极Collector的电源正端后来被广泛借用为“电路主供电”的代称。你去看74系列逻辑芯片、运放、Arduino开发板很多都把主电源标成VCC。所以很多学习嵌入式的人从小接触的芯片全是VCC到了STM32这里发现引脚表里全是VDD第一反应就是找“哪个脚是VCC”然后习惯性地把PCB上的3.3V网络也命名为VCC。这个习惯本身没有问题问题在于VCC只是一个泛称它没有区分数字电源、模拟电源、备份电源这三类完全不同的供电域。STM32的数据手册和参考手册里电源引脚一律使用VDD、VSS、VDDA、VSSA、VBAT这样的标准名称每一个引脚对应芯片内部一片特定的电路区域。用VCC去模糊称呼看似省事到了排查问题的时候就容易出乱子。1.2 STM32电源引脚全家桶拿最常见的STM32F103系列来举例在LQFP48封装就是C8T6那个封装下你在数据手册引脚定义里能看到这么几组电源引脚引脚名全称含义供电对象典型电压VDD数字电源正极内核、Flash、GPIO、片上数字外设3.3VVSS数字电源地上述电路的回路地0VVDDA模拟电源正极ADC、DAC、温度传感器、复位电路、内部参考电压、PLL3.3VVSSA模拟电源地上述模拟电路的回路地0VVBAT备份电池电源RTC(实时时钟)、备份寄存器1.8V~3.6V典型3VVREFADC/DAC参考电压正极ADC模拟量程上限、DAC输出上限2.4V~VDDA典型3.3VVCAP内部调压器滤波电容内核1.8V供电稳定外接电容这里要特别注意VREF。在STM32F103的48脚以及64脚这些封装里VREF在内部已经和VDDA绑定了数据手册会标明这两个引脚在内部连接所以外部不需要单独接。但在100脚及以上的大封装里VREF是独立的引脚允许你外接一颗高精度基准源来提升ADC的绝对精度。1.3 为什么要分数字电源和模拟电源这可能是理解整篇文章最关键的思维转换数字电路和模拟电路虽然共用同一个地但它们的电流行为完全不同。数字电路的特点是开关瞬态电流大且频率高。当STM32内核时钟跑到72MHz引脚翻转、总线切换时从电源引脚抽取的电流会瞬间跳变频率成分可以达到几十到上百MHz。这些瞬态电流会在电源走线的寄生电感上产生压降形成高频噪声也就是俗称的“数字开关噪声”。模拟电路则恰恰相反。ADC的采样原理是拿输入电压和参考电压比较参考电压上叠加任何噪声都会直接变成采样值的误差。如果让ADC的参考电源引脚和数字电路完全共用一个未经处理的3.3V那么芯片内部一两百万个晶体管翻转带来的噪声就会顺着电源网络窜进ADC的参考电压里表现出来的现象就是程序一跑起来、外设一打开ADC读数就开始飘。所以STM32把模拟电源单独引出来让你在PCB上通过磁珠或电感把VDDA和VDD连接起来让数字噪声难以通过高频阻抗进入模拟域。这不是硬件工程师强迫症是芯片内部模拟电路正常工作的前提。2. VDD、VDDA、VBAT到底各接多少电压能不能直接并一起2.1 一组内部数据线一套3.3V供电方向对了就不会翻车嵌入式开发板上几乎清一色3.3V供电。STM32大部分型号的VDD范围是2.0V到3.6V典型值3.3V。以F103为例所有VDD引脚必须全部接到同一个3.3V网络一个都不能漏。很多人看到芯片有4个VDD、4个VSS觉得接一个意思一下就行这是不行的。芯片内部是一个完整的功率网络多个VDD引脚分别给不同区域的数字逻辑供电。漏接一两个引脚不代表芯片完全无法工作但会引起局部供电电流回路变长、地弹增大表现为系统频率稍高就死机、GPIO驱动大负载时波形畸变、USB枚举不稳定等定位起来非常头疼的问题。还有一个容易踩的坑STM32的VDD不能直接接5V。除了少数明确标称支持5V宽容输入的型号比如F0系列部分型号有5V容忍引脚但那是针对GPIO输入不是电源绝大多数STM32的VDD超过3.6V就属于超规格工作。加上如今很多同学用的AMS1117-3.3是从5V USB取电降压的如果LDO的输入输出搞反、或者用了可调版本而反馈电阻焊错输出直接变5V芯片瞬间就冒烟了。所以焊完板子先量电压再上芯片是我反复强调的习惯。2.2 VDDA的接法不是简单的“把两个引脚并一起”VDDA和VDD确实都接3.3V但连接方式有讲究。正规做法是VDD直接来自3.3V电源网络VDDA通过一颗磁珠或小阻值电阻再接到同一个3.3V网络。磁珠在低频直流下阻抗几乎为零保证VDDA能拿到和VDD一样的电压在高频下阻抗快速上升把从数字侧窜过来的开关噪声隔离在磁珠的另一端。用0欧电阻也是可以的。0欧没有滤波效果但至少保留了把模拟电源和数字电源在PCB上物理断开的可能性方便调试时做割线测量。在很多官方评估板上VDDA就是通过0欧电阻和100nF电容组合处理的。关键点在于VDDA引脚旁边必定要放一颗100nF电容到VSSA这是芯片数据手册明确要求的。这颗电容的作用是给ADC内部的采样电容提供瞬态电荷让模拟参考电压在ADC采样瞬间能够快速稳定。省掉这颗电容ADC在高阻抗输入信号源下的读数会明显不稳定。需要特别提醒的是STM32F103系列里VDDA的电压范围在数据手册中通常标注为2.4V到3.6V也就是VDDA允许比VDD略低但不要低于2.4V。如果你做的是低电压系统比如VDD降到2.0V工作VDDA也要跟着降到对应的允许范围内不能单独给它供3.3V。2.3 VBAT到底是接电池还是接3.3VVBAT是专门给RTC和备份寄存器供电的引脚。在F103里只要VDD正常供电RTC就是由VDD通过内部电源开关供电的当VDD掉电后内部开关自动切换到VBAT由外部电池或超级电容维持RTC走时和备份寄存器内容。所以VBAT的接法分两种情况不做掉电走时功能VBAT直接接3.3V。需要注意的是要在这个引脚和3.3V之间加一颗100nF电容。要做掉电走时VBAT接CR2032纽扣电池正极电池负极接地。注意电池正极还要并一颗100nF陶瓷电容和一颗1uF到10uF的钽电容或电解电容用于滤除电池线缆引入的噪声。VBAT允许的电压范围在F103数据手册里是1.8V到3.6V纽扣电池满电3.0V左右非常合适。但要注意CR2032是一次性锂电池标称3V不能用可充电的锂离子电池直接用可充锂电满电4.2V会把VBAT引脚打坏。不少人在不用RTC的情况下直接把VBAT悬空这其实是有风险的。VBAT悬空会导致内部电源开关状态不确定某些型号在VDD上电过程中RTC域可能进入异常状态表现为外部32.768kHz晶振不启动、备份寄存器读写异常。稳妥做法是即使不用RTC也接一个1uF到10uF的电容到地或者直接接3.3V。3. 一张图搞定STM32F103最小系统的电源接线参考3.1 最小系统电源连接参考图为了不让这篇文变成“只讲道理不给方案”我直接画了一份我在实际项目中验证过的STM32F103C8T6最小系统电源接线图。画不了复杂电路图软件效果但足够你对着搭电路。3.3V电源网络 | ------------------------------- | | | | | [100nF] [100nF] [100nF] | | | | VDD1 VDD2 VDD3 VDD4 (第24脚) (第36脚) (第48脚) | ----[磁珠 600R100MHz]------- VDDA (第9脚) 左侧标VREF时 | | VDDA引脚 | [100nF] | | | GND | VBAT第1脚-- [CR2032电池] -- GND 如不用电池则VBAT经100nF接3.3V网络这里需要说明不同封装的VDD、VDDA引脚编号不一样画板子之前务必对照自己用的芯片型号和封装去查数据手册的引脚定义表。上面示意图的重点是结构关系不是引脚编号。3.2 所有VDD引脚都必须接去耦电容图中的三颗100nF电容对应的是F103C8T6LQFP48的3个VDD引脚。是的不是接一个就完事而是每一个VDD引脚旁边都配一颗100nF并且这颗电容要尽可能靠近对应的引脚放置走线要短最好直接从这个引脚连到最近的VSS引脚。为什么每个引脚都要一颗回到第一部分的解释数字芯片供电引脚的作用相当于给芯片内部的数字逻辑提供能量入口每个供电入口附近都有一个独立的瞬态电流需求。如果只在电源入口放一颗100nF它对离得远的那个VDD引脚来说中间隔着几厘米的PCB走线走线电感让高频电流根本来不及从电容补充瞬态电压跌落照样发生。最好的布置形式是每颗电容都紧贴对应的VDD-VSS引脚对形成一个一个独立的“本地储能点”。3.3 VCAP引脚最容易漏掉的关键电容STM32F103系列中还有一对特殊的引脚叫VCAP_1和VCAP_2在LQFP48封装的F103C8T6上标号是第20脚和第21脚它们必须通过一颗2.2uF电容连接到地。这颗电容是芯片内部主调压器就是给内核提供1.8V的那颗LDO的输出滤波电容。很多人第一次画板子容易把这颗电容当成普通去耦电容随便处理甚至直接漏画。后果是芯片上电后复位不正常或者程序运行中频繁死机且万用表测量VDD电压很正常怎么排查都找不到原因。这类问题和“32kHz晶振没起振”并列为STM32最小系统两大隐形杀手。要注意的是VCAP电容的容值和ESR都有一定要求F1系列的官方推荐值是2.2uF低ESR陶瓷电容就行。漏接或错接容值过小的电容可能导致内核电压纹波过大尤其是在高主频运行时更容易出问题。4. 去耦电容和输入电容不是玄学为什么这么选参数怎么定4.1 为什么是100nF而不是1uF或者10uF很多新手会问既然要滤波我每个引脚放个10uF不是更好吗这里的核心逻辑是电容的自谐振频率和安装寄生电感。陶瓷电容在高频下的行为并不是理想电容它自身带有等效串联电感ESL和等效串联电阻ESR。当频率升高到一定程度电容会进入自谐振点超过这个频率之后电容的阻抗随频率升高反而增大它就不再是电容而是个电感。不同容值的电容自谐振频率不同。100nF的MLCC自谐振频率通常在几十MHz量级正好覆盖STM32内核和GPIO翻转产生的主要噪声频段。而10uF的MLCC自谐振频率只有几MHz它对几十MHz的高频噪声抑制效果反而远不如100nF。所以数字电路里“每个电源引脚放100nF 每个电源域总入口放一个10uF”是一套典型搭配大电容管中低频段的电荷储备和纹波小电容管高频瞬态。4.2 AMS1117输出电容为什么不能随手换成大容量陶瓷电容热搜词里有一条“AMS1117把钽电容换成陶瓷电容对STM32有影响吗”这个问题特别典型。很多同学在淘宝买AMS1117模块时模块上原装的是钽电容但手里只有陶瓷电容就直接换上发现输出电压和稳定性好像也没问题于是发帖问影响大不大。这里要分两层来看。AMS1117这类LDO稳压器对输出电容的ESR有要求。传统的AMS1117官方数据手册里推荐输出电容通常要求ESR在0.1欧到几欧之间这是为了和片子内部的误差放大器形成稳定的环路避免振荡。老式钽电容的ESR正好落在推荐区间内。而大容量陶瓷电容的ESR极低可能让LDO环路在负载突变时产生振荡或者自激表现为输出电压波形上有高频纹波、甚至啸叫。但这几年一些厂商的AMS1117已经针对低ESR电容做了优化或者你实际使用的负载电流不大、线路板布局不算极限用陶瓷电容也未必会立刻出问题。稳妥的做法是如果一定要用陶瓷电容作AMS1117输出电容容量不要取太大比如用2.2uF~10uF不要堆47uF同时可以串一颗0.5欧到1欧的小电阻来等效抬升ESR。不过我的习惯是这类老牌LDO本来就该遵循手册推荐能用钽电容就用钽电容避免给系统增加不可控变量。4.3 磁珠的参数怎么选VDDA和VDD之间的磁珠选型参数一般看两点直流电阻DCR和标称阻抗Z通常在100MHz频率下给出。DCR越小越好常用在600欧100MHz到1千欧100MHz之间的磁珠DCR多在50毫欧到几百毫欧之间对VDDA的直流压降影响微乎其微。STM32的VDDA电流消耗通常是几十毫安级别就算磁珠DCR是300毫欧压降也只有几十毫伏完全在允许范围内。如果手头没有磁珠用0欧电阻也是可以工作的只是滤波效果差一些。更讲究一点的做法是用一颗10uH以内的高频电感加并联电容组成π型滤波把VDDA的纹波压到极低。但对于绝大多数应用场景一颗磁珠加一颗100nF电容已经足够。5. 从原理图到实物三种典型场景的电源接线方案5.1 场景一普通数字逻辑小系统这是最常规的用法。你要做的就是一个能跑GPIO翻转、串口收发、LED心跳的最简系统。接线方案3.3V直接进所有VDD引脚每个VDD配100nFVDDA通过磁珠接3.3V配100nFVBAT直接接3.3V配100nF所有VSS和VSSA接同一个GND平面。这种接法下STM32运行稳定外设工作正常。有一个细节值得提醒如果PCB只有两层GND铺地不完整VSSA不要单独走一条细线远距离绕到电源地而是就近连到最近的VSS引脚或者地平面。模拟地回路最怕的就是面积大又细长的地线它会把各种噪声变成一个一个大天线。5.2 场景二用ADC做高精度采集一旦你开始认真采集传感器数据比如做基于STM32的空气质量检测项目或者做PID控制的电流采样VDDA的处理质量就直接决定你的数据能不能用。这个场景下我建议的接线方案VDDA前加一级LC滤波使用10uH高频电感加10uF电容构成π型滤波再接100nF电容到VDDA引脚如果芯片型号有独立VREF脚用一颗REF3030这样的高精度基准芯片给VREF供电模拟地和数字地单点连接连接点放在电源入口处或者ADC采样区域附近ADC的采样时间设置不要一味求快给采样电容留足充电时间。实测下来AP的VREF从VDDA切换成外部基准后ADC绝对误差能明显改善尤其是在测量小信号时效果最直观。如果只是想验证自己的板子VDDA是否接对可以先不换外部基准就用STM32内部自带的VREFINT通道做校准测试这个后面会说。5.3 场景三低功耗RTC掉电保持做鱼缸定时喂食器 、电子时钟或者任何需要在断电后继续计时、记录日志的场景都需要用到VBAT。接线方案VBAT接CR2032电池座正极电池座负极接GND。VDD正常3.3V供电掉电后由电池维持RTC。VBAT引脚旁边放100nF和1uF去耦电容电池座用线引出时注意线不要太长避免引入额外干扰。这里有一个重要细节CR2032是一次性锂电池它不能充电所以VDD和VBAT之间绝对不能通过二极管“无脑连接”。有的设计会加入一个电源切换电路VDD存在时优先使用外部电源VDD掉电后自动切到电池。更简单的做法是依靠STM32内部的电源切换机制VDD引脚持续有电时内部开关就会选择VDD供电不会消耗电池。还要关注电池寿命。F103的VBAT待机电流通常在1uA到几uA的量级CR2032的容量大约是220mAh理论上可以维持数年。但如果你用的是劣质电池自放电大实测可能一年就没了。另外在焊接时注意温度不要过高过回流焊时锂电池座本身没问题但电池要先拿下来。5.4 场景四带USB通信的板子带USB功能比如STM32F103的USB虚拟串口时还有一组需要注意的引脚USB的DPD引脚需要1.5k欧上拉电阻到3.3V而STM32F103内部也有这个上拉只是由软件控制。电源方面没有额外要求但如果VDD纹波过大USB信号质量就会受影响容易被主机端识别成“无法识别的USB设备”。排查“STM32无法识别USB设备”这类问题时除了检查USB_DM、USB_DP的走线长度和串联电阻也别忘了量一下VBUS有没有正常给USB收发器供上电以及VDD纹波是否超标。我遇到过一次USB偶尔枚举失败最后查出来是板上那颗100nF去耦电容虚焊。6. 接错了会出什么问题症状与排查速查表6.1 典型故障症状对照表接线情况典型症状严重程度漏接某一个VDDCPU在低频率下能跑一超频或外设全开就死机GPIO驱动能力变弱中等漏接某一个VSS地回路不完整芯片局部发烫ADC读数异常或全为0/满量程高VDDA悬空芯片能启动但ADC数据乱跳内部参考电压读取值异常高VDDA直接连VDD且无磁珠多数情况下能工作但ADC噪声偏大高精度采集场景不达标低到中VBAT悬空且启用RTC掉电后RTC不保持走时恢复上电后时间错乱中VDD接到5V芯片永久损坏发烫、冒烟致命VCAP电容漏接或容值不对上电复位失败或运行中频繁HardFault高6.2 用内部参考电压验证VDDA是否接对这是一个真正值的经验技巧。STM32内部有一个固定的带隙参考电压通道VREFINT出厂校准值存放在芯片内部。你可以编写一个简单的ADC程序采样VREFINT通道然后反推当前VDDA的实际电压值看它是否在3.3V附近。比如F103的VREFINT校准值存储在地址0x1FFFF7BA是一个16位数值代表在3.3V供电时的典型ADC读数。程序里读出校准值再用实际采样值和校准值一比就能算出VDDA电压。如果算出来只有2V说明VDDA那一路有问题可能有器件焊错或者磁珠压降异常。这个方法不需要额外仪器一张串口打印就能完成电源自检。6.3 焊板子保平安的经验最后分享几条焊了无数块STM32板子之后的实际经验。第一条先测后焊。板子打样回来先不上芯片把3.3V网络和GND网络之间的阻抗量一下。如果短路多半是电容焊反或者板子本身有问题这时赶紧改千万不要急急忙忙把芯片焊上去。第二条第一块板子全部手工焊接的话电源部分用万用表二极管档量每个VDD引脚的对地压降正常应该能测到大约0.4V到0.7V的二极管特性这说明芯片的电源保护二极管没被反向电压打坏。第三条尽量别在ST-Link连接的情况下用镊子短接或飞线改电源网络瞬态的接触火花可能把SWD接口附近的ESD保护电路打坏。关于VDDA要不要加外部基准我的看法是如果只是做毕业设计、跑跑传感器数据VDDA接磁珠加100nF完全够用如果要做称重仪表、电流检测这类对精度有硬性要求的项目那就踏踏实实给VREF单独供一颗高精度基准。衡量标准不是“听别人说需要”而是你的ADC出来的数据误差能不能被你接受。踩过几次坑之后你会发现绝大多数ADC读数不稳的问题根子都不在算法而在电源。把这一页的电源接对你已经比很多贴吧求助的板友领先一大截了。
返回列表