你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【经验分享】STM32G4之LED实验

[复制链接]
STMCU小助手 发布时间:2022-7-6 14:23
一、实验原理
1.LED原理
开发板原理图

Y4WJKN)9LJ`){_14ZEBY0`H.png

LED的一端接入高电平,所以只要给另外一端(PC9-15)引脚输出低电平LED即可点亮

2.74H573锁存器
但是,LED灯的控制引脚与驱动LCD的引脚有重叠部分,所以在使用LCD的时候会影响LED的使用情况,所以LED需要使用锁存器

WW9](R{DDT4G[{WP`CT0)2L.png

锁存器原理图

9FR0O)PR$LI99Q[}YT}1Z30.png
~N7FE@9`~L(TLK2F)AOA$~K.png

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

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

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

3078a4dc5a564efa86589a58c3372297.png

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

二、工程模板
先建立HAL_LED_TEXT文件夹和HAL_PROJECT_SOURCE文件夹 ![在这里插入图片描述]() HAL_LED_TEXT: 用户编写程序 HAL_PROJECT_SOURCE:利用CubeMX初始化辅助编写,移植到测试文件中
1.使用CubeMX初始化时钟在HAL_LED_TEXT文件夹中



_N`N4YEBJS~A2W$V}4`PT0P.png

文件夹下目录

{1HED6[Z`@88@DN~@DSWJ[S.png

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

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

KKGD[JL0[C8U]SRKGQSSSTG.png

上电默认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文件,主要是把源文件添加到工程里面

1@Q]Q88R9A@PESNQ4RFB_FG.png

添加头文件路径

LDQ7IEJY4{_HOERAXP%M.png

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

  1. #include "LED/bsp_led.h"
复制代码

三、程序编写
1.移植函数
将HAL_PROJECT_SOURCE中gpio的初始化移植到bsp_led.c中

EBGZ$@%~_EH0T1HFPSQ]37X.png

2.LED应用函数
根据ucled的值将对应的8个led点亮(最高位对应LED8)

  1. void LED_Display(unsigned char ucled)
  2. {
  3.         // 0x88
  4.         // 1000 1000
  5.         // 8-->1(灯的顺序)
  6.         //拉高 ,上电默认熄灭
  7.         HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13|GPIO_PIN_14|GPIO_PIN_15|GPIO_PIN_8
  8.                           |GPIO_PIN_9|GPIO_PIN_10|GPIO_PIN_11|GPIO_PIN_12, GPIO_PIN_SET);
  9.         HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_SET);
  10.         HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_RESET);
  11.         
  12.         // 根据ucled的值控制led的亮灭
  13.         HAL_GPIO_WritePin(GPIOC,ucled<<8,GPIO_PIN_RESET);
  14.         HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_SET);
  15.         HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_RESET);
  16. }
复制代码

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

  1. void HAL_GPIO_WritePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState)
  2. {
  3.   /* Check the parameters */
  4.   assert_param(IS_GPIO_PIN(GPIO_Pin));
  5.   assert_param(IS_GPIO_PIN_ACTION(PinState));

  6.   if (PinState != GPIO_PIN_RESET)
  7.   {
  8.     GPIOx->BSRR = (uint32_t)GPIO_Pin;
  9.   }
  10.   else
  11.   {
  12.     GPIOx->BRR = (uint32_t)GPIO_Pin;
  13.   }
  14. }
复制代码

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

GPIOx_BRR:GPIO位复位寄存器 “低”
GPIOx_BSRR :GPIO 端口置位/复位寄存器 “高”
BRSS寄存器:

8T((66~$S7$RWJ1[LRBKP}U.png

Bit 31:16 复位 BR[15:0]
0:对相应的ODx位不执行任何操作
1:复位相应的ODx位(0)
Bit 15: 0 置位 BS[15:0]
0:对相应的ODx位不执行任何操作
1:置位相应的ODx位(1)
BRR寄存器:

7852EG7E~$(8TI79]@3YV7P.png

0:对相应的ODx位不执行任何操作
1:重置相应的ODx位

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

6CTR_LR}NV%0LMAM%ZF}{@C.png

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

HAL_GPIO_WritePin(GPIOC,ucled<<8,GPIO_PIN_RESET):

YRCT{{9P7A)58H1XTH2)7`U.png

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



收藏 评论0 发布时间:2022-7-6 14:23

举报

0个回答

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版