stm32中如何配置gpio(我在高职教STM32GPIO入门之按键输入)
大家好,我是老耿,高职青椒一枚,一直从事单片机、嵌入式、物联网等课程的教学。对于高职的学生层次,同行应该都懂的,老师在课堂上教学几乎是没什么成就感的。正是如此,才有了借助头条平台寻求认同感和成就感的想法。在这里,我准备陆续把自己花了很多心思设计的教学课件分享出来,如果您正是一名单片机爱好者或是一名同行,欢迎点赞 关注,各位的支持是本人持续输出的动力,多谢多谢!#30天学会STM32##STM32单片机##单片机#
前面,我们介绍了STM32的IO口作为输出的使用,这一章,我们将向大家介绍如何使用IO口作为输入。在本章中,我们将利用开发板上的按键来控制LED的亮灭。通过本章的学习,我们将明白按键的电路原理,了解按键消抖是怎么回事,巩固GPIO的初始化配置,学习GPIO端口输入函数等知识。
【学习目标】
- 了解按键防抖、锁存的方法
- 巩固GPIO初始化的过程,独立完成代码编写
- 理解按键单击、双击、长按的程序算法
按键是初学嵌入式的第一类输入器件,入门不难,但是一旦按法多样化(单击/双击/长按),或是结合其他被控器件,就需要用上中断、定时器、状态机等知识,难度也就上来了。本章还是基于GPIO输入电平的传统方法来按键,计划分两个部分,本文是第二部分。
三、按键的单击/双击/长按电子产品上的轻触按键,除了单击,双击和长按也是比较普遍的输入方式,这样可以在同一个按键上实现更多的控制效果,鼠标就是典型的例子。上一节的程序仅能检测单击这个动作,这一节,我们就来学习一下如何通过一定算法,把这三种动作都能检测出来。
3.1 编程要点我们来分析三种动作的按键IO口电平变化,如图7所示,看看各自有何特征。首先,无论何种动作,都是从按下这个动作开始的。接下来,就是要看按下的时长了,如果超过了长按标准(图中的S3,如2s),那么毫无疑问肯定是长按了,也就排除了单击和双击。因此,从逻辑上来看,判断出长按所需的条件是最少的。
其次,如果按下的时长小于S3,也就是说没到长按标准就松开了,那么就只能是单击或双击其中一种可能。这时,看的就是松开的时长了,如果超过了两次单击间隔标准(图中的D1,如250ms),那么就不是双击了,只能是单击。反之,就是双击。所以,单击或双击的判断依据就变成了“按下时长小于S3 且 松开时长是否小于D1”这样的双重条件了。
最后,还有一种可能,那就是无动作。当然,发生这种情况的条件是没有按下这个动作发生。这种情况其实是程序的初态,或者说是完成一次按键动作后应该回归的状态。至此,本程序的目的就是要通过一系列条件判断得到“单击/双击/长按/无动作”其中一种结果。
图7 单击/双击/长按对应的IO口电平变化
3.2 代码剖析本实验的硬件电路和工程文件清单跟上一个实验一样,但文件中的代码发生了较大变化,因此我们将上一个实验的工程文件另存一份再进行编写,这样不会混淆。需要说明的是,这里为了节省篇幅和排版需要,一些与之前重复的代码做了省略,阅读时请注意,完整的源码请阅读本实验配套的工程。
1. key.h文件源码
如代码清单4所示,这个头文件了增加了很多跟按键动作有关的宏,其实就是把每个按键的每一种可能都起好名字,编好数字。当然,还有一个用来扫描按键动作的函数声明Key_Scan(),其代码也是本实验的重点。
代码清单4 key.h文件源码
2. key.c文件源码
我们主要对该文件中的Key_Scan()函数源码进行剖析,如代码清单5所示,请大家结合上面的编程要点来阅读源码。
代码清单5 key.c文件源码
以上代码给出了扫描KEY1按键的过程,由于判断的条件较多且相互嵌套,理解起来是有一点难度的,大家阅读时可以借助Keil的代码收缩和展开的功能(如图8所示),先理清总体上的逻辑关系,再逐层展开仔细阅读,体会编程思路在代码层面上的实现。
图8 Keil中的代码收缩和展开
3. main.c文件源码
主程序比较简单,如代码清单6所示,主循环中不断根据按键扫描函数的返回值来控制LED的亮灭。单击KEY1,改变红灯状态;双击KEY1,改变绿灯状态;长按KEY1,改变黄灯状态。
代码清单6 main.c文件源码
四、再谈延时和消抖方法上面的两个实验我们都是用简单的延时实现了按键的消抖。对于这种很简单的演示程序,这样写没问题,但是在实际做项目开发时,程序量往往很大,各种状态值也很多,while(1)主循环要不停的扫描各种状态值是否发生变化,及时的进行任务调度。如果程序中加了这种delay延时操作,则很可能有一件事发生了,但程序还在进行delay延时操作中,而delay结束再去检查那件事的时候,已经晚了。
为了避免这种情况的发生,要尽量缩短while(1)循环一次所用的时间,而需要进行长时间延时的操作,必须用其他办法来处理,比如通过IO口的外部中断机制或交给专门的定时器去扫描,这些内容我们将在后续的章节讲到。这里只是先给大家强调一种编程的意识,不光是用来消抖的延时,其它任务的延时亦是如此。
(第二部分完,本文结束)
,免责声明:本文仅代表文章作者的个人观点,与本站无关。其原创性、真实性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容文字的真实性、完整性和原创性本站不作任何保证或承诺,请读者仅作参考,并自行核实相关内容。文章投诉邮箱:anhduc.ph@yahoo.com