七、库函数点亮LED灯
1. 配置流程
一般我们使用GPIO的端口,都需要有以下几个步骤。
- 开启GPIO的端口时钟
- 配置GPIO的输出参数
- 配置GPIO的输出
从LED介绍那一章节我们了解到用户LED接的是单片机的PC13。下面我们就以用户LED接的PC13进行介绍,其他也是类似的。
在使用库函数之前,我们需要了解到,STM32官方帮我们做好了这一套库函数,很详细,很全面。我们使用的时候只需要到对应的函数中去查找即可。
2. 开启GPIO的端口时钟
所有外设资源时钟默认都是关闭的,在配置外设之前需要先开启对应的时钟。
既然要开启时钟,那我们就要去关于时钟的库函数里去查找,打开STM32f10x_rcc.h
头文件,里面有很详细的关于时钟的函数的声明,到里面去查找我们需要的即可。查找一般可根据函数名去定义它的功能。我们要去开启APB2总线中的GPIOC的时钟,因为我们的GPIOC是挂载在APB2总线上面的。
相对应的开启函数是:
void RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState);
下面还有很多其他的开启函数:
由此可知,这个函数的一个参数就是要使能的时钟,我们要使用的时钟是GPIOC,开启GPIOC时钟转换为代码就是:
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
3. 配置GPIO的输出参数
配置GPIO的输出也分为两步,第一步配置输出模式是推挽输出还是开漏输出,第二步配置GPIO输出的速度。这配置的也是关于GPIO的操作,要到stm32f10x_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_Speed
: 设置引脚的输出速度(低速、中速、高速、极高速)。
满足我们的功能。结构体具体成员:
要配置PC13为推挽输出,速度为50MHZ,只需要传入对应的参数即可。转换为代码为:
GPIO_InitTypeDef GPIO_InitStructure;
// 开启GPIOC的时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13; // 引脚号
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; // 推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; // 输出50Mhz
GPIO_Init(GPIOC, &GPIO_InitStructure); // 初始化
2
3
4
5
6
7
8
9
到此,有关GPIO的配置就完成了。
4. 配置LED输出高电平
配置好GPIO之后,我们就可以进行点灯了。其实也就是让GPIO引脚输出高低电平,到我们的开发板上就是让PC13输出高电平。
如何让PC13输出高电平呢?通过查阅库函数,这里为大家总结了几种操作的方式。
4.1 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),也可以是这些值的组合,表示同时设置多个引脚。
使用示例:
// 配置PC13引脚转化代码为高电平
GPIO_SetBits(GPIOC, GPIO_Pin_13);
2
4.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),也可以是这些值的组合,表示同时设置多个引脚
使用示例:
// 配置PC13引脚输出低电平转化代码为
GPIO_ResetBits(GPIOC, GPIO_Pin_13);
2
4.3 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,高电平)。
使用示例:
// 配置PC13引脚输出高电平转化代码为
GPIO_WriteBit(GPIOC, GPIO_Pin_13, Bit_SET);
// 配置PC13引脚输出低电平转化代码为
GPIO_WriteBit(GPIOC, GPIO_Pin_13, Bit_RESET);
2
3
4
5
4.4 GPIO_Write
此函数用于同时写入整个GPIO端口的值。
void GPIO_Write(GPIO_TypeDef* GPIOx, uint16_t PortVal)
GPIOx
: 指定GPIO端口。PortVal
: 16位值,每一位对应端口上的一个引脚。例如,值0x0001将设置端口的第0位,而其余位保持不变。
⚠警告
这个函数不建议使用,容易出错,出错了还不容易寻找问题。
5. 实验现象
关于这一章节的代码百度网盘下载,在立创·STM32F103C8T6开发板资料(标准库)/第03章软件资料/代码例程/002库函数点灯。
烧写我们的代码之后,可以看到开发板的LED这个灯将被点亮。