六、库函数点亮 LED 灯
配置流程
一般我们使用 GPIO 的端口,都需要有以下几个步骤。
- 开启 GPIO 的端口时钟
- 配置 GPIO 的输出参数
- 配置 GPIO 的输出
从 LED 介绍那一章节我们了解到用户 LED 接的是单片机的 PB2。下面我们就以用户 LED 接的 PB2 进行介绍,其它也是类似的。
在使用库函数之前,我们需要了解到,STM32 官方帮我们做好了这一套库函数,很详细,很全面。我们使用的时候只需要到对应的函数中去查找即可。
开启 GPIO 的端口时钟
所有外设资源时钟默认都是关闭的,在配置外设之前需要先开启对应的时钟。
既然要开启时钟,那我们就要去关于时钟的库函数里去查找,打开 STM32f4xx_rcc.h 头文件,里面有很详细的关于时钟的函数的声明,到里面去查找我们需要的即可。查找一般可根据函数名去定义它的功能。我们要去开启 AHB1 总线中的 GPIOB 的时钟,因为我们的 GPIOB 是挂载在 AHB1 总线上面的。
相对应的开启函数是:
- void RCC_AHB1PeriphClockCmd(uint32_t RCC_AHB1Periph, FunctionalState NewState);
下面还有很多其他的开启函数:
由此可知,这个函数的一个参数就是要使能的时钟,我们要使用的时钟是 GPIOB,开启 GPIOB 时钟转换为代码就是:
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);
配置 GPIO 的输出参数
配置 GPIO 的输出也分为两步,第一步配置输出模式是推挽输出还是开漏输出,第二步配置 GPIO 输出的速度。这配置的也是关于 GPIO 的操作,要到 STM32f4xx_gpio.h 去查找对应的函数或结构体。
- void GPIO_Init(GPIO_TypeDef GPIOx, GPIO_InitTypeDef GPIO_InitStruct)**
这个函数
GPIO_Init
是用于初始化 STM32 系列微控制器的 GPIO(通用输入输出)端口的。它根据提供的参数配置 GPIO 端口的工作模式、速度、输出类型等。
参数解释:
- GPIOx: 这个参数指定了要初始化的 GPIO 端口。
- GPIO_InitStruct: 这是一个指向
GPIO_InitTypeDef
结构的指针,该结构体包含了 GPIO 端口的配置信息。GPIO_InitTypeDef
结构体通常包括以下几个重要的成员:- Pin: 指定要配置的 GPIO 引脚。可以是一个引脚或多个引脚的组合。
- GPIO_Mode: 设置引脚的工作模式,如输出模式、输入模式、复用功能模式等
- 想要使用复用功能还要使用 GPIO_PinAFConfig 函数进行配置。
- GPIO_PuPd: 设置引脚的上拉/下拉电阻状态。
- GPIO_Speed: 设置引脚的输出速度(低速、中速、高速、极高速)。
- GPIO_OType: 输出类型。
满足我们的功能。结构体具体成员:
要配置 PB2 为推挽输出,速度为 100MHZ,只需要传入对应的参数即可。转换为代码为
GPIO_InitTypeDef GPIO_InitStructure;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_Init(GPIOB, &GPIO_InitStructure);
2
3
4
5
6
7
8
9
10
到此,有关 GPIO 的配置就完成了。
配置 LED 输出高电平
配置好 GPIO 之后,我们就可以进行点灯了。其实也就是让 GPIO 引脚输出高低电平,到我们的开发板上就是让 PB2 输出高电平。
如何让 PB2 输出高电平呢?通过查阅库函数,这里为大家总结了几种操作的方式。
GPIO_SetBits
此函数用于将选定的 GPIO 引脚设置为高电平
函数原型为:
void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
- GPIOx: 指定 GPIO 端口,例如 GPIOA、GPIOB 等。
- GPIO_Pin: 指定要设置的引脚,可以是 GPIO_Pin_x(x 可以是 0 到 15),也可以是这些值的组合,表示同时设置多个引脚。
// 配置PB2引脚转化代码为高电平
GPIO_SetBits(GPIOB,GPIO_Pin_2);
2
GPIO_ResetBits
此函数用于将选定的 GPIO 引脚重置为低电平
函数原型为:
void GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
- GPIOx: 指定 GPIO 端口,例如 GPIOA、GPIOB 等。
- GPIO_Pin: 指定要设置的引脚,可以是 GPIO_Pin_x(x 可以是 0 到 15),也可以是这些值的组合,表示同时设置多个引脚
// 配置PB2引脚输出低电平转化代码为
GPIO_ResetBits(GPIOB,GPIO_Pin_2);
2
GPIO_WriteBit
这个函数是往某一位写入一个值,可以直接设置任意一个管脚输出高电平或者低电平。
函数原型为:
void GPIO_WriteBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, BitAction BitVal)
- GPIOx: 指定 GPIO 端口,例如 GPIOA、GPIOB 等。
- GPIO_Pin: 指定要设置的引脚,可以是 GPIO_Pin_x(x 可以是 0 到 15),也可以是这些值的组合,表示同时设置多个引脚
- BitVal: 指定引脚的新状态。可以是
Bit_RESET
(0,低电平)或Bit_SET
(1,高电平)。
// 配置PB2引脚输出高电平转化代码为
GPIO_WriteBit(GPIOB, GPIO_Pin_2, 1);
// 配置PB2引脚输出低电平转化代码为
GPIO_WriteBit(GPIOB, GPIO_Pin_2, 0);
2
3
4
5
GPIO_Write
此函数用于同时写入整个 GPIO 端口的值。
函数原型为:
void GPIO_Write(GPIO_TypeDef* GPIOx, uint16_t PortVal)
- GPIOx: 指定 GPIO 端口。
- PortVal: 16 位值,每一位对应端口上的一个引脚。例如,值
0x0001
将设置端口的第 0 位,而其余位保持不变。
这个函数不建议使用,容易出错,出错了还不容易寻找问题。
实验现象
这一章节的代码
在开发板介绍百度网盘链接中:立创·梁山派·天空星STM32F407VET6开发板资料/第03章软件资料/代码例程/002 库函数点灯。
烧写我们的代码之后,可以看到开发板的 LED 这个灯将被点亮。