通过寄存器打开 Nucleo 64 F103RB 中的 LED

Turning LED on in Nucleo 64 F103RB via Registers

我有一个 STM32 NUCLEO-64 F103RB,我正在使用 Keil uVision 5。我只是用 CubeMX 软件测试设备,并且能够闪烁或打开设备中的绿色 LED。然后我决定通过直接用 C 代码更改板上寄存器中的值来做同样的事情。这是设备的示意图:

我在其中突出显示了 GPIO A 和连接到相关端口的总线。根据我的理解,在实际打开 LED 之前应该做两件事: 1 - 激活 APB2 总线的时钟 2 - 将 GPIOA 端口 5(对应 LED)设置为输出模式。

我已经完成了这两个步骤。但是,LED 仍然不会亮起。我试过查看文档,发现 PA5 可以用作 SPI,我尝试更改寄存器 AFIO_MAPR(参考手册第 184 页),但也没有用。我试着查看 AHB2 的时钟激活,但我不太明白它是如何工作的。 我的 C 代码是:

#include "stm32f10x.h"                  // Device header


int main() {
// Initialise clock of APB2 Bus
    RCC->APB2ENR = (RCC->APB2ENR & 0x0) | RCC_APB2ENR_IOPAEN;

// Put the GPIOA in Output mode
    GPIOA->CRL = (GPIOA->CRL & 0x44444444) | GPIO_CRL_MODE5_1;


// Changinging the ODR Register (Lighting the LED)
    while(1) {
    GPIOA->ODR = (GPIOA->ODR & 0x0) | GPIO_ODR_ODR5;
    }

}

Nucleo64 F103RB Reference Manual

Nucleo64 F103RB User Manual

什么步骤?

  1. 启用 GPIOA 时钟。
  2. 配置引脚为推挽输出。
  3. 切换图钉。

对于通用 GPIO,不要设置任何 AFIO。

RCC->APB2ENR |= RCC_APB2ENR_IOPAEN;
__DSB();
  GPIOA -> CRL &= ~GPIO_CRL_CNF5_Msk;
  GPIOA -> CRL |= GPIO_CRL_MODE5_Msk;

  while(1)
  {
      GPIOA -> ODR ^= GPIO_ODR_ODR5;
      for(volatile unsigned x = 0; x < 500000; x++);
  }

你还需要检查电路板上的焊桥: