STM32F4 | 按键输入实验

news/2024/11/30 15:26:27/

文章目录

    • 一、STM32F4 IO 口简介
    • 二、硬件设计
    • 三、软件设计
    • 四、实验现象
    • 五、STM32CubeMX 配置 IO 口输出

  这一章,我们将通过 ALIENTEK阿波罗 STM32 开发板上载有的 4 个按钮( KEY_UPKEY0KEY1KEY2),来控制板上的 2 个 LEDDS0DS1),其中 KEY_UP 控制 DS0DS1 互斥点亮; KEY2 控制 DS0,按一次亮,再按一次灭; KEY1 控制 DS1,效果同 KEY2KEY0 则同时控制 DS0DS1,按一次,他们的状态就翻转一次。

一、STM32F4 IO 口简介

  这部分内容可参考STM32F4 | GPIO工作原理和配置。STM32F4IO 口做输入使用的时候,是通过调用函数 HAL_GPIO_ReadPin ()来读取 IO 口的状态的。

二、硬件设计

  本实验用到的硬件资源有:

  • 指示灯 DS0DS1
  • 4 个按键:KEY0KEY1KEY2、和 KEY_UP

在阿波罗 STM32 开发板上的按键 KEY0 连接在 PH3 上、KEY1 连接在 PH2 上、KEY2 连接在 PC13 上、KEY_UP 连接在 PA0上。如图所示:
在这里插入图片描述
这里需要注意的是:KEY0KEY1KEY2 是低电平有效的(按下是低电平),而 KEY_UP 是高电平有效的(按下是高电平),并且外部都没有上下拉电阻,所以,需要在 STM32F429 内部设置上下拉。输入模式配置如下

  • PH3:上拉输入
  • PH2:上拉输入
  • PC13:上拉输入
  • PA0:下拉输入

三、软件设计

  我们直接复制上一个实验的工程模板,将复制过来的模板文件夹重新命名为“2-按键实验”。在HARDWARE->KEY 文件夹下面新建key.c 文件以及头文件 key.h
  打开key.c文件,代码如下:

#include "key.h"
#include "delay.h"/*
函数名称:KEY_Init
函数功能:初始化按键输入实验所用到的IO口
输	  入:无
输     出:无
*/
void KEY_Init(void)
{//定义结构体变量GPIO_InitTypeDef GPIO_Initure;//使能按键对应IO口的时钟__HAL_RCC_GPIOA_CLK_ENABLE();__HAL_RCC_GPIOC_CLK_ENABLE();__HAL_RCC_GPIOH_CLK_ENABLE();//初始化IO口;H2和H3是上拉输入,C13是上拉输入;A0是下拉输入//初始化GPIOAGPIO_Initure.Pin = GPIO_PIN_0;	//PA0GPIO_Initure.Mode = GPIO_MODE_INPUT; //输入GPIO_Initure.Pull = GPIO_PULLDOWN;	//下拉GPIO_Initure.Speed = GPIO_SPEED_HIGH;	//高速HAL_GPIO_Init(GPIOA,&GPIO_Initure);//初始化GPIOCGPIO_Initure.Pin = GPIO_PIN_13;	//PC13GPIO_Initure.Mode = GPIO_MODE_INPUT; //输入GPIO_Initure.Pull = GPIO_PULLUP;	//上拉GPIO_Initure.Speed = GPIO_SPEED_HIGH;	//高速HAL_GPIO_Init(GPIOC,&GPIO_Initure);//初始化GPIOH//由于GPIOH与GPIOC的Mode、Pull、Speed配置一样,因此可以省略GPIO_Initure.Pin = GPIO_PIN_2 | GPIO_PIN_3;	//PH2,PH3HAL_GPIO_Init(GPIOH,&GPIO_Initure);}/*
函数名称:KEY_Scan
函数功能:按键处理函数
输   入:mode:0,表示不支持连续按;mode:1,表示支持连续按
输   出:0,表示没有任何按键按下;...
注意:此函数有响应优先级,KEY0>KEY1>KEY2>KEY_UP
*/
u8 KEY_Scan(u8 mode)
{static u8 key_up = 1;	//按键松开标志if (mode==1)	key_up=1;	//支持连按if (key_up && (KEY0==0 || KEY1==0 || KEY2==0 || KEY_UP==1)){delay_ms(10); //延时key_up=0; //标记这次key已经按下if (KEY0==0)		return KEY0_PRES;else if (KEY1==0)	return KEY1_PRES;else if (KEY2==0)	return KEY2_PRES;else if (KEY_UP==1) return KEYUP_PRES;}//KEY键没有按下else if (KEY0==1 || KEY1==1 || KEY2==1 || KEY_UP==0){key_up=1;}return 0;	//无按键按下
}

  KEY_Scan 函数,则是用来扫描这 4 个 IO 口是否有按键按下。KEY_Scan 函数,支持两种扫描方式,通过 mode 参数来设置。

  • mode 为 0 的时候,KEY_Scan 函数将不支持连续按,扫描某个按键,该按键按下之后必须要松开,才能第二次触发,否则不会再响应这个按键,这样的好处就是可以防止按一次多次触发,而坏处就是在需要长按的时候比较不合适。
  • mode 为 1 的时候,KEY_Scan 函数将支持连续按,如果某个按键一直按下,则会一直返回这个按键的键值,这样可以方便的实现长按检测。

  其头文件key.h为:

#ifndef _KEY_H
#define _KEY_H#include "sys.h"//STM32F4的IO口做输入使用的时候,是通过调用函数HAL_GPIO_ReadPin ()来读取 IO口的状态的
#define KEY0 HAL_GPIO_ReadPin(GPIOH,GPIO_PIN_3) //KEY0 按键 PH3
#define KEY1 HAL_GPIO_ReadPin(GPIOH,GPIO_PIN_2) //KEY1 按键 PH2
#define KEY2 HAL_GPIO_ReadPin(GPIOC,GPIO_PIN_13) //KEY2 按键 PC13
#define KEY_UP HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0) //WKUP 按键 PA0//宏定义独立按键按下的值
#define KEY0_PRES 1
#define KEY1_PRES 2
#define KEY2_PRES 3
#define KEYUP_PRES 4//声明函数
void KEY_Init(void);
u8 KEY_Scan(u8 mode);#endif

  打开主函数main.c,代码如下:

/*
实验2:按键输入实验
实验现象:`KEY_UP` 控制 `DS0`,`DS1` 互斥点亮;`KEY2` 控制 `DS0`,按一次亮,再按一次灭;`KEY1` 控制 `DS1`,效果同 `KEY2`;`KEY0` 则同时控制 `DS0` 和 `DS1`,按一次,他们的状态就翻转一次。
*/
#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "key.h"int main(void)
{u8 key;HAL_Init(); //初始化HAL库Stm32_Clock_Init(360,25,2,8); //设置时钟180MHzdelay_init(180);	//初始化延时函数uart_init(115200);	//初始化USARTLED_Init();		//初始化LEDKEY_Init();		//初始化按键while (1){key = KEY_Scan(0);	//单次按键扫描switch (key){case KEYUP_PRES: //控制 LED0,LED1 互斥点亮LED1=!LED1;LED0=!LED1;break;case KEY2_PRES:	//控制 LED0 翻转LED0=!LED0;break;case KEY1_PRES:	//控制 LED1 翻转LED1=!LED1;break;case KEY0_PRES:	//同时控制 LED0,LED1 翻转LED1=!LED1;LED0=!LED0;break;}delay_ms(10);}}

四、实验现象

  使用 USB 线将开发板和电脑连接成功后(电脑能识别开发板上 CH340 串口),把编译后产生的.hex 文件烧入到芯片内。
在这里插入图片描述

实验现象KEY_UP 控制 DS0DS1 互斥点亮;KEY2 控制 DS0,按一次亮,再按一次灭;KEY1 控制 DS1,效果同 KEY2KEY0 则同时控制 DS0DS1,按一次,他们的状态就翻转一次。

  • 按下KEY1
    在这里插入图片描述

  • 按下KEY2
    在这里插入图片描述

  • 按下KEY0
    在这里插入图片描述

  • 按下KEY_UP
    在这里插入图片描述

五、STM32CubeMX 配置 IO 口输出

  阿波罗开发板上有 4 个按键,分别连接四个 IO 口 PA0PC13PH2PH3。其中 WK_UP 按键按下后对应的 PA0 输入为高电平,所以默认情况下,该 IO 口(PA0)要初始化为下拉输入,其他 IO 口初始化为上拉输入即可。
  使用 STM32CubeMX 打开光盘工程模板(双击工程目录的 Template.ioc),我们首先在 IO 口引脚图上,依次设置四个 IO 口为输入模式 GPIO_Input。这里我们以 PA0 为例,操作方法如下图所示:
在这里插入图片描述
同样的方法,我们依次配置 PC13PH2PH3 为输入模式。然后我们进入Configuration->GPIO 配置界面,配置四个 IO 口详细参数。在配置界面点击 PA0 可以发现,当我们在前面设置 IO 口为输入 GPIO_Input 之后,其配置参数只剩下模式 GPIO Mode 和上下拉GPIO Pull-up/Pull-down,并且模式值中只有输入模式 Input Mode 可选。这里,我们配置 PA0 为下拉输入,其他三个 IO 口配置为上拉输入即可。配置方法如下图所示:
在这里插入图片描述
配置完成 IO 口参数之后,接下来我们同样生成工程。打开生成的工程会发现,main.c 文件中添加了函数 MX_GPIO_Init 函数,内容如下:

/** Configure pins as * Analog * Input * Output* EVENT_OUT* EXTI
*/
void MX_GPIO_Init(void)
{GPIO_InitTypeDef GPIO_InitStruct;/* GPIO Ports Clock Enable */__HAL_RCC_GPIOC_CLK_ENABLE();__HAL_RCC_GPIOH_CLK_ENABLE();__HAL_RCC_GPIOA_CLK_ENABLE();/*Configure GPIO pin : PC13 */GPIO_InitStruct.Pin = GPIO_PIN_13;GPIO_InitStruct.Mode = GPIO_MODE_INPUT;GPIO_InitStruct.Pull = GPIO_PULLUP;HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);/*Configure GPIO pin : PA0 */GPIO_InitStruct.Pin = GPIO_PIN_0;GPIO_InitStruct.Mode = GPIO_MODE_INPUT;GPIO_InitStruct.Pull = GPIO_PULLDOWN;HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);/*Configure GPIO pins : PH2 PH3 */GPIO_InitStruct.Pin = GPIO_PIN_2|GPIO_PIN_3;GPIO_InitStruct.Mode = GPIO_MODE_INPUT;GPIO_InitStruct.Pull = GPIO_PULLUP;HAL_GPIO_Init(GPIOH, &GPIO_InitStruct);}

该函数实现的功能和按键输入实验中 KEY_Init 函数实现的功能一模一样。将该函数内容替换按键输入实验中的 KEY_Init 函数内容,替换后会发现实现现象完全一致


http://www.ppmy.cn/news/751366.html

相关文章

STM32按键消抖的几种实现方式-STM32 Button Debouncing

一、按键抖动的现象 按键按下和松开的时候,按键金属片之间的贴合、分离有一个过程。给STM32输入的信号并不是理想的0和1切换的过程。而是如下图所示的,按下和松开的一小段时间内按键信号出现抖动(jitter),这种现象称为…

stm32【按键处理:单击、连击、长按】

按键处理 测试平台:STM32F103C8T6 库版本:官方标准库3.5.0版本 按键:机械按键(需消除抖动影响)或触摸按键, 单片机硬件需求:定时器1个,IO口外部中断功能 按键处理是单片机底层驱动…

linux电脑滚轮不能用,鼠标滚轮不能用,小编教你电脑鼠标滚轮不能用怎么办

电脑用户最近遇到了一个问题,他们发现鼠标滚轮在一些应用下会不起作用。比如,我们用edge浏览器打开网页时,鼠标滚轮上下滚动会失效,而在原有的程序里则正常,那么怎么解决鼠标滚轮不能用的问题呢?下面&#…

服务器没有此伴奏文件,yy开直播,播放伴奏就一卡一卡的,不放伴奏就不卡,。是为什么...

1、关闭下载软件: 很多时候在观看直播的时候,下载游戏或者软件,会很大的影响网速,所以在观看YY直播之前,先把下载软件关闭。 2、设置网速优先: 观看YY直播的时候,也许还会聊天,还会做…

计算机鼠标左键不起作用,鼠标左键失灵怎么办 鼠标左键失灵处理方法【详解】...

现在使用电脑的特别多,我们使用电脑时使用最频繁的就是鼠标和键盘了,我们输入都是需要它们的,但是使用时间长了之后,难免会出现鼠标点击能听到咔哒的声音,但是就没反应,或者是一单机就变成双击,…

【Android】WorkManager的使用

序言 本文主要讲WorkManager的一些使用 WorkManager是在 Android 应用中调度和执行后台任务。它提供了一种灵活、可靠的方式来管理后台任务,并确保它们在最佳的设备条件下执行。 以下是 WorkManager 的主要作用: 后台任务调度:WorkManage…

Prompting Chain of Thought思维链开发实战

7.2 Prompting Chain of Thought思维链开发实战 现在看一个提示词思维链具体的应用案例。首先,定义一个get_completion_from_messages的函数,使用GPT-3.5模型,直接使用OpenAI的API,而不是LangChain的方式。 1. import os 2. import openai 3. import sys 4. from dotenv i…