一、寄存器描述
我们想要点亮LED,无非就是对于寄存器的一些设置,主要分为两步,首先是需要打开相应GPIO的时钟,这是因为STM32在上电后,每个外设的时钟默认都是关闭的,需要我们手动打开。其次就是对GPIO的一些寄存器进行设置,然后给端口输出0或1就可以点亮LED了。需要注意的是我们这次需要在KEIL5软件下进行编程。
二、编程实现
有了上面的寄存器表,我们只需要设置一些值就可以完成对GPIO的控制了,我这个开发板上面我使用的是GPIOF9和GPIOF10这两个端口,LED灯的负极接的GPIOF9和GPIOF10。程序如下:
#ifndef __LED_H__
#define __LED_H__#define uint unsigned inttypedef struct rGPIO
{uint MODER;uint OTYPER;uint OSPEEDR;uint PUPDR;uint IDR;uint ODR;uint BSRR;
}GPIO_TypeDef;typedef struct rRCC
{uint CR;uint PLLCFGR;uint CFGR;uint CIR;uint AHB1RSTR;uint AHB2RSTR;uint AHB3RSTR;uint RESERVED1;uint APB1RSTR;uint APB2RSTR;uint RESERVED2;uint RESERVED3;uint AHB1ENR;
}RCC_TypeDef;void led_init(void);
#endif
#include "led.h"GPIO_TypeDef *GPIOF = (GPIO_TypeDef *)0x40021400; //GPIOF的起始地址
RCC_TypeDef *RCC = (RCC_TypeDef *)0x40023800; //RCC的起始地址void led_init(void)
{RCC->AHB1ENR &= ~(0x01 << 5);RCC->AHB1ENR |= 0x01 << 5; //开启GPIOF的时钟GPIOF->MODER &= ~((0x03 << 9*2) | (0x03 << 10*2)); GPIOF->MODER |= (0x01 << 9*2) | (0x01 << 10*2); //端口F设置为通用输出模式GPIOF->OTYPER &= ~((0x01 << 9) | (0x01 << 10));GPIOF->OTYPER |= (0x0 << 9) | (0x0 << 10); //端口F设置为推挽输出GPIOF->OSPEEDR &= ~((0x03 << 9*2) | (0x03 << 10*2));GPIOF->OSPEEDR |= (0x02 << 9*2) | (0x02 << 10*2); //端口F输出速度设置为50MHzGPIOF->ODR = 0xfffff0ff; //给GPIOF9和F10两个端口都输出0
}
三、注意事项
首先我们运行上述代码会发现程序好像并没有运行,然后我们只需要勾选一个地方就可以了。
如果还有一些错误比如下面这种:
那么你只需要在main()函数下面在加一个函数就可以了,里面什么都不需要写。
#include "led.h"int main(void)
{led_init();}void SystemInit(void)
{}