文章目录
前言
准备参加23年的蓝桥杯嵌入式比赛,寒假期间进行知识模板化汇总。大家一起在这交流,增加经验。内容会很详细,帮助像我一样的小白理解,大佬路过不要嫌弃。
提示:以下是本篇文章正文内容,下面案例可供参考
一、实验环境?
软件:STM32CubeMX 、Keil5
硬件:
二、实现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模块的相关知识的详解。
· 如果对你有帮助的话,可以点赞收藏一波哦~
· 整理不易,希望大家转载时可以说明来源
· 如内容出现任何错误或者大家有其他建议,欢迎留言或私信