2026/11/3 17:31:12

STM32CubeMX点灯:上拉/下拉电阻原理、配置与避坑

STM32CubeMX点灯:上拉/下拉电阻原理、配置与避坑 LED点灯是几乎所有人接触STM32的第一课也是STM32CubeMX这款图形化配置工具最经典的练手场景。但我在帮别人看工程的时候发现一个挺普遍的现象代码能跑、灯能亮可一旦被问到“这个引脚为什么要配上拉”“我配了下拉为什么灯还是亮的”“开漏加上拉能不能直接点灯”这类问题很多人就答不上来了。上拉电阻和下拉电阻这两个概念看着只是CubeMX里一个下拉框的两个选项实际上牵扯到GPIO内部结构、驱动能力、电平默认状态、低功耗漏电一整条链路。这篇内容就围绕STM32CubeMX配置LED这条主线把上下拉电阻的原理、参数、配置组合、实测验证和踩坑记录全部摊开讲一遍。适合刚上手STM32、习惯在CubeMX里点鼠标生成代码的朋友也适合已经能点灯但想搞清楚“为什么这么配”的进阶读者。读完之后你至少能做到看到任何一个GPIO配置界面能判断这个上下拉该不该开、开了会有什么后果。1. 先把LED点灯这件事拆开看电平、电流与电阻的关系1.1 三种最常见的LED接法及其电平含义在动CubeMX之前得先把硬件那头想明白。LED是个二极管单向导通要点亮它只需要两个条件同时满足正向压降够了正向电流在合适区间。MCU的引脚在这件事里扮演的角色其实就是一个可控的电子开关。围绕这个开关常见的接法有三种。第一种是灌电流接法也叫低电平点亮。LED阳极接电源正极阴极串一个限流电阻电阻另一端接MCU引脚。引脚输出低电平时电流从电源流经LED、电阻灌进引脚内部到地灯亮引脚输出高电平时引脚电压和电源电压接近两端没有压差灯灭。这种接法在很多开发板上是默认方案原因是STM32引脚灌电流的能力通常比拉电流略好一些而且复位后引脚默认是高阻输入态灯不会误亮。第二种是拉电流接法高电平点亮。引脚经限流电阻接LED阳极LED阴极接地。引脚输出高电平时电流从引脚流出经过LED到地。这种接法逻辑直觉更顺——“高电平亮”代码读起来舒服但对引脚的输出驱动能力要求更高。第三种是开漏加外部上拉引脚配置成开漏输出外面挂一个电阻到电源。这种接法在LED场景里其实不常见但它恰好是理解上下拉电阻价值的最好例子后面第2章会专门展开。把这三张图在脑子里过一遍你会发现一个关键点限流电阻是必须的上下拉电阻不是。这两个东西名字里都带“电阻”功能完全是两回事混淆它们是新手最容易犯的错。1.2 为什么说上下拉电阻不是LED的必需品我在论坛上见过不少提问大意是“我LED接好了CubeMX里上拉下拉选哪个”。这个问题的前提就有点偏。如果引脚配置成推挽输出那么引脚内部已经有一对MOS管在主动把电平拉到电源或者地输出阻抗很低几十欧姆量级这时候内部那几十千欧的上拉或下拉电阻并联上去影响微乎其微开不开对LED亮度基本没影响。真正的区别出现在三个场景。第一引脚是输入模式比如你要接按键输入引脚没有主动驱动悬空时电平不确定这时候必须靠上拉或下拉给它一个确定的默认状态。第二引脚是开漏输出开漏结构只能主动拉低、不能主动拉高高电平必须靠外部或者内部的上拉电阻来实现这时候上拉阻值直接决定了能提供多少电流。第三低功耗和复位瞬间的行为某些引脚在复位后、程序跑起来之前处于高阻态如果不加上下拉外部电路可能处于不确定状态产生额外功耗或者误动作。所以准确的说法是上下拉电阻服务于“电平确定性”和“弱驱动”LED本身需要的是“限流”和“足够的驱动电流”。把这条界线划清楚后面所有配置选择都能自洽。提示如果你只是用推挽输出直接驱动一颗LEDCubeMX里上拉下拉那一栏保持No pull完全没问题别因为“教程里配了”就跟着配多余的配置在低功耗项目里可能会变成漏电来源。2. 上拉电阻与下拉电阻到底是什么从引脚内部结构说起2.1 GPIO内部框图里的那几个开关理解上下拉最有效的办法是把STM32的GPIO内部结构在脑子里画出来。一个典型的GPIO引脚内部大致有这么几块输出驱动器一个P-MOS加一个N-MOS组成的推挽结构、输入通路施密特触发器加保护二极管、以及一组可以开关的弱上拉和弱下拉电阻。CubeMX里那个“Pull-up / Pull-down”下拉框控制的就是最后这组开关。推挽模式下两个MOS管交替导通P-MOS导通时引脚被拉到VDDN-MOS导通时引脚被拉到VSS。注意“导通”这个词MOS管导通时呈现的是一个很低的电阻所以引脚是被“硬”拉到电源或者地的这时候你在外面测量引脚电压基本就是0V或者3.3V非常干净。开漏模式就不一样了输出级只剩下面那个N-MOSP-MOS被彻底关掉。引脚要输出高电平只能靠“不拉低”让引脚浮起来。浮起来的引脚电压是多少取决于外面接了什么。如果什么都不接它就是高阻态电压不确定用万用表量可能读到零点几伏到两伏之间的乱跳值。要让它稳定在高电平必须有一条路径把电荷引到电源去这条路径就是上拉电阻。内部上拉电阻和内部下拉电阻本质上就是这个“弱路径”。关键在于“弱”字STM32手册里给的典型值大概在30kΩ到50kΩ这个量级不同系列略有差异。这个阻值意味着它能提供的电流很小只有几十微安够用来确定电平绝对不够点亮LED。2.2 上拉与下拉的阻值选择为什么常见10k、40k这个量级内部上拉为什么不做成1kΩ那样驱动能力强岂不是更好这里有一笔账要算。假设上拉电阻是1kΩ引脚被强制拉到地比如按键按下或者输出低电平那么流过这个电阻的电流就是3.3V除以1kΩ也就是3.3mA。这个电流是白白流掉的不产生任何有用功。一颗芯片上几十个引脚要是都这么流功耗就上去了对电池供电的设备是灾难。反过来上拉电阻也不能太大。它要和引脚的对地漏电流、PCB表面漏电流、外部干扰注入的电荷去竞争。如果上拉电阻到了1MΩ那么哪怕只有1μA的漏电流产生的压降也有1V电平就可能被拉塌。再加上走线电容RC时间常数变大上升沿变缓高速信号会被拖垮。40kΩ附近是个折中3.3V除以40kΩ静态电流约80μA可接受同时能压住一般环境下的漏电流和干扰。这也是为什么你在几乎所有MCU的GPIO手册里看到的内部上下拉阻值都在这个区间。外部独立上拉电阻常选10kΩ是因为外部场景往往需要更强的驱动、更快的边沿还要考虑走线长度带来的干扰10kΩ在功耗和速度之间更平衡。下面这张表是我整理的不同阻值上拉的特性对比实际选型时可以直接对照。上拉阻值3.3V下静态电流拉高能力边沿速度典型用途1kΩ3.3mA强快I2C高速、长走线4.7kΩ约0.7mA较强较快I2C标准速率10kΩ约0.33mA中等中等按键、通用上拉40kΩ片内约80μA弱较慢确定电平、省电100kΩ约33μA很弱慢极低功耗待机2.3 一个必须记住的量化结论内部上拉点不亮LED我拿这个结论做过实测也是我带新人时必做的一个实验。把某个引脚配成开漏输出打开内部上拉外面按灌电流或拉电流接一颗普通红色LED限流电阻用330Ω。程序里让这个引脚输出高电平理论上开漏输出高电平等于“释放引脚”由上拉把电平顶上去LED应该亮。结果灯几乎不亮只有在暗处能看到一点点微光。原因很简单算一下就清楚红色LED正向压降约1.9V电源3.3V压差1.4V串上40kΩ内部上拉电流只有1.4V除以40kΩ约35μA。而一颗普通LED要看到明显亮度至少需要1mA到2mA差了两个数量级。这个实验的价值在于它把“上拉电阻不是驱动电阻”这句话从一个抽象概念变成了肉眼可见的事实。以后但凡有人跟你说“开漏加上拉就能驱动负载”你就该反问一句负载需要多大电流上拉能提供多少。注意开漏输出加内部上拉只适合做电平定义和极慢速的信号任何需要毫安级电流的负载都必须用外部上拉或者专门的驱动器件。3. STM32CubeMX里的GPIO参数到底怎么填3.1 Pinout视图与GPIO Configuration面板逐项拆解打开CubeMX在Pinout视图里点中一个引脚左侧会弹出GPIO_Output或者GPIO_Input的配置项。面板上的字段不多但每一项都值得说清楚。GPIO output level只在配置成输出时有意义决定生成代码里初始电平。点灯场景下建议设成和“熄灭”对应的电平。灌电流接法低电平亮就设High拉电流接法高电平亮就设Low。这一步做对能避免上电瞬间闪一下的尴尬。GPIO modeOutput Push Pull是推挽Output Open Drain是开漏。点LED用推挽理由前面讲过能主动输出高低电平。开漏留给需要电平转换或者总线共享的场合。GPIO Pull-up/Pull-down就是上下拉选项有No pull、Pull-up、Pull-down。输出模式下这一项大部分时候选No pull输入模式下必选其一除非外部电路已经提供了确定电平。Maximum output speedLow、Medium、High、Very High四档。这个参数控制输出级的翻转速率速度越高边沿越陡EMI越大功耗也略高。点LED这种应用Low完全够用因为LED根本不需要快速翻转。很多人无脑选High其实是在给EMC测试埋雷。User Label给引脚起个别名比如LED_RUN。生成代码时CubeMX会用这个名字生成宏定义代码可读性直接上一个大台阶。这个小功能被严重低估建议养成习惯。3.2 输出模式、速度、上下拉的组合表配置项的排列组合不少我按实际踩过的场景整理了一张表直接对照着选就行。应用场景ModePullSpeed说明推挽驱动LED低电平亮Push PullNo pullLow最常见上拉下拉开了也没意义推挽驱动LED高电平亮Push PullNo pullLow同上注意初始电平设Low开漏驱动LEDOpen DrainPull-up无效Low内部上拉驱不动必须外加上拉按键输入按下接地InputPull-up—松开读1按下读0按键输入按下接电源InputPull-down—松开读0按下读1引脚悬空待机InputPull-up或Pull-down—防止悬空漏电选哪个看电路复用为外设功能Alternate Function按外设要求按手册上下拉要查对应外设章节表格里有几行是经验性的。比如“内部上拉驱不动”那一行我把Pull-up标成“无效”而不是“No pull”是想强调即使你在CubeMX里选了Pull-up对LED亮度也毫无帮助该加外部电阻还是得加。再比如按键那两行选上拉还是下拉不取决于代码习惯取决于硬件怎么焊的——按键另一端接的是地还是电源这个必须和原理图对上配反了就是“按下没反应”或者“一直触发”。3.3 生成代码之后main.c里到底写了什么配置完点生成代码CubeMX会在main.c里塞进几段东西。用户代码区之外的部分是自动生成的每次重新生成都会覆盖所以自己的逻辑一定要写在/* USER CODE BEGIN */和/* USER CODE END */之间这是铁律。GPIO的初始化集中在MX_GPIO_Init()函数里。以推挽输出驱动LED为例生成的核心代码大致是这个样子GPIO_InitTypeDef GPIO_InitStruct {0}; __HAL_RCC_GPIOA_CLK_ENABLE(); GPIO_InitStruct.Pin GPIO_PIN_5; GPIO_InitStruct.Mode GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Pull GPIO_NOPULL; GPIO_InitStruct.Speed GPIO_SPEED_FREQ_LOW; HAL_GPIO_Init(GPIOA, GPIO_InitStruct); HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_RESET);逐行看。第一行开时钟GPIO外设挂在总线上不开时钟写寄存器毫无反应这是STM32的固定套路漏了就是“代码没问题但灯不亮”的经典原因。GPIO_MODE_OUTPUT_PP对应推挽GPIO_NOPULL对应不上下拉GPIO_SPEED_FREQ_LOW对应低速。最后的WritePin设置初始电平。如果是按键输入加上拉Mode会变成GPIO_MODE_INPUTPull变成GPIO_PULLUP。如果是开漏Mode是GPIO_MODE_OUTPUT_OD。这三行参数的差异就是CubeMX界面上点的那几下所以看懂生成的代码比记住界面位置更有价值。在用户代码区里点灯的核心就两个函数HAL_GPIO_WritePin(port, pin, state)和HAL_GPIO_TogglePin(port, pin)。前者写电平后者翻转。配合HAL_Delay()就能做出闪烁效果。读取输入用HAL_GPIO_ReadPin(port, pin)返回GPIO_PIN_SET或GPIO_PIN_RESET。提示HAL_GPIO_WritePin的第三个参数只有GPIO_PIN_SET和GPIO_PIN_RESET两种不要传0和1虽然底层最终都是按位操作但传错类型在某些编译器上会有隐式转换警告阅读起来也不直观。4. 限流电阻怎么算把“凭感觉”换成“算出来的”4.1 灌电流与拉电流两种驱动方式的公式限流电阻的计算公式本身很简单就是欧姆定律的一个变形R (V电源 - V_LED正向压降) / I目标电流灌电流接法里V电源就是板子的供电电压电流路径是电源→LED→电阻→引脚→地引脚低电平时内部相当于接到地压降可以忽略。拉电流接法里电流路径是引脚→电阻→LED→地引脚高电平时的输出电压通常比电源低一点点因为输出MOS有导通电阻但在毫安级电流下这个差异很小一般按电源电压近似计算就行。真正容易出错的是参数取值。V_LED正向压降不是一个固定值它随颜色变化很大也随电流变化。I目标电流也不能拍脑袋得看LED本身的额定值和你想要的亮度。4.2 常见LED颜色压降与电流取值参考下面这张表是我从各类LED规格书里汇总的典型值实际用的时候还是建议查手头器件的规格书因为不同厂家的工艺差异不小。LED颜色正向压降典型值推荐工作电流3.3V下理论电阻红色1.8~2.0V2~5mA260~750Ω橙色2.0~2.2V2~5mA220~650Ω黄色2.0~2.2V2~5mA220~650Ω绿色2.2~2.6V2~5mA140~550Ω蓝色2.8~3.2V2~5mA20~250Ω白色2.8~3.2V2~5mA20~250Ω看这张表能发现一个挺有意思的现象蓝光和白光LED在3.3V下可用的电阻范围非常窄因为它们的正向压降已经接近电源电压了。这时候如果电阻选大了压差不够灯直接不亮选小了电流飙上去可能烧LED或者超出引脚驱动能力。所以用蓝白LED做指示灯时我更倾向于把电流目标压到1mA到2mA既保证可见又留出余量。4.3 一个完整算例3.3V系统点亮红色LED假设手头是一块3.3V供电的板子一颗红色LED正向压降按1.9V算希望亮度适中取3mA。R (3.3 - 1.9) / 0.003 466.7Ω标准电阻系列里没有467Ω往上取最接近的E24系列值是470Ω。这里为什么往上取而不是往下取因为往下取电阻小电流大可能超过LED额定值往上取电流小最多暗一点安全。这是一个通用的取值原则限流电阻宁可偏大不要偏小。换成470Ω之后再反算实际电流(3.3 - 1.9) / 470 ≈ 2.98mA。再看引脚能不能承受STM32单个GPIO的灌/拉电流上限通常在8mA到25mA之间具体看系列和手册3mA完全在安全区。整个板子上如果有8颗这样的LED同时点亮总电流约24mA也远低于芯片的总电流限制。如果换成蓝光LED正向压降3.0V同样取3mAR (3.3 - 3.0) / 0.003 100Ω这时候压差只有0.3V电阻的微小偏差就会导致电流大幅波动。假如电阻实际是90Ω电流变成3.33mA假如是110Ω电流变成2.73mA。看起来还好但如果电源电压从3.3V掉到3.1V100Ω电阻下的电流变成(3.1-3.0)/1001mA亮度直接掉一大截。这就是蓝白LED在3.3V系统里的先天劣势串两颗或者改用5V供电会更稳。注意算完电阻一定要回头验证两件事一是实际电流是否在LED额定范围内二是这个电流是否超出GPIO的驱动能力。两个都过了方案才算成立。5. 实操从零配置一颗LED并验证上下拉行为5.1 硬件连线与测量点确认我习惯在动手写代码之前先把硬件连好并且预留两个测量点一个是引脚本身一个是LED阴极灌电流接法下。这两个点后面验证上下拉和输出电平时会省很多事。以灌电流接法为例LED阳极接3.3V阴极接470Ω电阻一端电阻另一端接PA5PA5同时引出一根线接到万用表或者示波器探头。再把板子的GND引出来备用。整个链路就这么简单但有个细节要注意测量用的那根线不要太长几十厘米以内否则引入的分布电容会干扰对边沿的观察虽然点灯场景不太敏感但养成好习惯没坏处。硬件连好后先别急着上电用万用表蜂鸣档确认一下LED极性没焊反。发光二极管的阳极是正极通常引脚长的那根或者封装上有个小缺口标记的那一侧是阴极。焊反了不会烧有限流电阻但就是不亮排查起来浪费半小时。5.2 CubeMX中的完整配置步骤打开CubeMX新建工程选好芯片型号然后按下面这个顺序操作。第一步在Pinout视图找到PA5左键点击选择GPIO_Output。这时候引脚会变成绿色表示已经配置。第二步在左侧的System Core里展开GPIO点进去找到PA5那一行逐项设置。GPIO output level选High因为我们是低电平点亮初始给高电平意味着上电瞬间灯是灭的。GPIO mode选Output Push Pull。GPIO Pull-up/Pull-down选No pull。Maximum output speed选Low。User Label填一个LED_RUN。第三步配置时钟。点Clock Configuration标签页把系统时钟源和分频设好。这一步和LED无关但工程跑起来必须有时钟随便选个内部高速时钟HSI也能跑。第四步Project Manager里设置工程名、路径、工具链代码生成选项里勾上“Generate peripheral initialization as a pair of .c/.h files”这样GPIO初始化会单独成文件工程干净。第五步点GENERATE CODE。整个过程五分钟以内。生成完之后打开工程先编译一遍确认没有报错再往下走。5.3 用万用表验证上下拉是否真的生效这一步是我特别想强调的因为它是把“配置”和“物理事实”对应起来的唯一手段。先验证推挽输出的效果。烧录程序程序里让PA5持续输出低电平。用万用表直流电压档测PA5对地电压应该读到接近0V通常几十毫伏。然后改成输出高电平再测应该读到接近3.3V具体值取决于你的供电3.28V左右都算正常。如果两次测量都在中间值徘徊比如1.5V那说明引脚没配置成功或者时钟没开或者程序根本没跑起来。接着验证上拉和下拉。把PA5的配置改成输入模式Pull-up程序里不做任何输出操作。上电后用万用表测PA5对地电压应该接近3.3V。再改成Pull-down重新生成烧录测出来应该接近0V。如果两种配置下测出来电压都差不多或者都在乱跳那就要怀疑是不是CubeMX改了但代码没重新生成是不是烧录没成功是不是这个引脚被别的外设复用了。这个实验做一次你对“内部上拉大概能把电平顶到多少”就有了肌肉记忆。以后再遇到开漏上拉驱不动负载的情况你会立刻想到哦40kΩ只有几十微安确实不行。5.4 加一个按键把上下拉的两端都用上单看LED有点单薄加个按键能把上下拉的另一面也验证了。按键一端接PA0另一端接GNDPA0配置成输入Pull-up。这样松开时PA0被内部上拉拉到高电平读1按下时PA0被短接到地读0。主循环里写一段逻辑读PA0如果读到0就把PA5拉低点亮LED否则拉高熄灭。烧录后按一下按键灯亮松开灭说明上拉和输入读取都正常。这里有个必须处理的细节机械按键有抖动按下的瞬间电平会在高低之间弹跳几毫秒。点灯这种应用抖动看不出来但如果你要做计数或者状态切换就必须做软件消抖比如检测到低电平后延时20ms再读一次确认。CubeMX里也能配GPIO的外部中断配合EXTI做按键唤醒那就是另一个话题了。提示按键接地的场景一定配上拉按键接电源的场景一定配下拉。配置方向搞反的典型症状是“按键怎么按都没反应”或者“程序一开始就认为按键一直被按着”。6. 踩坑记录与排查速查表6.1 五个真实踩过的坑第一个坑复位瞬间LED闪一下。现象是每次按复位键灯会短暂亮一下再进入正常状态。原因是GPIO在复位后默认是高阻输入态引脚电平由外部电路决定。灌电流接法下LED阳极接电源阴极经电阻接引脚引脚高阻时没有电流通路灯不该亮……但如果引脚在复位期间被内部保护二极管或者残留电荷影响或者你的LED接的是拉电流方式就会出现闪烁。解决办法是把初始电平设对或者在硬件上给引脚加一个确定的下拉让复位期间电平确定。第二个坑换了个引脚灯不亮了。排查了半天代码最后发现新换的引脚默认被复用成了调试接口。STM32上电后某些引脚默认是SWD或者JTAG功能直接配成GPIO输出是不生效的必须先关闭对应的调试复用。CubeMX里在System Core的SYS选项里把Debug改成Serial Wire就能释放出多余的引脚。第三个坑开漏加上拉灯微亮。这就是第2.3节讲的量化结论内部上拉只有几十微安驱不动LED。解决方法是改推挽或者外部加1kΩ到10kΩ的上拉。第四个坑低功耗模式下电流降不下来。设备进入待机实测电流比预期高了几百微安。查了半天发现有一路按键输入配置成上拉而按键在外部被一直按下上拉电阻上持续有电流流过。解决办法是进入低功耗前把这类引脚改成无上下拉或者模拟输入醒来再恢复。第五个坑多颗LED同时点亮亮度不均。电源电压在负载电流增大时会有压降或者地线上有压降导致不同位置的LED实际压差不同。解决办法是加大电源走线宽度或者在每颗LED的限流电阻上留出余量别把电流算得太满。6.2 排查速查表现象可能原因快速验证方法处理方式LED完全不亮引脚时钟未开检查MX_GPIO_Init里有没有__HAL_RCC_GPIOx_CLK_ENABLE补上时钟使能LED完全不亮极性接反万用表二极管档测LED反接或换LEDLED完全不亮引脚被复用查数据手册引脚定义表关闭对应复用功能LED微亮开漏加内部上拉测引脚高电平电压改推挽或加上拉上电瞬间闪烁初始电平配置不当观察复位瞬间设对初始电平按键无反应上下拉配反测松开时引脚电压交换上拉下拉按键连击机械抖动示波器看按下波形加软件消抖待机电流偏大悬空引脚或上拉回路逐个断开测量改配置或断回路亮度不够限流电阻偏大测电阻实际电流换小一档电阻亮度太刺眼限流电阻偏小同上换大一档电阻这张表我放在工程模板的README里新同事上手时先看一遍能省掉不少来回问的时间。7. 几个进阶用法开漏、电平转换与低功耗取舍开漏输出加外部上拉这个组合在LED场景里确实不划算但它在别的地方很有价值。比如你要用3.3V的MCU去驱动一个5V供电的电路推挽输出直接接过去高电平时3.3V可能不足以让对方识别为高而且对方的5V可能倒灌进引脚。这时候开漏输出加上拉到5V引脚只负责拉低高电平由外部上拉提供电平转换就完成了还避免了倒灌风险。这是开漏最经典的用法理解了它你就明白为什么CubeMX要把开漏单独列成一个模式。低功耗场景下上下拉的取舍逻辑和常规场景是反过来的。常规场景我们追求电平确定所以能开上拉就开低功耗场景我们追求没有静态电流通路所以能关就关。判断标准很简单这个引脚在休眠期间外部电路会不会通过上下拉电阻形成对地的直流通路。会就关掉改成模拟输入或者无上下拉不会比如引脚悬空且没有外部连接那保留上拉反而能防止悬空引入的漏电和误触发。这个判断需要对着原理图逐个引脚过一遍没有捷径。还有一个小技巧值得提。调试点灯程序的时候与其反复改代码烧录不如把LED的翻转放在主循环里配合一个可变的延时用串口发个字符就能改变闪烁频率效率高很多。更进一步可以借助调试器的实时变量查看功能在不重新烧录的情况下改这个延时变量几秒钟就能试出一组顺眼的参数。这些手段不算什么高深技术但真正用起来调参的时间能从半小时压到两分钟。最后说一个我在实际项目里养成的习惯每块新板子第一次点灯我都会先用万用表把每个计划使用的GPIO在三种配置下无上下拉、上拉、下拉的电压各测一遍记在一个小本子上。这个动作花不了十分钟但它能提前暴露焊接问题、配置问题和原理图理解偏差比后面调试业务逻辑时再回头查要省事得多。上下拉电阻这东西写在CubeMX里只是两个选项量出来才是真的。