写在前面——
本文将介绍嵌入式竞赛实训平台(CT117E-M4)开发板上8个LED灯的使用。
目录
硬件平台
软件平台
LED原理图
配置过程
编写函数
嵌入式竞赛实训平台(CT117E-M4)是北京国信长天科技有限公司设计、生产的一款“蓝桥杯全国软件与信息技术专业人才大赛–嵌入式设计与开发科目”专用竞赛平台,平台STM32G431RBT6为主控芯片,预留扩展板接口,可为用户提供丰富的实验场景
CT117E-M4产片图片
KEIL5,STM32CubeMX
从原理图中我们可以看出,8盏LED灯通过锁存器74HC573驱动,LED灯的阴极连接在锁存器的输出端,采用低电平的方式点亮。锁存器的输入端连接在GPIO的PC8~PC15上,控制引脚连接在PD2引脚上。74HC573开解锁的控制逻辑如下图:
74HC573在LE引脚的上升沿开锁,允许1D ~ 8D 的数据存入 锁存器,但此时并不会将这些数据输出到1Q ~ 8Q,输出的数据保持不变。74HC573在LE引脚的下降沿时刻上锁,上锁后不在允许1D8D的数据存入锁存器,同时将之前存入锁存器的数据输出到1Q~8Q,完成一次数据刷新。
注:为什么会将LED灯连接在锁存器上,我猜可能是因为它与LCD显示屏共用IO口
由上面的分析我们可以得出我们点灯的思路应该是这样的:
① 拉高PD2,进行开锁
② 写PC8~PC15,点亮或者熄灭相应LED灯
③ 拉低PD2,进行上锁
将 PC8 ~ PC15 配置为输出模式,将控制引脚PD2也配置为输出模式
GPIO的初始化配置我们通过CubeMX一键生成即可,以下代码是我认为比较简单实用的:
① LED逻辑控制函数
//可以在main.h或者main.c的用户宏定义区中添加
#define GPIO_PIN_AllLED GPIO_PIN_13|GPIO_PIN_14|GPIO_PIN_15|GPIO_PIN_8|GPIO_PIN_9|GPIO_PIN_10|GPIO_PIN_11|GPIO_PIN_12
void led_all_off() //关闭所有的LED灯
{
HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, 1);
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_AllLED, 1);
HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, 0);
}
void led_all_on() //打开所有的LED灯
{
HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, 1);
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_AllLED, 0);
HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, 0);
}
void led_off(uint8_t m) //只关闭某一个LED灯(m取值为 1 ~ 8)
{
HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, 1);
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_7 << m, 1);
HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, 0);
}
void led_on(uint8_t n) //只打开某一个LED灯(n取值为 1 ~ 8)
{
HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, 1);
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_7 << n, 0);
HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, 0);
}
void led_status_off(uint8_t b) //关闭一部分LED灯(传入的8位数据分别控制8个灯)
{
HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, 1);
GPIOC -> ODR = (b << 8);
HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, 0);
}
void led_status_on(uint8_t c) //打开一部分LED灯(传入的8位数据分别控制8个灯)
{
HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, 1);
GPIOC -> ODR = (c << 8);
HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, 0);
}
② 在主函数中可以这样调用
led_all_off(); //关闭所有的LED灯
led_all_on(); //打开所有的LED灯
led_on(3); //打开LED灯 3
led_off(3); //关闭LED灯 3
led_status_on(0x06); //打开LED2和LED3
led_status_off(0x06); //关闭LED2和LED3
led_status_on(0x35); //打开LED1,LED3,LED5,LED6
led_status_off(0x35); //关闭LED1,LED3,LED5,LED6
以上就是LED的基本用法了,欢迎大家点赞、收藏、转发