提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
目录
前言
本次实验使用的开发板是蓝桥杯嵌入式比赛所用的CT117E-M4 嵌入式竞赛实训平台。博主第一次写博客,存在很多不足之处,如有说的不对的地方希望大家可以指出来交流一下。
提示:以下是本篇文章正文内容,下面案例可供参考
一、实验原理
1.电路原理图
关于实验原理,我们先来看一下开发板上的LED电路原理图。
2.SN74HC573介绍
SN74HC573是一款八路输出的锁存器,当输入端的数据消失或改变时,输出端的数据在锁存状态下仍保持不变。
芯片引脚介绍:
OE:out enable,输出允许,OE上面有-表示为低电平有效,数据输出允许,低电平有效。当低电平时,三态门打开,锁存器中数据输出到数据输出线。当该信号为高电平时,输出线为高阻态。
LE:load enable,数据输入允许,高电平有效。
当使能LE(G)为高时,Q 输出将随数据LE(D)输入而变。当使能为低时,将输出锁存在已建立的数据电平上。输出控制不影响锁存器的内部工作,即老数据可以保持,甚至当输出被关闭时,新的数据也可以置入。这种电路可以驱动大电容或低阻抗负载,可以直接与系统总线接口并驱动总线,而不需要外接口。特别适用于缓冲寄存器,I/O 通道,双向总线驱动器和工作寄存器。
D0-D7:8位数据输入线
Q0-Q7:8位数据输出线
74HC573真值表:
在真值表中:X为叉号,表示无关,
Z表示高阻,即输出开路
通过真值表我们可以发现:
只有当OE端为低电平、LE端为高电平时,Q端的输出才会和D端的输入保持一致,
当OE端为高电平时,无论LE为何种电平,Q端都为高阻态,即无论此时D端如何变化,Q端总是保持当前状态,而不会随D端的数据变化而变化。
3.分析
根据电路原理图以及芯片功能分析,我们可以分析得:
1. OE引脚直接与GND相连,因此OE始终位L状态,芯片一直保持输出状态。
2. LE引脚与STM32的PD2引脚相连。
当PD2为高电平时,输出端数据等于输入端数据。
当PD2为低电平时,输出端数据保持数据不变。
led灯正极与串联300Ω电阻至电源VDD,因此74HC573输出端低电平即可点亮LED灯。
结合原理图可知:LED1-8分别由PC8-15来控制。
二、操作步骤
1.用CUBEMX生成初始化文件
1.首先我们需要打开比赛赛场资源包
2.选择液晶驱动参考例程
3.打开HAL
4.选择带CubeMX图像的文件打开![](https://img-blog.csdnimg.cn/direct/2fc4ab797de44fc4a94b6cbcf92ec7c5.png)
5.配置GPIO口
由上面的分析,我们可以得知此次实验需要用到的GPIO口为PC8-15以及PD2
由于本次采用的是LCD例程,开发板上PC8-15同时与LCD屏幕连接,所以PC8-15已经被配置成输出模式,因此我们只需要配置PD2。
将PD2配置成输出模式,其余均按照默认配置即可。
6.选择版本
7.点击生成代码
2.编写代码
1.先编译初始化的函数,观察现象
由于初始化配置时,将PC8-15都设置成低电平,所以LED1-8全亮。
2.main函数编写
首先我们要在main函数中的while(1)内编写一个简单的程序来检测CubeMX生成的初始化代码是否有误。
HAL_GPIO_WritePin(GPIOC,GPIO_PIN_8,GPIO_PIN_SET); //将PC8设置为高电平
HAL_GPIO_WritePin(GPIOC,GPIO_PIN_9,GPIO_PIN_SET); //将PC9设置为高电平
HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_SET); //打开锁存器
HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_RESET); //关闭锁存器
编译成功后,观察实验现象。
由上面实验原理的分析,当GPIO口输出低电平时,LED亮,GPIO口输出高电平时,LED灭。
在上面的代码中,我们将PC8和PC9设置成高电平,因此LED1和LED2灭。
3.HAL_GPIO_WritePin函数介绍
在本次点亮LED灯的代码中,我使用到了一个函数,它是HAL库中提供了一个操作GPIO电平的函数:HAL_GPIO_WritePin函数
void HAL_GPIO_WritePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState)
函数名 | HAL_GPIO_WritePin |
---|---|
函数作用 | 让引脚输出高电平或低电平 |
返回值 | void |
参数1:GPIO_TypeDef* GPIOx | 对应GPIO总线,其中x可以是A…I。 例如PC8,则输入GPIOC |
参数2:uint16_t GPIO_Pin | 对应引脚数。可以是0-15。例如PC8,则输入GPIO_PIN_8 |
参数3:GPIO_PinState PinState | GPIO_PIN_RESET:输出平; GPIO_PIN_SET:输出高电平 |
例如,我要将PC8配置为高电平输出,我可以这样写:
HAL_GPIO_WritePin(GPIOC,GPIO_PIN_8,GPIO_PIN_SET);
4.led.c和led.h文件的创建
为了更方便的编写LED灯相关的函数,我们可以创建LED灯相关的.c和.h文件。
首先我们点Ctrl+N创建两个新文件,然后点Ctrl+S进行保存
其中led.c文件需要存储在Src文件夹中,led.h文件需要存储在Inc文件夹中
led.h文件中先添加
#ifndef _LED_H
#define _LED_H
#include "main.h"
#endif
led.c文件中只需要添加
#include "led.h"
5.led灯控制函数的编写
void LED_Control(u8 led_ctrl)
{
//先让全部灯熄灭
HAL_GPIO_WritePin(GPIOC,GPIO_PIN_8|GPIO_PIN_9|GPIO_PIN_10|GPIO_PIN_11|GPIO_PIN_12|GPIO_PIN_13|GPIO_PIN_14|GPIO_PIN_15,GPIO_PIN_SET); //让PC8-15输出高电平
HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_SET); //让PD2输出高电平,打开锁存器
HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_RESET); //让PD2输出低电平,关闭锁存器
HAL_GPIO_WritePin(GPIOC,led_ctrl<<8,GPIO_PIN_RESET); //控制打开的灯
HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_SET); //让PD2输出高电平,打开锁存器
HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_RESET); //让PD2输出低电平,关闭锁存器
}
各个GPIO口对应的值
while函数里面的代码,在代码中,我们让0x80左移八位,得到0x8000,对应着PIN15,也就是LED8
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
LED_Control(0x80); //0x80<<8-->0x8000ff
}
/* USER CODE END 3 */
}
此代码将LED8点亮,现象如下:
LED8点亮,符合实验预期
总结
以上就是今天所讲关于LED灯的实验,如果有错误的地方,希望大家帮忙指正一下,谢谢啦!