STM32完全学习——F407ZGT6点亮LED
一、寄存器描述
我们想要点亮LED,无非就是对于寄存器的一些设置,主要分为两步,首先是需要打开相应GPIO的时钟,这是因为STM32在上电后,每个外设的时钟默认都是关闭的,需要我们手动打开。其次就是对GPIO的一些寄存器进行设置,然后给端口输出0或1就可以点亮LED了。需要注意的是我们这次需要在KEIL5软件下进行编程。
二、编程实现
有了上面的寄存器表,我们只需要设置一些值就可以完成对GPIO的控制了,我这个开发板上面我使用的是GPIOF9和GPIOF10这两个端口,LED灯的负极接的GPIOF9和GPIOF10。程序如下:
#ifndef __LED_H__
#define __LED_H__
#define uint unsigned int
typedef 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输出速度设置为50MHz
GPIOF->ODR = 0xfffff0ff; //给GPIOF9和F10两个端口都输出0
}
三、注意事项
首先我们运行上述代码会发现程序好像并没有运行,然后我们只需要勾选一个地方就可以了。
如果还有一些错误比如下面这种:
那么你只需要在main()函数下面在加一个函数就可以了,里面什么都不需要写。
#include "led.h"
int main(void)
{
led_init();
}
void SystemInit(void)
{
}