2-STM32GPIO输入之按键

news2024/9/23 13:27:55

文章目录

  • 1-硬件设计
    • 1.1 按键消斗
      • 1.1.1 RS触发器
      • 1.1.2 电容滤波
    • 2 按键电路设计
    • 2.1 软件消斗
    • 2.2 硬件消斗
    • 2.3 检测原理
  • 2-软件设计
    • 2.1 软件消斗
      • 2.1.1原理
      • 2.1.2 编程要点
      • 2.1.3 步骤
    • 2.2 代码编写
      • 2.2.1 主程序
      • 2.2.2 按键初始化
      • 2.2.2 按键扫描

本章讲述GPIO输入的应用,使用独立按键来进举例验证。GPIO请查看5 - STM32GPIO详解(看这篇就够了)

本章所用到的库函数:

GPIO_Init、GPIO_WriteBit、
GPIO_ReadOutputDataBit,
GPIO_ReadInputDataBit。

1-硬件设计

1.1 按键消斗

对于普通的按键来说,因为是机械是的原因,在按下弹出时会有一定的波动(触点接触导通需要一点时间),因此在这方面需要进行消除抖动,消除的方式有两种:一种是硬件消斗(主要是RS触发器、电容滤波这两种),一种是软件消斗(加延时最长不要超过10ms,最佳在5-10ms,当然这种延时和按键有关系,主要看机械特性。有的按键需要100ms才可以消除抖动,但对于大部分来说5-10ms就可以)
如下图按键抖动原理:

这里介绍一下这几种方式:

1.1.1 RS触发器

利用RS触发器来吸收按键的抖动。一旦有键按下,触发器立即翻转,触电的抖动便不会再对输出产生影响,按键释放时也一样。RS触发电路消抖电路图如下。
RS触发器(图片来源于网络)

1.1.2 电容滤波

将电容并联在按键的两端,利用电容的放电的延时特性。将产生抖动的电平通过电容吸收掉。从而达到消抖的作用,电容消抖电路图如下图所示。
电容滤波(图片来源于网络)
上面两种方式没有MCU时时做常用的,如果有MCU的话就可以使用延时进行消斗,但是,如果电路设计中有按键消斗了,就不在需要使用软件延时了。

2 按键电路设计

2.1 软件消斗

2.2 硬件消斗

2.3 检测原理

根据电路设计,当按键未按下时,GPIO端口输入状态为低电平,按键两端没有导通;当按键按下时,按键导通,GPIO引脚端口输入高电平(把按键当做一根导线,当按键按下的时候,单片机引脚端口与正极连接,这时候GPIO端口就是连接的正极,同样,没有按键也是一样的道理)。所以检测按键是否按下只需要判断高低电平(以此设计为例**,高电平就是接通,低电平就是断开,如果你的按键是接地的和这相反**)。

2-软件设计

2.1 软件消斗

2.1.1原理

独立按键软件扫描方法,需要在程序运行过程中循环或定时检测按键连接的引脚,①在首次检测到按键有效电平时,②延时10ms(不同按键延时不同)后,③再检测一次引脚电平,如能再次检测到有效电平,则是一次有效按键动作,反之则认为是误操作。

软件消斗一般流程如下:
软件消斗一般流程

2.1.2 编程要点

(1)使能GPIO时钟。调用函数RCC_AHB1PeriphClockCmd()。
(2)初始化GPIO模式。调用函数GPIO_Init()。
(3)操作GPIO,读取引脚状态。调用函数GPIO_ReadInputDataBit();

2.1.3 步骤

1、使能相应片上外设的时钟(非常重要),设计到的文件有
头文件:stm32f4xx_rcc.h
源文件:stm32f4xx_rcc.c
使用的主要函数:
RCC_AHB1PeriphClockCmd(uint32_t RCC_AHB1Periph, FunctionalState NewState)
RCC_AHB2PeriphClockCmd(uint32_t RCC_AHB2Periph, FunctionalState NewState)
RCC_APB1PeriphClockCmd(uint32_t RCC_APB1Periph, FunctionalState NewState)
RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState)

2、设置对应于片上外设使用的GPIO工作模式。

3、如果使用复用功能,需要单独设置每一个GPIO引脚的复用功能。

4、在应用程序中读取引脚状态、控制引脚输出状态或使用复用功能完成特定功能

2.2 代码编写

2.2.1 主程序

int main(void)
{
	delay_init(); 	//初始化SysTick,用于延时	
	LED_Config();	//初始化LED灯的GPIO引脚
	Key_Config();	//初始化按键的GPIO引脚
	/*按键控制LED灯*/
	while (1)
	{	/*按键S扫描判别,高电平有效*/
		if(Key_Scan(GPIOC,GPIO_Pin_13,1) == KEY_ON)
		{
			LED_ON;		//点亮LED	
		}
		/*按键扫描判别,低电平有效*/
		if(Key_Scan(GPIOA,GPIO_Pin_13,0) == KEY_ON)
		{
			LED_OFF;		//熄灭LED	
		}
	}
}

2.2.2 按键初始化

void Key_GPIO_Config(void)
{
   GPIO_InitTypeDef GPIO_InitStructure;	
  /*开启按键GPIO口的时钟*/
  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC,ENABLE)	
  /*选择按键的引脚*/
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;
  /*设置引脚为输入模式*/
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;   
  /*设置引脚不上拉也不下拉*/
  //引脚电平受到外部电压影响在这里浮空/上拉/下拉都可以的
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;	
  /*使用上面的结构体初始化按键*/
  GPIO_Init(GPIOC, &GPIO_InitStructure);  

2.2.2 按键扫描

初始化按键后,就可以通过检测对应引脚的电平来判断按键状态

#define KEY_OFF	    0
#define KEY_ON		1

uint8_t Key_Scan(GPIO_TypeDef* GPIOx,uint16_t GPIO_Pin,uint8_t Key_Lvl)
{			
  /*检测是否有按键按下*/
  if(GPIO_ReadInputDataBit(GPIOx,GPIO_Pin) == Key_Lvl )//第一次检测电平
  {	 		
     delay_ms(10);  	//去抖动
     if(GPIO_ReadInputDataBit(GPIOx,GPIO_Pin) == Key_Lvl)//第二次检测电平
	return 	KEY_ON; 	//确认有效按键动作返回
     else
	return KEY_OFF;	//无有效按键动作返回
  }
  else
	return KEY_OFF; //无有效按键动作返回
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/12433.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

第03章_用户与权限管理

第03章_用户与权限管理1 用户管理1.1 登录MySQL服务器1.2 创建用户1.3 修改用户1.4 删除用户1.5 设置当前用户密码1.6 修改其它用户密码1.7 MySQL8密码管理(了解)2. 权限管理2.1 权限列表2.2 授予权限的原则2.3 授予权限2.4 查看权限2.5 收回权限3. 权限表3.1 user表3.2 db表3.…

【springboot】18、内置 Tomcat 配置和切换

文章目录基本介绍Tomcat配置切换其他Web服务总结基本介绍 SpringBoot 支持的 webServer有: Tomcat, Jetty, or Undertow,我们使用spring-boot-starter-web进行web开发时,默认使用的就是Tomcat,下面来说明一下tomcat的配置以及切换其他的Web服…

小啊呜产品读书笔记001:《邱岳的产品手记-05》第9讲 产品案例分析:Hopper的“人工智能” 第10讲 产品被抄袭了怎么办?

小啊呜产品读书笔记001:《邱岳的产品手记-05》第9讲 产品案例分析:Hopper的“人工智能” & 第10讲 产品被抄袭了怎么办?一、今日阅读计划二、泛读&知识摘录1、09 讲 产品案例分析:Hopper的“人工智能”2、10 讲 产品被抄袭…

《机器学习实战》8.预测数值型数据:回归

目录 预测数值型数据:回归 1 利用线性回归找到最佳拟合直线 2 局部加权线性回归 3 示例:预测鲍鱼的年龄 4 缩减系数来“理解”数据 4.1 岭回归 4.2 lasso 4.3 前向逐步回归 5 权衡偏差与方差 6 示例:预测乐高玩具套装的价格 6.1 收…

数字化转型指南发布,官方明确这样做!

上周,工信部《中小企业数字化转型指南》(以下简称《指南》)一经发布,便获得了大量官方媒体的转发,成为了几乎所有制造人的关注所在。制造企业数字化转型的标准路径首次被标准化,并传递给了更多的中国制造企…

python可以考的资格认证有哪些?

前言 可以考虑用Python做一个博客,或者仿制一个微博,或者仿制一个视频网站,或者仿制一个购物网站。界面简单一些,但是基础功能好用就行。(文末送读者福利) 2.或者学习用Python在网上爬一些数据&#xff0…

就地执行Windows Server2022升级

项目初期背景:“微软Windows Server 2012/2012 R2将于2023年10月停止支持 微软今天发出提醒,Windows Server 2012 和 Windows Server 2012 R2 将于 2023 年 10 月终止支持,届时将不再发布补丁更新。由于外企公司比较注重信息安全,对所有服务器需要确保有补丁修复更新,以便保…

一些逻辑漏洞案例

逻辑漏洞的一些案例 某edu高校逻辑漏洞弱口令 已提交该校,已修复 注册登陆 寻找上传点,无果,后缀名不可控 找到另一个登陆点,尝试使用之前注册的账户登陆、爆破、均无果 在测试找回密码处,发送admin用户发现返回管理…

云计算实验4 面向行业背景的大数据分析与处理综合实验

一、 实验目的 掌握分布式数据库接口Spark SQL基本操作,以及训练综合能力,包括:数据预处理、向量处理、大数据算法、预测和可视化等综合工程能力 二、 实验环境 Linux的虚拟机环境和实验指导手册 三、 实验任务 完成Spark SQL编程实验、…

[附源码]java毕业设计基于篮球云网站

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

电压放大器原理(电压放大器适用于什么场合使用)

前阵子有不少的工程师在后台咨询,电压放大器适用于什么场合使用、电压放大器原理等等的内容,虽然电压放大器使用的人群很多,但是还是有不少新手工程师对于电压放大器一知半解。今天安泰电子就来为大家介绍电压放大器的原理以及应用场合。 电压…

redis之变慢了该如何排查?

写在前面 不管什么工具,会使用永远只是第一步,第二步是当其出现某些问题时,拥有排查和修复问题的能力,而我们在使用Redis的过程中,变慢就是其中一个比较棘手的问题,因此本文就一起来看下,当遇到…

STM32实现0.96寸OLED显示模拟IIC和IIC四种实现(标准库和HAL库)

目录 本文通过四种方法实现OLED显示 设备选择 OLED介绍 接线表设计 OLED应用 1.标准库模拟IIC实现OLED显示 2.标准库IIC实现OLED显示 3.HAL库模拟IIC实现OLED显示 4.HAL库IIC实现OLED显示 实现效果 代码下载 本文通过四种方法实现OLED显示 设备选择 1.单片机&#…

数字电路中的基础电路结构

基本单元: 1.1 与非门 1.2 或非门 2输入与非门需要4个晶体管(n输入与非门需要2xn个晶体管),非门需要两个晶体管,2输入或非门需要6个晶体管(n输入或非门需要 2xn 2个晶体管)。 静态存储器 1bi…

用 Java 的 IO 流进行读写文件操作

前言 在计算机领域里 IO,有时也写作 I/O,是Input / Output的缩写,也就是输入和输出。这里的输入和输出是指不同系统之间的数据输入和输出,比如读写文件数据,读写网络数据等等。 本文内容大纲如下: Java 有哪些IO框…

数据结构【AVL树模拟实现】

目录 AVL树概念 AVL树结构 insert AVL树的旋转 新节点插入较高右子树的右侧---右右:左单旋 新节点插入较高左子树的左侧---左左:右单旋 新节点插入较高左子树的右侧---左右:先左单旋再右单旋 新节点插入较高右子树的左侧---右左&…

Bug解决:出现C++:internal compiler error: killed(program cc1plus)

最近在学习hyperscan过程中,安装的过程总是会出现 C:internal compiler error: killed(program cc1plus) 反复查找之后既不是版本问题也不是依赖问题,查阅了很多解决方案后,确认是交换空间不足,所以我们解决的方法是临…

Kotlin 开发Android app(七)上:Kotlin函数fun

对于函数来说,现在的语言越来越想把它往变量上靠。 确实对于函数来说,他应该有很多变量的特性。 在Kotlin 中,定义函数是很简单的一件事情,我觉得编程有的时候是被一些语言给高复杂了,命名很简单的一些事情&#xff0…

matlab绘图

clear a-2:0.1:2; b-3:0.1:3; [x,y]meshgrid(a,b); z(1-(x.2)/4-(y.2)/9).^(1/2); mesh(x,y,z) hold on mesh(x,y,-z) clear a-1:0.1:1; b-2:0.1:2; [x,y]meshgrid(a,b); z(4/9)*(x.2)(y.2); mesh(x,y,z)

运维监控系统 PIGOSS BSM 拓扑自动发现原理

PIGOSS BSM提供了自动发现拓扑功能,能够发现全网拓扑、指定网段拓扑、路由拓扑,能够自动关联系统已经监控的设备的状态在拓扑图上实时显示。在做全网发现的时候,可以指定网段或起始路由器,并设定全网的snmp配置参数后,…