前言
前几节用到的LED灯、蜂鸣器、继电器元器件,我们都是使用STM32的GPIO输出功能进行驱动,本节开始我们学习GPIO输入功能,当外部按键按下时候,单片机能够实时检测到,按键作为输入设备,在嵌入式系统开发过程中十分常见,一般来说,按键可以设置系统参数、控制系统运行状态。
一、基础知识
1. STM32物联网套件简介
STM32物联网套件目前有两个版本:基础版和高级版,后续会增加应用版本和语音版,核心板均采用STM32F103C8T6核心板,基础版主要元器件如下所示:
高级版版主要元器件如下所示:
STM32物联网套件致力于带领大家入门物联网,不仅学习STM32,也了解转微信小程序开发、物联网服务器后台开发,真正做到了解一个物联网项目的方方面面,基于此,我们定制了一套通用的WIFI通讯协议(可以理解为类似AT指令,不过集成度更高,几条指令就可以直连接云平台),如三条指令连接腾讯云实例。
后续我们会继续增加涂鸦智能、电信云、移动Onenet、阿里云等主流云平台的支持,力争做到,一套STM32代码,通过定制的WIFI模块可以连接到不同的云平台,也欢迎有产品开发需求的朋友私聊我们咨询、定制物联网方案!
本套物联网套件可以支持大学生参加物联网相关比赛、申请学校大创项目、完成毕业设计等,我们的定位是做一家开源智能硬件服务商,和大家一起探索物联网,我们的使命是推动更多物联网产品的落地和普及,让技术不再是阻碍!
2. 按键简介
通常的按键所用开关为机械弹性开关,当机械触点断开、闭合时,电压信号会发生变化,常见的按键开关如下图所示,其中A端引脚在同侧,默认断开,B端引脚在不在同侧,默认导通,当按键按下时,A端导通,B端断开。
此类开关,按下时候通常不会立刻导通,开和关的瞬间伴有一连串抖动,一般为5ms到10ms,具体抖动时间由按键机械特性决定,抖动过程如下图所示:
为了解决这个问题,通常可以采用硬件消抖和软件消抖两种方式,硬件消抖原理是利用电容平波,再经过施密特反相器整形之后就得到了没有毛刺的脉冲波,大多数实际项目中为了节约成本,通常采用软件滤波方式,软件滤波一般采用延时方式处理,当首次检测到按键按下时,软件延时10ms左右时间,然后再次查看按键状态,如果还是按下则认为有按键按下。
3.按键检测原理
简单的独立按键连接电路原理图如下所示
独立按键电路中,按键一边接GND,另一边接到单片机IO口上,当按键按下时候,按键两边1和2导通,单片机P2.5引脚直接连接GND,电平为低电平,所以只需要让单片机不断的检测P2.5引脚的I/O口是否为低电平,一旦程序检测到I/O口引脚变为低电平说明按键按下了。
4. 硬件设计
本次按键实验按键部分原理图如下,按键一端引脚均接地,另一端接到单片机PB4,当按键按下时候PB4为低电平。
实物图如下所示:
其中,PB12引脚输出低电平可以点亮LED灯,当按键按下时候,单片机检测到PB4引脚为低电平,然后点亮LED灯。
二、实例
1. 新建工程
使用STM32CubeMX创建一个新的工程,参考环境搭建章节配置方式,设置RCC和PB12引脚输出
进入Clock configuration页面,选择HSE时钟源,倍频后主时钟为72MHz
切换到Project Manager栏目,设置工程名字、工程保存目录、工具链等信息,具参数如下图所示
点击左边栏目Code Generator,然后勾选Generate peripheral initialization as a pair of ‘.c/.h’ files per peripheral,勾选此选项,外设将单独保存在一个文件中,而不是全部都在main.c中。
然后打开MDK-ARM/4.Key.uvprojx工程
2.修改程序
首先我们编写按键检测函数,当按键按下时候系统能够实时的检测到,注意程序中使用了20ms延时消抖,防止按键异常触发。
int key_scan(void)
{
if (0 == HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_4))
{
HAL_Delay(20);
if (0 == HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_4))
{
return 1;
}
}
return 0;
}
然后开始写main函数主控制逻辑,实现按键按下亮灭LED灯效果
/**
* @brief The application entry point.
* @retval int
*/
int main(void)
{
/* USER CODE BEGIN 1 */
int flag_led = 0;
/* USER CODE END 1 */
/* MCU Configuration--------------------------------------------------------*/
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
/* USER CODE BEGIN Init */
/* USER CODE END Init */
/* Configure the system clock */
SystemClock_Config();
/* USER CODE BEGIN SysInit */
/* USER CODE END SysInit */
/* Initialize all configured peripherals */
MX_GPIO_Init();
/* USER CODE BEGIN 2 */
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
if ( key_scan() )
{
if ( flag_led )
{
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_12, GPIO_PIN_RESET);
}
else
{
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_12, GPIO_PIN_SET);
}
// 取反flag_led,实现按键亮灭LED灯效果
flag_led = !flag_led;
}
HAL_Delay(10);
}
/* USER CODE END 3 */
}
三、下载运行
按照环境搭建章节方式给核心板下载程序,可以看到按键按下可控制LED灯亮灭。
四、小结
如您在使用过程中有任何问题,请加QQ群进一步交流。
QQ交流群:906015840 (备注:物联网项目交流)
源码获取:关注公众号,回复xiaoyi_stm32kits获取资料
硬件获取:某宝搜索小驿物联
小驿物联出品:宁愿做过了后悔,也不要后悔没去做!