蓝桥杯嵌入式:LED灯的使用(一)

GPIO模式特点:

我们通常使用的gpio的全称是通用输入输出。
它对应的输出模式有:

  • 推挽输出(GPIO_MODE_OUTPUT_PP):既可以输出高电平,也可以输出低电平。
  • 开漏输出(GPIO_MODE_OUTPUT_OD):如果没有上拉电阻,只能输出低电平,此种模式更多用在IIC协议下。
  • 复用推挽输出(GPIO_MODE_AF_PP):将gpio用作第二功能,使用片内外设时候的IIC。
  • 复用开漏输出(GPIO_MODE_AF_OD):将gpio用作第二功能,使用片内外设时候的SPI。

它对应的输入模式有():

  • 模拟输入(GPIO_MODE_ANALOG):在比赛中采集ADC的时候常用。
  • 浮空输入(GPIO_MODE_INPUT):在比赛中通常会拿来写键盘程序。
  • 上拉输入(GPIO_Mode_IPU):将输入口上拉到VCC。
  • 下拉输入(GPIO_Mode_IPD):将输入口上拉到GND。

GPIO的速率特点:

在蓝桥杯目前使用的开发板下的GPIO口的速率通常是有:2MHz、10MHz、50MHz。

CUBEMX对GPIO的设置

我们直接先把先把时钟树配置好,这里我们可以直接使用内部时钟配置配置成80mhz
在这里插入图片描述

然后对GPIO进行选择,根据比赛的原理图,我们知道了这里的LED灯需要使用这几个口。但值得强调的是,PD2是一个特殊的口,由于LED和LCD共用了PC8-PC15,所以我们需要在使用LED的时候先把PD2置高电平,然后写入LED所要的高低电平,然后置低电平,将数据所存在里面。
在这里插入图片描述
然后对CUBEMX进行设置,对应的值为输出模式。
在这里插入图片描述

生成工程文件夹

下面红色框的内容和我的设置一样(速成就不用管太多了):简单提一句就是只需要cubemx帮我们生成对应的.c.h文件别让他全部弄在main.c里面

在这里插入图片描述
加粗样式

代码文件设置

自己创建led.c和led.h的文件

在这里插入图片描述
ctrl+s保存在对应的文件夹,Src保存.c,Inc保存.h
在这里插入图片描述
然后回到keil编译器里面,将刚才的led.c文件放进User里。
在这里插入图片描述
在这里插入图片描述

核心代码

led.h文件(这是一个头文件代码的标准格式,无需多言)

#ifndef __LED_H
#define __LED_H

#include "main.h"
void led_control(uint8_t led_pin);

#endif

led.c文件:代码的总体逻辑就是选择什么灯要亮,然后先打开锁存器,让数据进去,先关闭所有灯,再让需要亮灭的灯进行设置,然后关闭锁存器。

强调一下,空值灯的PIN是按照八位来设置的,比如第一个灯就是00000001,第二个就是00000010,…,这样换算成十六进制就是0x01,0x02,0x04…

为什么要左移八位,那是因为在库函数的文件里是这样设置GPIO_PIN_X的,我们的是8-15所以二进制左移八位就是十六进制左移两位

在这里插入图片描述

#include "led.h"

void led_control(uint8_t led_pin)
{
	HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_SET);//开锁存器
	HAL_GPIO_WritePin(GPIOC,0xff00,GPIO_PIN_SET);//关闭所有灯
	HAL_GPIO_WritePin(GPIOC,led_pin<<8,GPIO_PIN_RESET);//让需要亮灭的灯进行设置
	HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_RESET);//关闭锁存器
}

然后在main.c文件里加入刚才的头文件,尽量写在BEGIN和END里,这样就不会你重新CUBEMX配置后给你刷新掉
在这里插入图片描述
我们让第一个灯亮
在这里插入图片描述
现象:
在这里插入图片描述

Logo

技术共进,成长同行——讯飞AI开发者社区

更多推荐