1.硬件
通过查看原理图,我们可以找到我们需要使用的管脚。通过原理图,我们可以看出,LED的两个灯,分别对应着PE5,PB5两个管脚。
2.配置GPIO
确定了引脚,我们就要去配置相应的寄存器,使用这些外设了。两个LED分别对应着GPIOB,GPIOE的5引脚,我们需要去初始化GPIOB/E。初始化GPIO,初学者可以把它当成就是一个模板,本质就是配置结构体,去配置这个结构体然后通过相应的函数去初始化相应的寄存器。(如果对初始化那些寄存器感兴趣的同学,可以去看看STM32的中文参考手册)。
GPIO_InitTypeDef GPIO_InitStructure;
//使能PB,PE端口时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOE, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; //LED0-->PB.5 端口配置
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度为50MHz
GPIO_Init(GPIOB, &GPIO_InitStructure); //根据设定参数初始化GPIOB.5
//下面这个初始化GPIOE,其实和上面GPIOB的是一样的,唯一不同的地方就是GPIO类型不一样。
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; //LED1-->PE.5 端口配置, 推挽输出
GPIO_Init(GPIOE, &GPIO_InitStructure); //推挽输出 ,IO口速度为50MHz
3.使用LED
3.1.方法一:原生的函数
上面的代码已经初始化好了LED,我们使用其实可以通过GPIO提供的函数去控制这些GPIO的管脚信息。
void GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin); //置0
void GPIO_WriteBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, BitAction BitVal); //置1
3.2.自定义宏
自定义宏,其实先自定义函数,在自定义函数里面使用的是标准库给我们提供的函数接口,只不过我们进行了一层封装。(如果简单的,就可以不使用自定义函数了,在宏里面自己调用标准库的函数,使用自定义函数主要是提高宏代码的可读性)
#define LED0(x) (x ? GPIO_SetBits(GPIOB, GPIO_Pin_5) : GPIO_ResetBits(GPIOB, GPIO_Pin_5) ) // PB5
#define LED1 (x ? GPIO_SetBits(GPIOE, GPIO_Pin_5) : GPIO_ResetBits(GPIOE, GPIO_Pin_5) ) // PE5
这样子封装好之后,我们直接使用这个宏就可以了,方便使用了很多。