所以我正在进入 STM32,我决定如果我从开发自己的驱动程序来启用所有寄存器等开始,那就太好了。当我尝试测试我的 GPIO 寄存器时,它似乎不起作用。我尝试调试了一段时间,修复了我能找到的所有问题,但它不起作用。我确保启用了外设时钟并更改了 GPIOx_CRL 寄存器,以确保每个寄存器配置正确,但是当我将 LED 插入标记为 D2 的引脚并运行我的代码时,当我看到寄存器配置正确。
这是我的main.c
#include "stm32f103rb.h"
void delay (void)
{
for (uint32_t i = 0 ; i<500;i++);
}
int main(void)
{
GPIO_Handle_t GpioLed;
GpioLed.pGPIOx = GPIOD;
GpioLed.GPIO_PinConfig.GPIO_PinNumber = GPIO_PIN_NO_2;
GpioLed.GPIO_PinConfig.GPIO_PinMode = GPIO_MODE_OUT10;
GpioLed.GPIO_PinConfig.GPIO_PinOutMode = GPIO_OP_TYPE_PP;
GpioLed.GPIO_PinConfig.GPIO_PinPuPdControl = PULLDOWN;
GPIO_PeriClockControl(GPIOD,ENABLE);
/*pAPB2ENR |= (1<<5); */
GPIO_Init(&GpioLed);
while(1)
{
GPIO_ToggleOutputPin(GPIOD,GPIO_PIN_NO_2);
delay();
}
return 0;
一切似乎都正常,直到我的 GPIO_ToggleOutputPin,当我运行该代码块时:
void GPIO_ToggleOutputPin(GPIO_RegDef_t *pGPIOx, uint8_t PinNumber)
{
pGPIOx->ODR ^= (1 << PinNumber);
}
我可以看到 ODR 寄存器将寄存器中的 ODR2 值更改为 1,但我的 LED 灯没有打开。我不确定我做错了什么。
我尝试通过确保所有寄存器都正确配置来进行调试,但我的 LED 没有打开。
D2
引脚是基于 Arduino 命名符号的 Arduino 引脚,它实际上是 PA10(端口 A,引脚 10),而不是您配置代码正在执行的端口 D、引脚 2。如果您将 LED 连接到
D2
,则需要配置端口 A、引脚 10,或者使用现有代码,但将 LED 连接到电路板左上角的 PD2。参见
STM32 Nucleo-64 板用户手册中的图 14.NUCLEO-F103RB。