STM32G070CBT6的PB15引脚GPIO异常:寄存器正常但电平不切换
排查STM32G070CBT6 PB15引脚输出无变化的问题
结合你的描述,我之前也碰到过类似的GPIO异常情况,咱们从软件到硬件一步步来排查:
1. 先确认引脚宏定义的正确性
检查CubeMX生成的引脚宏映射,比如MOTOR2_2_Pin是不是确实对应GPIO_PIN_15?有时候在CubeMX里配置引脚时,可能会不小心选错,或者宏定义被其他代码覆盖。你可以直接在代码里替换成GPIO_PIN_15做测试,比如把主循环里的MOTOR2_2_Pin改成GPIO_PIN_15,看引脚是否有变化。
2. 排查复用功能冲突
STM32G070的PB15支持多个复用外设功能(比如TIM1_CH3N、I2C2_SDA、LPUART1_RX),哪怕你配置成GPIO输出,如果有其他外设的时钟被意外开启,可能会抢占引脚控制权:
- 检查你的代码中,有没有初始化TIM1、I2C2或者LPUART1的代码?这些外设的时钟是否被无意启用?
- 你可以尝试在GPIO初始化后,强制清除PB15的复用功能位:
MODIFY_REG(GPIOB->AFR[1], GPIO_AFRH_AFSEL15_Msk, 0); // 将AFRH的第15位设置为0,禁用复用
3. 极简代码测试(排除其他代码干扰)
写一个完全独立的测试程序,只初始化PB15为输出,排除其他GPIO和外设的影响:
#include "stm32g0xx_hal.h" int main(void) { HAL_Init(); __HAL_RCC_GPIOB_CLK_ENABLE(); GPIO_InitTypeDef GPIO_InitStruct = {0}; GPIO_InitStruct.Pin = GPIO_PIN_15; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); while (1) { HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_15); HAL_Delay(500); } }
烧录这个代码后,用万用表直接测PB15引脚的电平,看是否能正常翻转。如果还是不行,基本可以排除软件配置的问题,转向硬件排查。
4. 硬件深层检查
虽然多块板子都出现问题,但也不能完全排除硬件设计或焊接的共性问题:
- 用万用表测PB15引脚的对地电阻:当配置为高电平时,电阻应该接近VCC;低电平时接近GND;悬空时应为高阻状态。如果始终接近GND,可能是引脚短路到地。
- 检查PB15的焊盘是否存在虚焊、漏焊,或者走线是否被其他信号干扰(比如靠近高频信号)。
- 确认GPIOB的电源引脚(VDD)电压是否正常,虽然其他PB引脚正常,但电源域局部异常也有可能(概率较低)。
5. 检查芯片手册的特殊说明
再仔细核对STM32G070CBT6的data sheet,确认PB15是否有特殊的硬件限制:
- 是否属于需要额外配置的引脚?比如某些引脚在特定供电模式下的行为。
- 是否与BOOT模式或其他芯片启动配置有关?(PB15不是BOOT引脚,这个可能性极低,但还是确认一下)
如果以上步骤都排查完还是无法解决,建议提供极简测试后的寄存器状态(比如ODR、MODER、AFR寄存器的值),以及更详细的硬件原理图细节,方便进一步定位问题。
内容的提问来源于stack exchange,提问作者Jeph Gagnon
相关产品推荐
相关产品推荐

