开始
做好前期准备后,我开始按照以下路线开始蓝桥杯物联网的学习,理论部分我的建议是直接放掉,考试的时候看运气,而编程部分就要好好学习,争取拿到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天。