通过寄存器打开 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;
}
}
什么步骤?
- 启用 GPIOA 时钟。
- 配置引脚为推挽输出。
- 切换图钉。
对于通用 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++);
}
你还需要检查电路板上的焊桥:
我有一个 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;
}
}
什么步骤?
- 启用 GPIOA 时钟。
- 配置引脚为推挽输出。
- 切换图钉。
对于通用 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++);
}
你还需要检查电路板上的焊桥: