蓝桥杯嵌入式学习笔记01 LED灯实验

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

目录

前言

一、实验原理

1.电路原理图

2.SN74HC573介绍

3.分析

二、操作步骤

1.用CUBEMX生成初始化文件

2.编写代码

总结


前言

本次实验使用的开发板是蓝桥杯嵌入式比赛所用的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图像的文件打开

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灯的实验,如果有错误的地方,希望大家帮忙指正一下,谢谢啦!

  • 21
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值