蓝桥杯嵌入式赛道新手速成攻略
本文介绍了蓝桥杯嵌入式赛道的LED控制方法。通过分析原理图,LED阴极连接74HC573锁存器,需要输出低电平点亮。74HC573的锁存功能由PD2控制,当LE为高电平时更新数据。驱动代码通过GPIOC(PC8-PC15)输出信号,配合PD2锁存实现LED控制。重点解释了HAL_GPIO_WritePin函数和左移8位操作的原因,这是为了直接控制LED对应的高位引脚。文章用生动比喻讲解了锁存器工作
蓝桥杯嵌入式赛道新手教程-第一节-LED部分
一、LED部分介绍

- 这是LED部分的原理图
我们可以清晰的看到LED的阳极接到了VDD,阴极接到了这个所谓"SN74HC573"的不知名芯片
(所以可以得到我们需要点亮LED灯时需要给引脚输出低电平,熄灭LED灯则反之)
那么这个芯片是什么呢?有什么作用呢?它的1Q-8Q与1D-8D有什么作用呢?
1.SN74HC573
通过进行了解我们学习到
| 引脚名称 | 功能描述 |
|---|---|
| D0-D7 | 数据输入引脚 |
| Q0-Q7 | 数据输出引脚 |
| LE | 锁存使能(高电平透明传输) |
| OE | 输出使能(低电平激活输出) |
| GND | 接地 |
| VCC | 电源(2V-6V |
SN74HC573 是一款高速 CMOS 逻辑器件,属于八路透明锁存器(Octal D-Type Transparent Latch)
采用3态输出。其典型应用包括数据缓冲、寄存器存储和总线驱动。
读者:???说了这么半天这个玩意怎么用啊!!我又不是来了解它的前世今生
我:那我们直接一个锁脖!提到它的↓
锁存功能:通过锁存使能(LE)引脚控制数据输入(D)到输出(Q)的透明传输或锁存。

说白了就是当我们的 PC8 - PC15 的信号输出到 74HC573 后并没有直接施加到LED上!
74HC573它就像是一个"保安" 直接跟我们要 “过路费” 还严格要求我们 “过路费” 必须交到 LE 的 “桌子上” 才可以给我们 “放行”
当我们去缴费时,LE 特别的挑剔要求我们 今天 白天(高电平)转1块 ,晚上(低电平)转0块 才可以让我通行,我们区区牛马!哪敢说话!直接缴费!避免爆炸!(观察到LE引脚是连接到PD2的,没观察到的现在做10个俯卧撑)
总结:使能PD2,配置默认低电平,即低电平时锁存数据,高电平时不锁存(即更新)数据
PD2锁存器的作用:引脚复用,解决与LCD引脚冲突的问题

说完了大概的驱动方式(其实说的特别抽象ovo),我们直接进入代码的编写以及配置内容。
2.驱动代码
led.c
#include "led.h"
void LED_set(unsigned char ucled)
{
HAL_GPIO_WritePin(GPIOC,GPIO_PIN_All,GPIO_PIN_SET);//熄灭所有灯
HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOC,ucled<<8,GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_RESET);
}
led.h
#ifndef _LED_H_
#define _LED_H_
#include "main.h"
void LED_set(unsigned char ucled);
#endif
3.知其然知其所以然
在学习过程中,我们更希望知其然并知其所以然,我们在下面开始说一说为什么代码要这么写!
由上面的内容可知
我们的LED的控制是由MCU的PC8-PC15输出到74HC573进行锁存
我们在进行由MCU的PD2引脚进行74HC573的LE引脚的控制
即可实现LED的点亮以及熄灭
那么这一句话为什么要这样写呢?
HAL_GPIO_WritePin(GPIOC,ucled<<8,GPIO_PIN_RESET);
让我们先分析HAL_GPIO_WritePin()函数的功能
GPIOx:GPIO 端口指针(如GPIOA),指定要操作的 GPIO 端口。
GPIO_Pin:要操作的引脚(如GPIO_PIN_0),可以是单个引脚或多个引脚的组合(通过位或|操作)。
PinState:引脚状态,枚举类型,取值为GPIO_PIN_SET(高电平)或GPIO_PIN_RESET(低电平)。
介绍完了函数的参数我们进入函数语句
assert_param(IS_GPIO_PIN(GPIO_Pin));
assert_param(IS_GPIO_PIN_ACTION(PinState));
通过assert_param宏检查参数合法性:确保GPIO_Pin是有效的引脚定义,PinState是合法的状态(只能是SET或RESET)。
进入到if语句中进行分析
if (PinState != GPIO_PIN_RESET) // 若状态为高电平(SET)
{
GPIOx->BSRR = (uint32_t)GPIO_Pin;
}
BSRR是 GPIO 端口的 “位设置 / 复位寄存器”(32 位)
低 16 位用于“置位”(Set):当某一位写1时,对应的引脚输出高电平(写0无效果)。如图所示
这是else语句
else // 若状态为低电平(RESET)
{
GPIOx->BRR = (uint32_t)GPIO_Pin;
}
BRR是 GPIO 端口的 “位复位寄存器”(32 位),低 16
位用于“复位”(Reset):当某一位写1时,对应的引脚输出低电平(写0无效果)。
我们通过设置好PC端口的BSRR与BRR即可实现对PC0-PC15的引脚电平输出控制(高/低电平)
再回到这条语句
HAL_GPIO_WritePin(GPIOC,ucled<<8,GPIO_PIN_RESET);
为什么要让变量ucled左移8位呢?
第一点:因为我们的LED的引脚只使用了PC8-PC15这些高位的引脚。
第二点:如果我们一个一个引脚的控制会不会有点麻烦呢?不如我们直接对这些高位进行控制吧,那怎么控制呢我们直接进行左移操作!
以我们点亮第一个LED(PC8)为例~~~
定 ucled = 0x01
当我们输入HAL_GPIO_WritePin(GPIOC,ucled<<8,GPIO_PIN_RESET);
左移也逃不过我们小伙伴的火眼金睛,那么0x01左移8位是多少呢,说得好是0x100!
如下图所示即为GPIO_PIN_8,我们就控制了PC端口的8号引脚,在通过PD2进行锁存、输出即可控制LED灯
其他内容由小伙伴们自己去发掘~~~~~~~~~~~~~
#define GPIO_PIN_0 ((uint16_t)0x0001) /* Pin 0 selected */
#define GPIO_PIN_1 ((uint16_t)0x0002) /* Pin 1 selected */
#define GPIO_PIN_2 ((uint16_t)0x0004) /* Pin 2 selected */
#define GPIO_PIN_3 ((uint16_t)0x0008) /* Pin 3 selected */
#define GPIO_PIN_4 ((uint16_t)0x0010) /* Pin 4 selected */
#define GPIO_PIN_5 ((uint16_t)0x0020) /* Pin 5 selected */
#define GPIO_PIN_6 ((uint16_t)0x0040) /* Pin 6 selected */
#define GPIO_PIN_7 ((uint16_t)0x0080) /* Pin 7 selected */
#define GPIO_PIN_8 ((uint16_t)0x0100) /* Pin 8 selected */
#define GPIO_PIN_9 ((uint16_t)0x0200) /* Pin 9 selected */
#define GPIO_PIN_10 ((uint16_t)0x0400) /* Pin 10 selected */
#define GPIO_PIN_11 ((uint16_t)0x0800) /* Pin 11 selected */
#define GPIO_PIN_12 ((uint16_t)0x1000) /* Pin 12 selected */
#define GPIO_PIN_13 ((uint16_t)0x2000) /* Pin 13 selected */
#define GPIO_PIN_14 ((uint16_t)0x4000) /* Pin 14 selected */
#define GPIO_PIN_15 ((uint16_t)0x8000) /* Pin 15 selected */
#define GPIO_PIN_All ((uint16_t)0xFFFF) /* All pins selected */
openvela 操作系统专为 AIoT 领域量身定制,以轻量化、标准兼容、安全性和高度可扩展性为核心特点。openvela 以其卓越的技术优势,已成为众多物联网设备和 AI 硬件的技术首选,涵盖了智能手表、运动手环、智能音箱、耳机、智能家居设备以及机器人等多个领域。
更多推荐




所有评论(0)