You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 01:50:18