前言:本笔记为百问网7天物联网智能家居训练营学习总结
LED(Light Emitting Diode,发光二极管),是一种能够将电能转化为可见光的半导体器件,当给P极施 加正向电压后,空穴和自由电子在P-N结复合,辐射出光子而发光。如图 8.2.1 所示为目前市面常见的LED灯, 第一个是插件LED灯,第二个是贴片LED灯,第三个是贴片三色LED灯,本开发板使用的是贴片LED灯。
如图 8.2.2 所示为开发板LED灯部分的原理图,LED灯的正极直接连接了3V3,LED灯的负极连接的网 络标号LED(PA1),只需要控制PA1为低电平,即可点亮LED灯,输出为高电平时熄灭LED灯。
软件设计讲解
GPIO选择与接口定义
宏定义GPIO接口的作用是,当实际设计中的LED对应的GPIO发生变化时,只需在宏定义处改变GPIO的 值即可完成对整个LED设计的修改,这样就增强了可移植性。
#define B_LED_GPIO_PIN GPIO_PIN_1
#define B_LED_GPIO_PORT GPIOA
#define B_LED_GPIO_CLK_EN() __HAL_RCC_GPIOA_CLK_ENABLE()
根据原理图可知,用户LED灯对应的引脚是PA1。因此定义代码段的引脚和引脚对应时钟使能函 数的宏定义,当用户工程LED引脚发生变化时,只需在此处做出修改即可。然后是对GPIO的输出函数进行接口宏定义以方便移植与阅读,如代码段所示。
#define ON GPIO_PIN_RESET
#define OFF GPIO_PIN_SET
#define BLED(flag) HAL_GPIO_WritePin(B_LED_GPIO_PORT, B_LED_GPIO_PIN, flag)
HAL库中,对GPIO的输出控制函数是:
void HAL_GPIO_WritePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState)
第一个参数 GPIOx表示GPIOA/B/C/D/E..中某一组端口,此处我们的实验是GPIOA,但是为方便移植 我们使用宏定义的端口B_LED_GPIO_PORT;
第二个参数GPIO_Pin表示在某组端口中的某一个引脚,与选择端口类似,我们选择已宏定义好的LED_GPIO_PIN;
第三个参数PinState表示对这个IO控制输出的状态,是一个枚举类型,包含两个成员:GPIO_PIN_RESET 和GPIO_PIN_SET。因为低电平亮灯,所以定义ON对应GPIO_PIN_RESET,OFF对应GPIO_PIN_SET。
GPIO 的初始化 当选择好LED对应的GPIO后,还需要对其进行初始化,以完成对这些GPIO时钟的使能,工作模式的选择 以及输出速度的设置。
void LedGpioInit(void)
{
// 定义GPIO的结构体变量
GPIO_InitTypeDef GPIO_InitStruct = {0};
// 使能LED的GPIO对应的时钟
B_LED_GPIO_CLK_EN();
GPIO_InitStruct.Pin = B_LED_GPIO_PIN; // 选择LED的引脚
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; // 设置为推挽输出模式
GPIO_InitStruct.Pull = GPIO_PULLUP; // 默认上拉
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; // 引脚输出速度设置为慢
// 初始化引脚配置
HAL_GPIO_Init(B_LED_GPIO_PORT, &GPIO_InitStruct);
// 默认LED灭:OFF-灭,ON-亮
BLED(OFF);
}
在此函数中,首先定义了一个结构体变量GPIO_InitStruct,先看看这个结构体中都有哪些成员。
结构体 GPIO_InitStruct 定义(stm32f1xx_hal_gpio.h)
第一个成员pin是引脚选择;
第二个成员mode是模式选择:输出、输入、复用、中断、事件;
第三个成员是上拉、下拉、悬空选择;
第四个成员是输出速度选择;
这里只需要选择其中需要的宏定义即可。然后使用三个宏定义参数的时钟使能函数使能了选择的GPIO的时 钟。用上述设置GPIO_InitStruct成员讲解的方法设置每个成员的值之后,使用下述函数对选择的某组端口的GPIO引脚进行初始化。
void HAL_GPIO_Init(GPIO_TypeDef *GPIOx, GPIO_InitTypeDef *GPIO_Init)
GPIO 输出控制
在初始化函数的末尾,我们使用了宏定义的IO控制接口控制IO输出高电平,即让LED呈熄灭状态:
// 默认LED灭:OFF-灭,ON-亮
BLED(OFF);
HAL 库延时
HAL库使用系统滴答定时器封装了一个延时函数: __weak void HAL_Delay(uint32_t Delay) 在不对系统滴答定时器进行重新定义的情况下,此延时函数的效果是ms级,即延时Delay个毫秒。
整体控制逻辑
4行:对HAL库的初始化,这一步的作用是初始化中断优先级组别以及对系统滴答定时器进行默认的初始 化;
6行:时钟初始化;
9行:初始化LED;
12~18行:死循环逻辑:闪烁红灯,周期是2s;