蓝桥杯 | 嵌入式竞赛 | CT117E-M4 开发板 | 嵌入式模块化学习 | LED模块知识 | LED灯交替闪烁代码实现


前言

准备参加23年的蓝桥杯嵌入式比赛,寒假期间进行知识模板化汇总。大家一起在这交流,增加经验。内容会很详细,帮助像我一样的小白理解,大佬路过不要嫌弃。


提示:以下是本篇文章正文内容,下面案例可供参考

一、实验环境?

软件:STM32CubeMX 、Keil5
STM32CubeMX 在这里插入图片描述

硬件:

请添加图片描述

二、实现LED灯交替闪烁详细讲解

提示:内容包括如何使用CubeMX新建一个工程文件,会的uu可以直接点目录看自己需要的内容

1. 选择MCU

在这里插入图片描述

在这里插入图片描述

2. 配置时钟源

提示:有时候题目要求会明确给出使用外部时钟和内部时钟,两种方法取其一

2.1 配置外部时钟源

在这里插入图片描述

在这里插入图片描述

2.2 配置内部时钟源

在这里插入图片描述


3. 根据产品手册将LED灯进行控制端连接

产品手册有关LED指示灯的部分:

在这里插入图片描述

回到CubeMX进行配置

在这里插入图片描述

其中第3~4步具体操作:

在这里插入图片描述

提示:这里给出跟本次实验步骤无关,关于此款芯片的引脚分组 可以看到同等颜色的框狂选的为一组,其中包含A组、B组、C组等,其实就是后面一线参数为GPIOx时x指的就是这里的分组

例如:"GPIOC, GPIO_PIN8" 指的就是C8,也就是这里的PC8引脚

在这里插入图片描述

4. 工程的相关属性配置

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

4. Keil5的相关配置

打开此工程后弹出的窗口:

在这里插入图片描述

继续配置:

4.1 配置options

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

添加成功后一路点OK

4.2 编译

提示:这里先不要着急自己添加代码,先编译看一下CubeMX自动生成的代码是否能编译成功

在这里插入图片描述

5.编写LED灯代码

5.1 Base_LED文件夹

首先介绍一下我们生成的工程文件所在的文件夹内容

5.1.1 Base_LED文件夹内容

在这里插入图片描述

5.2 Base_LED/Core文件夹内容

在这里插入图片描述

5.2 Base_LED/MDK-ARM文件夹内容

在这里插入图片描述

5.2 编写LED.c 文件

编写LED.c并将其存储在前面介绍的Base_LED/Core/Src文件夹中

LED.c 文件代码如下(示例):

#include <LED.h>

#define DELAY_TIME 100

//使LD1 和 LD2 交替闪烁
void LED_TEST(void)
{
	while(1){
		HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_8); //翻转引脚PC8电平
		HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_SET); //给PD2引脚写1
		HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_RESET); //给PD2引脚写0 锁住当前PC8的状态
		HAL_Delay(DELAY_TIME);
		
		HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_9); //翻转引脚PC9电平
		HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_SET); //给PD2引脚写1
		HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_RESET); //给PD2引脚写0
		HAL_Delay(DELAY_TIME);
	}
}

5.3 编写LED.h

编写LED.h并将其存储在前面介绍的Base_LED/Core/Inc文件夹中

代码如下(示例):

#ifndef __LED_H__

#include "stm32g4xx_hal.h"

#define ON	1
#define OFF	0

//CT117E LED
#define LED1		  GPIO_PIN_8
#define LED2    	GPIO_PIN_9
#define LED3    	GPIO_PIN_10
#define LED4    	GPIO_PIN_11
#define LED5    	GPIO_PIN_12
#define LED6    	GPIO_PIN_13
#define LED7    	GPIO_PIN_14
#define LED8    	GPIO_PIN_15
#define LEDALL		GPIO_PIN_All
#define ON          1
#define OFF         0

void LED_TEST(void);

#endif


5.4 将LED.c添加到本工程中

在这里插入图片描述

在这里插入图片描述

注意: 这里未编译的新添加的文件应该是前面没有“+”的,我这里因为已经编译成功了,所以就已经与.h文件连接所以有“+”

5.5 重新编译工程

提示:因为LED.h文件我们已经提前放到Base_LED/Core/Inc文件夹中,所以这里编译LED.c时会自动连接LED.h文件

在这里插入图片描述

5.6 下载程序

在这里插入图片描述

5.7 实验结果——实现LED灯交替闪烁

暂且放两张图片:(没有先后关系来回闪烁)

请添加图片描述

请添加图片描述

三、LED灯交替闪烁代码详细讲解

3.1 LED.C 文件

文件代码如下:

#include <LED.h>

#define DELAY_TIME 100

//使LD1 和 LD2 交替闪烁
void LED_TEST(void)
{
	while(1){
		HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_8); //翻转引脚PC8电平
		HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_SET); //给PD2引脚写1
		HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_RESET); //给PD2引脚写0 锁住当前PC8的状态
		HAL_Delay(DELAY_TIME);
		
		HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_9); //翻转引脚PC9电平
		HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_SET); //给PD2引脚写1
		HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_RESET); //给PD2引脚写0
		HAL_Delay(DELAY_TIME);
	}
}

3.1.1关键函数:

① HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_8); //翻转引脚PC8电平

void HAL_GPIO_TogglePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin);实现引脚电平翻转
参数设置:
GPIO_TypeDef *GPIOx:端口,如GPIOA,GPIOB等
uint16_t GPIO_Pin:引脚,如GPIO_PIN_1,GPIO_PIN_13等

例:HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_1);翻转一次A1的电平

② HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_SET); //给PD2引脚写1

void HAL_GPIO_WritePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState);上面是翻转这边是写入
参数:
GPIO & GPIO_Pin:同上
GPIO_PinState:引脚状态,是官方采用枚举列举的
typedef enum
{
GPIO_PIN_RESET = 0u, //低电平
GPIO_PIN_SET //高电平
} GPIO_PinState;

例:HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1,GPIO_PIN_RESET );A1写入低电平

③ HAL_Delay(DELAY_TIME);

HAL_Delay(uint32_t Delay);延迟函数
参数:
uint32_t Delay:这里数值为多少就是延迟多少毫秒

例:HAL_Delay(200); 延迟100ms

3.1.2 代码执行过程说明

首先先看一下LED灯的引脚图,可以看到其实是74HC543锁存器来控制LED灯的亮灭
在这里插入图片描述
还可以得知此处的LED为共阳极,即我们通过它的阴极引脚接Low使LED灯亮。

提示:哪一极被接在一起就说共什么极,这里VDD把养鸡接在一起所以叫共阳极

再来看一下74HC543锁存器的相关介绍

在这里插入图片描述
可以看到当LE端接High时,输出端等于输入端;当LE端接Low时,输出端保持不变。

回忆一下我们的初始配置:
PD2 —— Low :即LE端我们接的Low
PC8~PC15——High

这段代码的意思就是因为初始PC8~PC15我们设置的为High——LED灯灭,所以先翻转引脚PC8即LD1,使其由High变为Low。
然后将PD2由Low转为High,即锁存住此时PC8为High的状态,即使LD1亮。
然后此状态延迟100ms。
接着同样的道理使LD2亮100ms。
此代码为while循环,所以就会一直看到LD1和LD2交替闪烁。

提示:当这里的延时时间设置不同时,可能会出现LD1和LD2同时亮的状态,是因为在执行完LD1亮延迟一定时间后顺序执行下面代码,若此时LD1延迟时间过长时,正好LD2也开始延迟亮,就会出现LD1和LD2同时亮的情况啦。

总结

· 以上就是今天要讲的内容,本文仅仅简单介绍了嵌入式开发的初始配置过程,以及LED模块的相关知识的详解。
· 如果对你有帮助的话,可以点赞收藏一波哦~
· 整理不易,希望大家转载时可以说明来源
· 如内容出现任何错误或者大家有其他建议,欢迎留言或私信

参考资料:

hal库学习笔记(二):GPIO

  • 10
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值