蓝桥杯STM32G431RBT6学习——LED
前言
LED为每年必考考点,也是入门的基础,国信长天的开发板LED硬件如下:
经典的锁存器控制,因为LED所用引脚与LCD重叠,因此通过锁存器进行控制其状态。当74HC573的LE引脚(PD2)为高电平时,锁存器处于解锁状态,PC8~PC15电平直接输出给到LED,当LE引脚(PD2)为低电平时,74HC573将电平信号进行锁存。
STM32CubeMX配置
时钟配置依旧,只需要将LED及锁存器LE引脚对应的单片机IO口设置为输出模式即可,LED为共阳接法,且LE引脚为低电平锁定,因此IO口初始状态均设为低电平、推挽输出、无上下拉、低速。
Keil代码编写
GPIO的初始化由CubeMX自动生成与gpio.c中的MX_GPIO_Init函数。
关于LED的常用API如下:
设置输出电平
void HAL_GPIO_WritePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState)
参数1:IO口所在组;
参数2:IO口引脚号;
参数3:输出电平
反转IO口电平输出
void HAL_GPIO_TogglePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin)
参数1:IO口所在组;
参数2:IO口引脚号
LED的控制只需要简单的给对应IO口赋值低电平即可点亮,为了方便使用,也可以对其控制进行封装,以下分别封装为整体控制与单独控制:
整体控制:
整体控制为一次改变所有LED的状态,因此可以在函数的开头对LED进行全灭处理,随后将目标LED状态写入,写入完成后开关锁存器将IO口信号输出到LED即可,最后保存写入值用于单独控制使用,代码如下:
/****************
函数功能:整体LED设置函数
函数参数:整体LED状态值(8位)
函数返回值:无
****************/
void LED_Set(uchar led_Pin)
{
//每次更新状态先熄灭所有LED
HAL_GPIO_WritePin(GPIOC,GPIO_PIN_All,GPIO_PIN_SET);
//写入LED的值(16位GPIO,LED占用高八位),以低电平写入
HAL_GPIO_WritePin(GPIOC,led_Pin<<8,GPIO_PIN_RESET);
//拉高解锁74HC573,传入数据后重新拉低锁存
HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_RESET);
ledState = led_Pin;
}
单独控制:
由于整体控制会一次改变所有的LED状态,例如需要LED1保持不变的情况下改变LED2就会稍许麻烦,因此也封装一个函数用于单独改变某个LED的状态,直接读取上次的状态进行写入后,再对单独的LED进行控制即可,代码如下:
/****************
函数功能:单独LED设置函数
函数参数:参数1:LED所在引脚,参数2:LED状态值
函数返回值:无
****************/
void LED_SetOne(uint16_t GPIO_Pin, GPIO_PinState PinState)
{
HAL_GPIO_WritePin(GPIOC,ledState<<8,GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOC,GPIO_Pin,PinState);
HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_RESET);
ledState = !GPIOC->IDR>>8;
}