STM32G4之LED实验


前言


提示:以下是本篇文章正文内容

一、实验原理

1.LED原理

开发板原理图
在这里插入图片描述
LED的一端接入高电平,所以只要给另外一端(PC9-15)引脚输出低电平LED即可点亮

2.74H573锁存器

但是,LED灯的控制引脚与驱动LCD的引脚有重叠部分,所以在使用LCD的时候会影响LED的使用情况,所以LED需要使用锁存器
在这里插入图片描述

锁存器原理图
在这里插入图片描述
在这里插入图片描述

OE为高电平时,无论LE与D端为何种电平状态,其输出都为高阻态,此时芯片处于不可控状态。所以在设计电路直接将OE接地,74HC573一直处于使能状态

当LE为高电平时,D与Q同时为H或L,处于直通状态
当LE为低电平时,无论D为何种电平,Q都保持上一次的数据状态,处于锁存状态

锁存器就是把当前的状态锁存起来,使输入的数据在接口电路的输出端保持一段时间锁存后状态不再发生变化,直到解除锁存。锁存引脚LE高电平表示直通状态,为低电平表示锁存状态,可以通过控制锁存引脚,控制74HC573后端输出数据
在这里插入图片描述

在控制LED的时候,只需在输出对应电平后,给锁存器的LE(N—LE,对应PD2)管脚一个下降沿脉冲即可把对应的电平锁存到锁存器的输出端(Q1~Q8),从而控制LED

二、工程模板

先建立HAL_LED_TEXT文件夹和HAL_PROJECT_SOURCE文件夹 ![在这里插入图片描述](https://img-blog.csdnimg.cn/3358347e1d7d4f09949f69ec06d10fe5.png) HAL_LED_TEXT: 用户编写程序 HAL_PROJECT_SOURCE:利用CubeMX初始化辅助编写,移植到测试文件中

1.使用CubeMX初始化时钟在HAL_LED_TEXT文件夹中
在这里插入图片描述
在这里插入图片描述
文件夹下目录
在这里插入图片描述

注:此时工程中缺少启动文件,一定要从例程(MDK-ARM)中将启动文件添加到工程中。

2.复制HAL_LED_TEXT文件夹到HAL_PROJECT_SOURCE下
在HAL_PROJECT_SOURCE进行GPIO引脚的配置(不在刚才的文件下进行,是为了等下好移植,使工程层次更清晰)
在这里插入图片描述

上电默认LED灯全灭(PC8~PC12为高电平)、锁存器不通(PD2为低电平)、全部为推挽输出、全部无上下拉、全部为低速

3.重构HAL_LED_TEXT文件夹目录
建立中间层BSP,目录结构:HAL_LED_TEXT\Inc\BSP\LED 在该目录下在建立bsp_led.h头文件;HAL_LED_TEXT\Src\BSP\LED 在该目录下在建立bsp_led.c源文件;

然后将上层目录结构添加到Keil工程里面,并删除gpio.c文件,主要是把源文件添加到工程里面
在这里插入图片描述

添加头文件路径
在这里插入图片描述
由于这里只添加到BSP目录路径,所以在引用头文件的时候,我们要采用
如下格式:(因为该目录下可能含有多个外设)

#include "LED/bsp_led.h"

三、程序编写

1.移植函数

将HAL_PROJECT_SOURCE中gpio的初始化移植到bsp_led.c中
在这里插入图片描述

2.LED应用函数

根据ucled的值将对应的8个led点亮(最高位对应LED8)

void LED_Display(unsigned char ucled)
{
	// 0x88
	// 1000 1000
	// 8-->1(灯的顺序)
	//拉高 ,上电默认熄灭
	HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13|GPIO_PIN_14|GPIO_PIN_15|GPIO_PIN_8
                          |GPIO_PIN_9|GPIO_PIN_10|GPIO_PIN_11|GPIO_PIN_12, GPIO_PIN_SET);
	HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_SET);
	HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_RESET);
	
	// 根据ucled的值控制led的亮灭
	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);
}

ucled<<8原因:
HAL_GPIO_WritePin()操作的BSRR和BRR寄存器

void HAL_GPIO_WritePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState)
{
  /* Check the parameters */
  assert_param(IS_GPIO_PIN(GPIO_Pin));
  assert_param(IS_GPIO_PIN_ACTION(PinState));

  if (PinState != GPIO_PIN_RESET)
  {
    GPIOx->BSRR = (uint32_t)GPIO_Pin;
  }
  else
  {
    GPIOx->BRR = (uint32_t)GPIO_Pin;
  }
}

根据传入的参数PinState是将该引脚赋值为高电平还是低电平,操作不同的寄存器

GPIOx_BRR:GPIO位复位寄存器 “低”
GPIOx_BSRR :GPIO 端口置位/复位寄存器 “高”
BRSS寄存器:
在这里插入图片描述
Bit 31:16 复位 BR[15:0]
0:对相应的ODx位不执行任何操作
1:复位相应的ODx位(0)
Bit 15: 0 置位 BS[15:0]
0:对相应的ODx位不执行任何操作
1:置位相应的ODx位(1)
BRR寄存器:
在这里插入图片描述
0:对相应的ODx位不执行任何操作
1:重置相应的ODx位

GPIOx->BSRR = (uint32_t)GPIO_Pin:
这里是将该引脚的BSRR寄存器写入GPIO_PIN_X

赋值给 BSRR 、BRR 的 0 或 1 用于控制输出数据寄存器OD(选中对0~15中的某一引脚进行配置):
BSRR 得到1后映射到OD,相应的位置位(1);
BRR 得到1后映射到OD,相应的位复位(0)

HAL_GPIO_WritePin(GPIOC,ucled<<8,GPIO_PIN_RESET):
在这里插入图片描述

总结:
HAL_GPIO_WritePin() 中的 (uint16_t)GPIO_Pin 由输出数据寄存器OD决定, 输出数据寄存器 OD 由 BSRR、BRR 决定,BSRR、BRR 由 (uint32_t)GPIO_Pin 决定


总结

提示:这里对文章进行总结:

  • 4
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Super.Bear

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值