
1. 问题概述NUCLEO-H753ZI 输出异常先别急着怀疑硬件玩嵌入式这两年ST 的 NUCLEO-H753ZI 应该算是高端开发板里比较常见的一块了。主频 480MHz 的 Cortex-M7 内核带浮点单元、2MB Flash、1MB RAM外设接口也齐全无论是做电机控制、音频处理还是工业通信网关都挺能打。可就是这么一块性价比不错的板子一旦出现输出异常就容易让刚上手的人抓狂GPIO 不输出高电平、PWM 波形出不来、串口发数据乱码、DAC 电压不对……各种症状都能归到Output Abnormality这四个字下面。我自己就在这个板子上踩过不少坑。有一次用 STM32CubeMX 配好了一个简单的 LED 闪烁工程下载到板子上以后灯死活不亮万用表量引脚电平一直是低排查了大半天最后发现是 CubeMX 里 Output Delay 设置不当加上引脚复用搞错了。还有一次是帮朋友调一块 H753 的板子PWM 输出波形频率总是差一倍查了半天才发现是时钟树配置时 PLL 分频选错了参数。这篇文章就把我在 NUCLEO-H753ZI 上排查输出异常的经验整理一下从软件到硬件从最基础的 GPIO 到高级外设把常见的坑和排查思路都捋一遍。无论你是刚拿到板子的新手还是被输出问题折磨的进阶开发者这应该都能帮上忙。2. 第一轮排查先从工具链和构建环境下手2.1 构建输出异常先分清是环境问题还是代码问题很多新手一看到输出异常第一反应就是板子坏了、引脚烧了。但实际上有相当一部分所谓输出异常在编译阶段就已经埋下隐患了。我见过不少人在 IDE 的 Build Output 窗口看到乱码、报错或者警告就直接忽略把程序烧进去发现行为不对才回过头来排查代码逻辑。其实这些构建阶段的异常往往就是最终输出异常的根源。常见的构建输出问题大致有三类一类是 IDE 输出乱码。这个在中文 Windows 环境下特别常见尤其是使用 Keil、STM32CubeIDE 或者新版的 IntelliJ IDEA 时编译器输出信息里的中文路径或注释导致编码解析失败Build Output 窗口出现一片乱码。乱码本身不影响编译结果但如果乱码中混入了 error 关键词而你恰好没注意到那后续踩坑基本是必然的。第二类是编译器找不到头文件或路径解析失败。比如在 Qt 环境下经常会出现 failed to parse default include paths from compiler output 这样的错误。这个问题的本质是 IDE 调用编译器时无法从编译器输出中正确解析出头文件的默认搜索路径导致代码中#include的头文件找不到编译直接失败。在 STM32 开发中这类问题通常出现在更换了工具链版本、或者使用 Makefile 导入 STM32CubeMX 生成的工程时。第三类更隐蔽就是编译器版本差异导致的代码兼容性问题。比如同一个工程用 GCC 编译可能没问题但换了 AC6Arm Compiler 6就会爆出各种警告甚至错误。有些警告不影响编译通过但最终生成的代码行为可能不符合预期比如变量未初始化、内存对齐问题等这些都会间接导致运行时输出异常。2.2 CubeMX 配置阶段的坑Output Delay 与引脚映射在我们这个标题关联的热搜词里set output delay、stm32cubex led 配置 output 都是高频搜索词这说明了什么说明大量人在 STM32CubeMX 配置阶段就栽跟头了。Output Delay也就是输出延迟通常跟高速外设的时序有关。比如使用 FMC灵活存储控制器驱动外部 SDRAM 或 TFT-LCD 屏幕时Output Delay 设置不当会导致数据建立时间不足屏幕花屏、闪屏而示波器看波形却是正常的。这个参数的设置依据是外部器件的时序要求不是说随便填个数或者保持默认就行的。在 CubeMX 中配置 LED 控制这类基础输出时很多人会忽略几个关键选项GPIO 输出电平初始状态配置成 High 还是 Low决定了上电瞬间引脚的状态。GPIO 模式推挽输出Push-Pull还是开漏输出Open-Drain这个跟外部电路强相关。最大输出速度Maximum output speed从 Low 到 Very High 四档可选速度设置过低会导致高速信号波形畸变。上下拉电阻上拉、下拉还是浮空直接影响引脚悬空时的电平。我之前用 CubeMX 给 NUCLEO-H753ZI 配置一个简单的 LED 输出时就遇到过一个问题LED 接在 PB0 引脚外部电路是引脚高电平点亮 LED 的方式但 CubeMX 默认把 GPIO 配置成了开漏输出初始电平是 Low结果 LED 始终不亮。本来以为是硬件问题后来仔细查看了生成的代码才发现是配置不对。还有一个很容易忽视的点CubeMX 配置完引脚后要检查一下引脚是否被复用或者冲突。H753ZI 的很多引脚都有多重复用功能比如 PA9 既能做 USART1_TX也能做 TIM1_CH2。如果不小心在 CubeMX 里同时使能了两个外设占用同一个引脚生成代码后就会出现输出异常而且这个异常是看代码看半天看不出问题的那种。2.3 编译器环境导致的输出异常怎么定位回到刚才提到的编译器路径解析问题。在 Ubuntu 或 Windows 上用命令行编译 STM32 工程时我遇到过 failed to parse default include paths from compiler output 的报错。排查这个问题的思路是这样的首先确认工具链是否安装正确。运行命令查看编译器版本如果提示找不到命令那就是环境变量没配好。如果编译器本身能运行但 IDE 报路径解析失败那就是 IDE 和编译器之间的通信出现了问题。以 QT Creator 为例工具链的 C 和 C 编译器路径要分别指定到 arm-none-eabi-gcc 和 arm-none-eabi-g且需要确保这两个文件有执行权限。其次是查看编译器的 Standard Output 和 Error Output确认是否包含了路径信息。有些精简版的编译器在非交互式环境下输出内容很少IDE 拿不到足够的信息来解析默认头文件路径这种情况下可以尝试给编译器加上-v参数强制输出详细的搜索路径信息。对于 STM32CubeIDE 自带的工具链一般不太会遇到这个问题但如果是从 STM32CubeMX 单独导出 Makefile 工程再导入其他 IDE就会频繁出现。我的建议是如果用的是 Eclipse 系的 IDE就老老实实把工程作为 Makefile 工程导入如果用的是 Keil就用 CubeMX 直接生成 MDK-ARM 工程。跨 IDE 迁移虽然技术上可行但对新手来说就是给自己挖坑。说回 empty git --version output 这个报错它虽然常出现在 Git 相关的操作环境里但在嵌入式中也很常见尤其是用一些 IDE 的版本控制功能时。这个报错大概率是 PATH 环境变量里没有正确加入 Git 的安装路径IDE 调不到git命令导致从 Git 拉取的代码、子模块等全部失败。而代码不完整编译出来的固件自然行为异常输出不正常就说得通了。2.4 工具链问题排查速查这几类工具链和构建环境问题的排查优先级我建议这样排异常表现优先排查项常见原因Build Output 乱码系统编码、IDE 编码设置UTF-8 与 GBK 冲突编译器找不到头文件工具链路径、Makefile 头文件路径环境变量未配置或路径错误Git 操作报错Git 安装路径、插件配置git命令不在 PATH 中编译通过但运行时行为异常编译器优化等级、代码未初始化变量编译器差异导致的隐性 bug需要特别提一句的是编译器优化等级。之前在调试 NUCLEO-H753ZI 的一个串口输出程序时-O0优化下程序正常但改成-O2后串口输出就乱了。这种情况在嵌入式开发中并不少见原因往往是代码中存在未定义行为比如未初始化变量、缓冲区溢出等在低优化时碰巧能跑在高优化时编译器做了激进的指令重排或寄存器复用就把问题暴露出来了。遇到这种情况不要一味骂编译器仔细查代码才是正道。3. 第二轮排查GPIO 输出异常的核心检查清单3.1 时钟树配置H7 的复杂度比 F1/F4 翻倍排查完工具链和构建环境如果程序已经成功烧录但输出仍然异常那就要开始从软件硬件两个维度做系统排查了。ST 的 NUCLEO-H753ZI 输出异常首先要查的就是时钟树。STM32H7 系列的时钟树比 F1、F4 复杂不少。H753 最高主频 480MHz由外部 25MHz 晶振经过 PLL 倍频得到。如果在 CubeMX 中配置不当比如 PLL 分频系数选错导致系统时钟跑得不是整数倍频那么所有基于时间的输出都会出问题UART 波特率算错、PWM 频率不准、定时器延时不对。我之前在板子上做过一个测试用 H753 输出一个 1kHz 的 PWM示波器一量发现频率只有 999.2Hz虽然看起来只差一点点但对于需要精确定时的场景比如电机控制或者电力电子变换器0.1% 的频率误差积累起来是非常致命的。原因也很简单CubeMX 自动生成的时钟配置里PLL 分频参数是基于逻辑计算出来的但如果外部晶振的实际频率跟标称值有偏差频率就会出现系统性偏移。排查时钟问题不要只看 CubeMX 里的图形界面一定要通过代码确认SystemCoreClock的实际值。可以在调试器里查看这个全局变量的值也可以直接用一个 GPIO 翻转语句跑一段时间用示波器或者逻辑分析仪实测频率。实测频率和理论值不一致的时候优先检查HSE_VALUE这个宏定义是否和板载晶振一致。NUCLEO-H753ZI 板载晶振是 25MHzHSE_VALUE默认值应该也是 25MHz。但如果你用过其他 STM32H7 系列的核心板有的板载晶振是 8MHz如果你把工程从别的板子移植过来没修改HSE_VALUE那整个时钟树计算都会错位输出异常是必然的。这类问题很隐蔽因为 CubeMX 生成的代码在编译时不会报错只有在运行时才会出现问题。3.2 引脚复用与电气连接软件和硬件的交界处GPIO 输出异常除了时钟问题引脚复用配置也是大坑。H753ZI 的引脚复用功能非常丰富一个引脚往往有七八种复用功能可选。CubeMX 里配置外设时会自动分配引脚但如果你手动修改了引脚分配就很容易出现复用冲突。我之前调试过一次 I2C 通信代码逻辑、通信速率、上拉电阻都没问题但就是通信失败用示波器抓 SCL 和 SDA 波形发现 SCL 有波形SDA 一直是高电平。后来检查发现CubeMX 里 I2C1 被分配到了 PB6/PB7I2C1_SCL/PB6I2C1_SDA/PB7但我在另一个外设的配置中无意中也将 PB7 设置为了普通 GPIO 输出导致 I2C 的 SDA 引脚被复用成了 GPIO自然无法正常通信。排查这类问题的技巧在 CubeMX 的Pinout Configuration视图中打开 Pinout 标签页检查被使用的引脚是否被黄色、绿色或橙色图标覆盖如果有引脚图标显示异常或复用冲突CubeMX 会报错提示。另外生成代码后检查MX_GPIO_Init()等函数中对引脚的配置是否与预期一致。电气连接层面的问题就更常见了引脚被配置为推挽输出但外部电路是集电极开路结构需要开漏输出配合外部上拉电阻才能正常工作。引脚输出电平正常但外部电路接线错误比如 LED 接反了、电阻短路了。引脚浮空输入状态没有上下拉外界干扰导致电平不确定性。一个很实用的经验遇到输出异常先用万用表测引脚对地电压。如果是推挽输出高电平输出时应该接近 VDD比如 3.3V低电平输出时应该接近 0V。如果测量结果既不是高也不是低而是浮在中间值那大概率是引脚被复用成了其他功能或者代码中该引脚根本就没被初始化。3.3 代码层面的 GPIO 初始化顺序和配置细节即便 CubeMX 配置正确生成代码后如果手动修改不当也会引入输出异常。一个典型的问题就是 GPIO 初始化顺序。在 STM32H7 上GPIO 外设的时钟使能是通过 RCCReset and Clock Control寄存器控制的。CubeMX 生成的main()函数中HAL_Init()之后会调用SystemClock_Config()配置系统时钟然后调用MX_GPIO_Init()等外设初始化函数。如果你在自己添加的代码中提前使用了某个 GPIO但没有先使能对应的 GPIO 时钟那么这个 GPIO 的读写行为就是未定义的。比如你在MX_GPIO_Init()调用之前就执行了HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_SET)此时 GPIOA 的时钟可能还没有使能写入操作可能不会生效。这种问题的症状就是代码明明写了引脚却没反应而且因为不会报编译错误排查起来特别刁钻。第三个检查点是 GPIO 引脚的初始状态。在 CubeMX 中你可以为每个 GPIO 引脚设置初始输出电平和初始复用功能。如果你的电路设计是上电默认低电平才能保证安全比如继电器控制、功率管驱动那么在 CubeMX 里就应该把初始电平设为 Low。如果忽略了这一点上电瞬间引脚输出高电平可能导致外部设备误动作这种输出异常其实是明显的设计缺陷。我在实际项目中最常用的一种排查方式是在调试器中用 View 窗口直接修改 GPIO 输出寄存器的值比如把GPIOA-ODR的第 5 位直接置 1然后观察引脚是否输出高电平。如果直接在寄存器层面写入都能输出但调用 HAL 库函数不行那就是库函数参数或者引脚编号对应错了如果寄存器层面写入都没反应那就要怀疑引脚被复用、时钟未使能甚至是硬件损坏。4. 第三轮排查PWM、DAC、通信接口等复杂输出的异常定位4.1 PWM 输出异常频率不对、占空比不准、无输出在 NUCLEO-H753ZI 上使用定时器输出 PWM是电机控制、LED 调光、音频发生等应用中最常见的需求。PWM 输出异常的表现通常有三种完全无输出、频率不对、占空比不准。完全无输出的排查思路先用 CubeMX 确认 PWM 引脚是否配置正确定时器的时钟源是否使能。在 H753 上定时器的时钟源来自 APB1 或 APB2 定时器时钟如果 APB 分频配置不当定时器可能根本没有时钟跑。可以检查htim.Instance-CR1寄存器中的 CEN 位是否为 1确认定时器是否已经启动。频率不对的排查思路PWM 频率 定时器时钟频率 / (分频系数1) / (自动重载值1)。如果频率和理论值不符优先检查Prescaler和Period这两个配置参数是否正确。有个容易踩的坑H753 的定时器时钟频率并不等于 APB 总线频率当 APB 分频系数不等于 1 时定时器时钟是 APB 频率的 2 倍。如果你直接按 APB 频率计算分频参数PWM 频率就会比预期高一倍。占空比不准的排查思路检查比较寄存器CCR的值是否和预期一致。如果你用的是互补输出模式还要注意死区时间的设置是否影响了实际导通时间。另外一个容易被忽略的是定时器的计数模式向上计数和中心对齐模式下相同 CCR 值对应的占空比计算公式是不同的。4.2 DAC 输出异常电压不准确、无法输出NUCLEO-H753ZI 板载了 DAC 外设H753 的 DAC 是 12 位的可以配置为输出 0~3.3V 的电压。DAC 输出异常的常见症状是输出电压偏大或偏小、输出为 0、输出跳变不稳定。先明确一个概念DAC 只是把数字量转换成电压的翻译器输出电压的准确性取决于参考电压。H753 的 DAC 参考电压默认为 VREF在 NUCLEO 板上 VREF 直接连接到 VDD3.3V所以 12 位 DAC 的理论输出电压计算公式是Vout (DAC_Value / 4096) * 3.3V。如果你DAC_Value设置为 2048理论输出应该是 1.65V。实测如果是 1.63V 或者 1.67V这属于正常误差范围内因为 VDD 本身会有波动。如果输出完全为 0排查思路是DAC 外设时钟是否使能、DAC 通道是否使能、输出缓冲是否配置为 Enable。在 STM32H7 系列中DAC 输出缓冲配置需要特别注意如果缓冲禁用DAC 输出的驱动能力会大幅下降连接负载后电压会被拉低。如果输出电压值不变无论怎么修改 DAC 值都固定在一个电压上那就要检查是不是有另一个外设占用了同一个引脚。H753 的 DAC_OUT1 在 PA4 引脚PA4 同时也可以用作 ADC 输入、定时器输入捕获等。如果 CubeMX 自动分配错误DAC 输出可能会被引脚复用功能覆盖。4.3 通信接口输出异常数据乱码、电平异常接下来是通信接口的输出问题。UART 是调试阶段最常用的接口串口输出乱码的比例非常高。排查串口乱码第一查波特率第二查电平。波特率不对的根源往往还是时钟。UART 波特率发生器是基于定时器时钟计算得到的如果系统时钟配置错误波特率就会偏移。当波特率偏差超过 ±2% 时接收端就可能出现误码。这也解释了为什么前面我花了大量篇幅讲时钟树配置——时钟是整个系统的基石任何一个外设的输出精度都依赖它。另一个常见的通信接口输出问题是 I2C 总线卡死SDA 被拉低。I2C 协议规定总线空闲时 SDA 和 SCL 都应该被上拉电阻拉至高电平。如果总线卡死先检查是否有设备持续占用总线。如果是 NUCLEO-H753ZI 作为主机代码逻辑中可能存在未处理的总线错误状态需要手动复位 I2C 外设并重新初始化。这可能表现为输出异常——你需要的是正确的数据输出但总线却卡在错误状态。对于 SPI 接口时钟极性和相位CPOL、CPHA配置错误会导致输出数据无法被从设备正确采到症状往往是数据错位或毫无响应。解决方法是核对从设备的 datasheet 时序图确认在哪个时钟沿采样然后相应调整 SPI 配置。还有一个经验通信接口的输出异常不一定是你板子的问题也可能是对端设备的问题。比如我用 NUCLEO-H753ZI 连接一个 GPS 模块串口发 AT 命令无响应。排查了波特率、接线、电源都没问题最后发现是这个模块在出厂时默认开启了不同的串口协议。所以在排查通信问题时先确认对端设备的工作状态然后再回头查自己的板子能省不少时间。5. 实测案例与排障记录5.1 案例一PWM 完全没有输出最后发现是复位引脚冲突前年一个项目里我用 NUCLEO-H753ZI 驱动一个无刷电机需要输出三路 PWM。配置好 TIM1_CH1/CH2/CH3 后下载程序示波器探头点上结果三个引脚一点波形都没有。第一步检查了定时器是否启动htim1.Instance-CR1的 CEN 位是 1定时器确实是跑起来了。第二步检查 CCR 寄存器的值是正常的。第三步检查 IO 配置结果发现我把 PA8 配置成了 TIM1_CH1但 PA8 在 NUCLEO 板上同时连接了板载的复位按键。NUCLEO 板的 PA8 是连通到复位电路的虽然可以通过跳线断开但默认是连着的。当我把 PA8 配置为 PWM 输出时相当于用 PWM 波形去干扰复位电路这会导致芯片不断复位或者处于复位状态PWM 自然无法输出。解决方案是把 PWM 引脚改到其他未冲突的引脚上或者在硬件上断开 PA8 和复位电路的连接。这个案例说明引脚功能冲突不仅限于外设之间的复用还可能跟板载硬件电路有关系。5.2 案例二STM32CubeMX 生成的 GPIO 输出代码无效之谜另一个案例是帮一个做智能家居的朋友排查问题。他用 NUCLEO-H753ZI 控制一路继电器继电器的控制引脚接到 PD2。CubeMX 配置好 PD2 为推挽输出初始电平为 Low生成代码后简单写了一个延时翻转逻辑但下载后继电器毫无反应。我远程看了一下他的代码发现他在用户代码区USER CODE BEGIN 2里直接调用HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_RESET)然后延时再调用HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_SET)。逻辑上看好像没问题但为什么没反应后来我在调试器里读寄存器的值发现GPIOD-MODER寄存器的值完全不对PD2 的模式位不是 01通用输出而是 00输入。这说明MX_GPIO_Init()函数里根本就没对 PD2 做配置。为什么会这样仔细一看原来是 CubeMX 生成代码时PD2 这个引脚被系统默认分配给了其他外设朋友没注意到 CubeMX 界面上 PD2 已经变成了黄色表示被占用他在视图上看到 PD2 是绿色的就去配置了但生成代码的时候CubeMX 只生成了被分配外设的初始化代码GPIO 初始化函数中就没有 PD2 的配置。这个案例给我们的教训是CubeMX 的引脚颜色编码一定要看仔细。绿色是 GPIO 可配置引脚黄色是被外设占用的引脚橙色是电源或地等特殊功能引脚。如果你在 GPIO 列表里配置了一个看起来是绿色、实际上是黄色的引脚CubeMX 可能不会把你的 GPIO 配置生成到MX_GPIO_Init()中。5.3 案例三串口乱码从何而来还有一次一位读者在评论区问我他的 NUCLEO-H753ZI 通过虚拟串口调试串口助手接收到的数据总是乱码并且频率越高乱码越严重。波特率从 9600 一直改到 115200乱码问题都存在。我让他一步步排查最后发现原因很乌龙他没有安装正确的 USB 驱动Windows 系统给虚拟串口分配了一个错误的驱动导致数据在传输过程中被当成了 USB 中断事件来处理。这个故事告诉我们串口乱码不一定是板子的问题也可能是上位机或者驱动层面的问题。排查串口通信异常的时候先换一台电脑或者换一个 USB 口测试如果问题消失那就是 USB 驱动或者 USB 硬件的问题。如果问题依旧再回头查波特率、时钟和代码。5.4 案例四编译警告里藏着祸根最后一个案例是我自己早期用 STM32CubeIDE 开发时遇到的。工程编译后有警告提示variable data is used uninitialized变量 data 未初始化就被使用。我当时觉得反正代码能运行警告就算了。结果在一次输出波形测试中DAC 输出的电压偶尔会跳变到一个异常值概率不高但偶尔能复现。排查了很久最后回到这个警告上。原来是在一个中断处理函数中我给一个局部变量赋了初值但在另一次调用中这个变量被意外覆盖。由于优化选项打开了编译器的行为更加微妙。这让我养成一个习惯编译时把警告视为潜在 bug一有警告就查到底尤其是uninitialized、implicit declaration这类关键警告。在 NUCLEO-H753ZI 这种高性能处理器上缓存、流水线、指令排序都可能导致看起来不符合直觉的行为如果代码本身就带病运行想通过硬件调试找出根本原因难度会大得多。6. 常见问题排查速查表为了方便快速定位问题我把上面提到的输出异常情况整理成一个速查表你可以直接对照排查异常现象优先级排查步骤参考章节GPIO 无输出高1. 确认 GPIOD 等端口时钟已使能2. 确认 MODER 为通用输出模式3. 确认 ODR 寄存器写入正确4. 测量引脚电压3.3GPIO 输出电平不对中1. 检查推挽/开漏配置2. 检查外部上拉/下拉电阻3. 检查引脚是否被复用3.2PWM 无输出高1. 检查定时器时钟是否使能2. 检查 CEN 位3. 检查通道输出使能4.1PWM 频率不对高1. 确认定时器时钟频率2. 核对分频和重载值3. 检查 APB 分频系数4.1UART 乱码高1. 改用 9600 或 115200 波特率测试2. 用示波器抓波形确认波特率3. 检查时钟树配置4.3UART 无输出中1. 检查 TX 引脚是否被复用2. 检查虚拟串口驱动3. 检查 TX 引脚电平状态4.3DAC 输出为 0中1. 检查 DAC 外设时钟使能2. 检查 DAC 通道使能3. 检查引脚复用4.2DAC 输出电压不准确低1. 检查 VREF 电压2. 检查负载电阻大小3. 检查输出缓冲配置4.2I2C 总线卡死中1. 检查 SDA/SCL 是否上拉2. 复位从设备3. 查看 I2C 错误状态寄存器4.3构建输出乱码中1. 检查 IDE 编码设置2. 检查系统区域语言设置2.1提示速查表只是排查的起点不要生搬硬套。每一类异常的背后都可能有多重原因叠加建议按照先软件后硬件、先供电后信号、先配置后焊接的思路逐层排查。7. 写在最后的一点个人经验排查 NUCLEO-H753ZI 输出异常的过程本质上是一个约束问题变量的过程。好多人一上来就怀疑硬件把板子翻来覆去量了好几遍却忽略了最基础的工程配置和代码逻辑。我在实际项目中养成的习惯是先确认软件层面所有设置与预期一致再动手测硬件信号。具体顺序我一般是这样编译有没有错误和警告、时钟树配置对不对、引脚复用有没有冲突、寄存器配置的值是否符合预期、信号波形量出来是否正常、最后才是怀疑焊接和芯片损坏。每一步都验证通过后再进入下一步这样能最快缩小问题范围。还有一点想特别提醒NUCLEO 系列开发板虽然集成度高但它本质上是一块评估板上面除了 STM32 芯片外还有 ST-LINK 调试器、LED、按键、各种传感器接口。这些板上资源有时反而会给排查增加干扰。比如板载的 ST-LINK 占用了部分引脚默认的 LED 引脚、按键引脚也都和你的自定义功能可能产生冲突。遇到莫名其妙的输出异常先看一眼原理图排除板载资源的干扰往往能少走很多弯路。如果这篇文章里的排查方法能帮你解决实际问题或者你遇到了这里没覆盖到的奇葩输出异常都欢迎在评论区留言交流。做嵌入式这一行一个人踩坑太孤单把经验分享出来大家一起少踩点坑才是这行的乐趣所在。