【蓝桥杯嵌入式】点灯

1、GPIO口简单介绍

通用并行接口GPIO包括多个16位I/O端口(GPIOA~GPIOG),每个端口可以独立设置4种输入方式(浮空、上拉、下拉和模拟)和4种输出方式(通用推挽、通用开漏、复用推挽和复用开漏)。

2、Cube中对GPIO的设置

点击引脚视图中的引脚标签,会弹出一个功能选择菜单,包括引脚的通用功能和复用功能,和一个复位状态键,可以取消引脚配置。

这里我们先选择输出模式进行演示

对引脚进行配置

这样我们就对一个引脚进行了基本的配置。

3、LED电路图

打开比赛用文件夹中的产品手册,找到其中的LED电路图

可以看到LED采用共阳模式电路,且并不是阴极直接与单片机IO口相连,而是连接了一个锁存器74HC573。74HC573包含八路3态输出的非反转透明锁存器,是一种高性能硅栅CMOS器件。文件夹中也有74HC573的英文文档。

其中,D*是输入端,Q*是输出端,1引脚OE#是输出使能,11引脚LE是锁存使能,输入与输出中间还有一个内部数据保持器。

单片机引脚PC8~PC15与锁存器8个输入引脚相连,锁存器11引脚LE与PD2相连, 当 LE = 0 (PD2输出0)时,PC8~PC15与74HC573内部数据保持器的输入端断开;当 LE = 1 (PD2输出1)时,PC8~PC15与74HC573内部数据保持器的输入端连通。

锁存器1引脚OE#接地,即输出端与保持器的数据会一直保持一致。

因此,我们操作LED的步骤为:

1、复位PC的16个端口(置1),防止其他对PC端口的操作影响到LED的正常显示

2、将需要点亮的LED对应引脚置为0(LED采用共阳模式);

LD8        LD7        LD6        LD5        LD4        LD3        LD2        LD1

          |             |              |             |              |             |              |             |           

PC15     PC14      PC13     PC12      PC11     PC10      PC9        PC8

3、PD2置1,使LE = 1,此时锁存器透明,单机端口与对应的锁存器输入端、输出端状态一致;

4、再将PD2置,断开IO口与输入端的连接,锁存器输出端状态保持,实现了对LED的操作。

4、Cube MX配置PC8~PC15

在Cube 中对PC8~PC15进行配置:

PC8~PC15都配置为输出模式:初始低电平,推挽输出,不上拉不下拉,低速

推挽输出模式(Push-Pull Output):输出引脚可以提供高电平和低电平,能够提供较大的输出电流。在输出高电平时,输出引脚与VCC连接;在输出低电平时,输出引脚与地连接。

PC8~PC15都无外部上拉电阻,所以要用推挽输出。

最后,创建\更新工程。

5、LED模块编写

为了方便开发、修改,我们采用模块化的编程,为每个模块新建一对.c,.h文件,再在主函数中导入使用。

在工程文件夹中新建一个“USER”子文件夹,用于存放用户编写的外设程序。

新建外设.c、.h文件

把文件加载到工程中:

1、打开工程项目管理

2、新建分组并命名

3、往新建的“USER”分组中添加LED.c文件

4、把LED.h头文件加入编译路径中

先在.h头文件中编写以下语句:

1、2句为定义__LED_H这个宏,同时防止头文件多重包含

4句为包含“main.h”,其中有一些全局的宏定义、函数声明等等

7句 #endif  为结束标记,之后要记得多回车一行,防止报错。

这是一个自编头文件基本的一个初始框架,之后就根据需要在头文件中声明编写的函数,变量,宏定义等。

接下来我们在LED.c中编写LED的显示函数

函数名:led_disp,输入变量:led_dat

//LED显示函数
//输入:led_dat,一个八位chat型变量,高位对应LD8,低位对应LD1,对应位为1时,该LED亮
void led_disp(unsigned char led_dat)
{
	GPIOC->ODR = ~led_dat <<8;	//将需要点亮的LED对应IO口置0(共阳模式)
	
	HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_SET);		//使能锁存,LE = 1,IO口数据传递至锁存器输出端
	HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_RESET);	//失能锁存,LE = 0,锁存器输出端保持状态,且不再受IO口影响

}



GPIOC->ODR是GPIO C 的输出数据寄存器(Output Data Register),用于控制该端口的输出状态。

        记得在函数最后多打一行空行,要不然会报警告。

HAL_GPIO_WritePin 是STM32的HAL库提供的函数之一,用于设置指定GPIO引脚的输出电平。

  • GPIOx:要操作的GPIO端口,如 GPIOA、GPIOB、GPIOC 等。
  • GPIO_Pin:要操作的引脚,可以是多个引脚的组合,如 GPIO_PIN_0、GPIO_PIN_1、GPIO_PIN_2 等,也可以通过按位或(|)将多个引脚组合在一起。
  • PinState:要设置的引脚状态,可以是 GPIO_PIN_SET 表示设置引脚为高电平,或者 GPIO_PIN_RESET 表示设置引脚为低电平。

最后,在LED.h中声明下刚写的led_disp函数,LED的模块就写好了。

6、使用LED模块以及演示效果

在main.c中先把led源文件包含进来

注意,自己添加的内容要写在每一对USER CODE BEGIN\END中,才不会在更新工程配置时被清除掉。

在主函数main()中加入代码:

编译,下载:

增加一点变化:

  • 61
    点赞
  • 62
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值