Nucleo-L031K6裸机直接GPIO寄存器控制LED无法点亮问题排查
解决NUCLEO-L031K6直接操作寄存器点亮PB3 LED的问题
你的代码存在两个关键问题,导致Wokwi模拟器中LED无法点亮:
1. RCC寄存器地址错误
你定义的RCC基地址计算错误,导致GPIOB的时钟根本没被正确使能:
- 正确的STM32L031 RCC基地址是
0x40021000,而你的代码计算得到的是0x40041000,偏移量叠加错误。 - 修正RCC相关宏定义:
#define RCC_BASE (0x40021000UL) // 直接使用正确的RCC基地址,避免计算错误
2. LED电平逻辑错误
NUCLEO-L031K6的LD3(PB3)是低电平点亮:
- 板子原理图中,LED的正极接VCC,负极通过电阻连接到PB3引脚,所以需要将PB3设置为低电平(
GPIO_ODR &= ~GPIOB_PIN3)才能点亮LED,而不是设置为高电平。
修正后的完整代码
// NUCLEO-L031K6 #define PERIPH_BASE (0x40000000UL) #define IO_OFFSET (0x10000000UL) #define IOPORT_BASE (PERIPH_BASE + IO_OFFSET) #define GPIOB_OFFSET (0x0400UL) #define GPIOB_BASE (IOPORT_BASE + GPIOB_OFFSET) #define RCC_BASE (0x40021000UL) // 修正RCC基地址 #define RCC_IOPENR_OFFSET (0x2CUL) #define RCC_IOPENR (*(volatile unsigned int *)(RCC_BASE + RCC_IOPENR_OFFSET)) #define GPIOPBEN (1U << 1) #define GPIO_MODER (*(volatile unsigned int *)(GPIOB_BASE + 0x00UL)) #define GPIO_ODR (*(volatile unsigned int *)(GPIOB_BASE + 0x14UL)) #define GPIOB_PIN3 (1U << 3) // LD3 user LED int main() { // Enable GPIOB clock RCC_IOPENR |= GPIOPBEN; // Set GPIOB pin 3 as output mode GPIO_MODER &= ~(1U << 7); GPIO_MODER |= (1U << 6); GPIO_ODR &= ~GPIOB_PIN3; // 拉低PB3点亮LED while (1) { } }
额外检查点
- 确认Wokwi中选择的开发板确实是NUCLEO-L031K6,避免硬件模型不匹配
- 检查代码中是否有未初始化的寄存器影响GPIO状态,不过上述修正后应该可以正常点亮
内容的提问来源于stack exchange,提问作者kuhi
相关产品推荐
相关产品推荐

