开始

做好前期准备后,我开始按照以下路线开始蓝桥杯物联网的学习,理论部分我的建议是直接放掉,考试的时候看运气,而编程部分就要好好学习,争取拿到85%以上的分数,而最简单的就是学会HAL库与STM32L071KBU的各个模块使用,如果你手上有开发板,那么刚好可以跟我一起一步步走下去。

GPIO输出

既然有机会,那么我也顺便学习一下理论部分,万一考了呢,

图片来源互联网

LED发光二极管

LED (Light Emitting Diode) :发光二极管,发光原理:利用PN结进行发光,当半导体施加正向电压时,电子和空穴就会移动并再次结合,在结合的过程中将产生大量的能量,而这些能量以光的形式释放出来。

GPIO是通用输入/输出端口的简称,GPIO的引脚与外部设备连接,可实现与外部通讯、控制外部硬件或者采集外部硬件数据的功能。GPIO的8种工作模式:浮空输入、输入上拉、输入下拉、模拟输入、开漏输出、开漏复用输出、推挽输出、推挽复用输出

点亮LD5

请按照上一节[蓝桥杯物联网从0开始]第15届蓝桥杯物联网省赛CubeMx、Keil5软件的学习与使用图文步骤创建工程。在创建工程时,PC14设置为输入模式,并且不需要对其进行向下拉的额外配置等,

首先查看原理图,在原理图上相对应的引脚,如下图所示,由该原理图可知,PC15引脚连接到LD5负极的一端,LD5正极连接一个510欧姆的限流电阻,起到保护电路的作用,整个电路就是一个简单的串联电路。当PC15引脚输出低电平时,LD5点亮;反之,LD5熄灭。

熄灭LED

HAL_GPIO_WritePin(GPIOC,GPIO_PIN_15,GPIO_PIN_SET);

点亮LED

HAL_GPIO_WritePin(GPIOC,GPIO_PIN_15,GPIO_PIN_RESET);

GPIO输入

GPIO输出大致如上,接下来是GPIO输入,输入一般是当有外部事件发生时将信号给到CPU,再执行相应操作,常见的有按键、外部中断等。

通过电路原理图可以看出,USER按键对应PC14端口,我们需要将其配置为输入模式。

基本原理

按键的基本原理是通过物理接触或靠近触摸表面来传递信号。在机械键盘中,按键由一个弹簧和一个触点组成。当按键按下时,弹簧会压缩并使触点接触到电路板上的金属触点,闭合电路,发送信号给计算机。

完整的按键过程:按键按下--->消除抖动--->按键弹起。

在这个过程中,按键可以被设置为按下有效、抬起有效,抬起有效是一次完整的按键过程,既按下->抬起,而消除抖动是按键必不可少的一环,在比赛或日常中,我们大部分时候使用的按键是接触式按键,靠机械的接触来实现开关功能。

按键抖动

理论上来说按键的波形应该是图1这样,平稳的按下抬起,可实际上按键波形是图2这样,有明显的抖动,既不平稳电平变化,机器无法正确判断你是否按下了按键,按下了几次按键,因此如果不做消抖处理,那么很可能出现按一下按键却检测到N次按键。

按键消抖

按键消抖有两种方式,硬件消抖和软件消抖

硬件消抖:

按键电路中增加一个滤波器(并联一个电容),通过引入一个适当的延迟时间(利用电容的充放电特性),在按键触发之后一段时间内忽略其他可能的触发信号,从而消除跳动。但是成本较高,对产品的集成度也有一定影响,很少使用。

软件消抖:

按键按下时,可以通过检测连续一段时间内的按键状态来确认按键的有效触发。如果在连续检测期间内,按键保持按下状态,即被认定为有效触发。这种方法通常需要使用定时器或计数器来进行时间延迟和计数。这是成本最低也是最常用的方法。

代码编写

可以看到,CubeMx创建的工程,已经帮我们初始化了GPIO,我们直接使用就可以了。

GPIO_InitTypeDef GPIO_InitStruct = {0};

/* GPIO Ports Clock Enable */

__HAL_RCC_GPIOC_CLK_ENABLE();

/*Configure GPIO pin Output Level */

HAL_GPIO_WritePin(GPIOC, GPIO_PIN_15, GPIO_PIN_RESET);

/*Configure GPIO pin : PC14 */

GPIO_InitStruct.Pin = GPIO_PIN_14;

GPIO_InitStruct.Mode = GPIO_MODE_INPUT;

GPIO_InitStruct.Pull = GPIO_NOPULL;

HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);

/*Configure GPIO pin : PC15 */

GPIO_InitStruct.Pin = GPIO_PIN_15;

GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;

GPIO_InitStruct.Pull = GPIO_NOPULL;

GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;

HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);

在头部定义KEY,这里不需要分号

#define KEY HAL_GPIO_ReadPin(GPIOC,GPIO_PIN_14)

#define Key_Down 0

#define Key_Up 1

在主函数的while循环中写按键按下后,切换PC15的当前状态,其中for是用来消抖的,也可以直接使用HAL_Delay库函数,大概有20ms左右的延迟就好了。

if(KEY==Key_Down)

{

for(int i=0;i<0x1ffff;i++); //消抖

if(KEY==Key_Up)

{

HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_15);

}

}

最后

这个GPIO真的是太简单了,输入输出一句话的事,如果不讲原理这篇看起来就空空的,距离省赛还有35天,按照这个进度,上课的时间不学或者少学点,没课了来一边学一边写,大概两周能完成:GPIO电灯-->按键输入-->外部中断-->定时器-->串口-->ADC输入-->模块模拟输入-->EEPROM

倒计时:35天。

文章链接

评论可见,请评论后查看内容,谢谢!!!
 您阅读本篇文章共花了: