12.1关于按键 前面控制LED灯是让GPIO输出高低电平,而获取按键则是读取GPIO电平,从而获知用户是否按下按键。 按键监测一般有两种:按键扫描和按键中断。...12.2硬件设计 如下图 12.2.1 所示,是一种常见轻触按键,该按键有四个脚,①和②脚连接,③和④脚连接,按钮按下后,四脚全相连,实现导通效果。...以最左边的KEY1为例,E2的TVS二极管用于静电保护,可以看作不存在;C36的电容用于硬件去抖,也可以看作不存在。...; 本实验配套代码位于“5_程序源码\5_GPIO—按键轮询\”。...(); // 轮询向下键 DownKeyPolling(); // 轮询向左键 LeftKeyPolling(); // 轮询向右键 RightKeyPolling(); } 1~4行:初始化LED灯和按键
在电子产品中经常用到按键,尤其是经常需要MCU判断短按和长按这两种动作,本篇我们来专门聊下这个话题。 只谈理论太无聊,我们还是结合着实际应用来说明。...理想中的按下-弹起波形是这样的: 但是实际由于按键抖动的存在,实际的波形可能是这样的: 不信的话你可以接上示波器看看,或者软件验证,比如在GPIO中断服务函数里,设置一个全局变量,让它每次进入中断后加...除了上述的中断方式,还可以使用轮询的方式来实现,代码如下: void Key_Init() { GPIOB_ModeCfg( GPIO_Pin_22, GPIO_ModeIN_PU ); } if...它兼顾了去抖和短按/长按的检测,并且长按可以判断出长按按下/长按弹起。短按是检测到弹起时认为是短按动作。另外如果想同时支持多个长按,也很方便添加。...轮询和中断各有优缺点,大家可以根据实际情况来选择,你一般常用哪种方式呢?
它包含以下部分:导电振动弹簧,开关主体,触发销和包装壳。...有多种方式将GPIO的输入导入到程序中,polling( 轮询 )式 和 interrupt( 中断 )式( edge detection 边缘检测 ),“轮询”式如果程序在错误的时间读取值,可能会错过输入...if GPIO.event_detected(channel): print('Button pressed') 不过需要自己新建一个线程去循环检测event_detected()的值,还算是比较麻烦的...由于存在开关抖动(用示波器可以看到),每次按下开关会调用多次回调函数,这不是我们希望的,有两种方式处理开关抖动: ①在开关两个引脚之间添加一个0.1uF的电容 ②软件消抖 ③二者结合使用...定义针脚参数和初始化设置函数setup(),其中就用到了上面讲解的GPIO输入高级应用,本次实验不使用检测函数GPIO.add_event_detect(),采用“轮询”式,在循环中直接查询GPIO.input
使能GPIO端口时钟:在大多数微控制器中,需要使能(即启用)GPIO端口的时钟,以便能够访问和控制该端口上的引脚。读取引脚状态:一旦GPIO引脚被配置为输入,就可以读取其状态了。...去抖动:在读取按键状态时,可能需要进行去抖动处理,以消除由于机械开关的固有特性(如接触弹跳)引起的噪声。实现按键检测逻辑:在读取到按键状态后,可以实现相应的逻辑来处理按键事件。...具体的实现细节可能会因微控制器的型号和开发环境的不同而有所差异。因此,建议查阅相关的硬件文档和软件开发工具包(SDK)以获取更详细的信息。...图 6.1.1 按键抖动说明图从按键的原理图可知,这些按键在没有被按下的时候,GPIO 引脚的输入状态为高电平(按键所在的电路不通,引脚接地),当按键按下时,GPIO 引脚的输入状态为低电平(按键所在的电路导通...(); /*初始化按键*/ Key_GPIO_Config(); /* 轮询按键状态,若按键按下则反转LED */ while(1) { if(ledSwitch == 0){ LED1
有多种方式将GPIO的输入导入到程序中,polling( 轮询 )式 和 interrupt( 中断 )式( edge detection 边缘检测 ),“轮询”式如果程序在错误的时间读取值,可能会错过输入...这使得使用Pygame 或 PyQt 时非常有用,因为其中有一个主循环监听和及时响应GUI事件的基础。 ...if GPIO.event_detected(channel): print('Button pressed') 不过需要自己新建一个线程去循环检测event_detected()的值,还算是比较麻烦的...由于存在开关抖动(用示波器可以看到),每次按下开关会调用多次回调函数,这不是我们希望的,有两种方式处理开关抖动: ①在开关两个引脚之间添加一个0.1uF的电容 ②软件消抖 ③二者结合使用...定义针脚参数和初始化设置函数setup(),其中就用到了上面讲解的GPIO输入高级应用,添加边缘事件检测函数GPIO.add_event_detect()。 #!
基于FreeRTOS设计汽车音响的Source切替和Diag功能,需要合理划分任务、充分利用实时操作系统的特性,确保系统的响应速度和稳定性。...按预定顺序轮询各个音源,支持环形切换。 当前音源状态保持(如断电恢复后记忆上一次的音源)。 多任务实时性:确保按键事件处理不影响音源数据的实时处理。...1.2 Diag 功能 Diag(诊断)功能用于检测硬件和系统状态,典型功能包括: 按键硬件状态检测:确保按键是否正常工作。 音频模块检测:测试功放、电源、数据总线状态。...* GPIOx, uint16_t GPIO_Pin) { static uint32_tpressTime = 0; if (HAL_GPIO_ReadPin(GPIOx, GPIO_Pin...音源切换和音频处理在不同任务中运行,确保切换操作不影响音频播放的实时性。 4.2 去抖动处理 按键扫描增加去抖动逻辑,防止误触发。 4.3 功能扩展 支持断电记忆,通过EEPROM保存当前音源状态。
一、介绍 U型光电传感器是一种对射式光电传感器,它有一个发射端和接收端组成。它的工作原理是通过对红外发射光的阻断和导通,在红外接收管感应出的电流变化来实现开和关的判断。...有多种方式将GPIO的输入导入到程序中,polling( 轮询 )式 和 interrupt( 中断 )式( edge detection 边缘检测 ),“轮询”式如果程序在错误的时间读取值,可能会错过输入...if GPIO.event_detected(channel): print('Button pressed') 不过需要自己新建一个线程去循环检测event_detected()的值,还算是比较麻烦的...由于存在开关抖动(用示波器可以看到),每次按下开关会调用多次回调函数,这不是我们希望的,有两种方式处理开关抖动: ①在开关两个引脚之间添加一个0.1uF的电容 ②软件消抖 ③二者结合使用...定义针脚参数和初始化设置函数setup(),其中就用到了上面讲解的GPIO输入高级应用,添加边缘事件检测函数GPIO.add_event_detect()。 #!
例如,一个简单的温度监控系统可能仅需轮询传感器数据,无需复杂的任务管理。 非RTOS方案的优点包括: 低资源占用:无需操作系统开销,适合资源受限的微控制器。...在实际项目中,我常使用逻辑分析仪记录从外部中断到任务执行的时间戳,并通过多次测试计算平均延迟和抖动。 例如,在一个汽车电子项目中,我们验证了系统在10ms内响应传感器输入,确保满足硬实时要求。...) { for(;;) { HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_5); // 切换连接到PB5的LED osDelay(250...在实际测试中,我使用示波器验证了LED切换的周期,确认任务1和任务2分别以500ms和250ms的间隔运行,抖动小于1ms,满足实时要求。...量化实时性能涉及测量延迟、抖动、吞吐量和确定性,确保系统满足设计要求。
要优雅地处理按键的单击、双击和长按事件,关键在于: 使用去抖动技术,确保每次按键状态的变化都可靠。 通过定时器或者系统时钟来判断按键按下的持续时间和时间间隔。...下面从硬件和软件两个层面给出详细的解决方案: 1、按键去抖动 按键在物理层面上具有机械抖动特性,即按下或松开时会产生多次的电平波动,导致微控制器读取到多个错误的状态变化。...解决方案通常有两种: 1.1 软件去抖动 通过延时去抖动是最简单的方式,即在检测到按键状态变化时,等待一个小的时间间隔,再读取按键状态。...硬件去抖动可以通过RC滤波器(电阻和电容)来实现,使用硬件设计的方式来滤除按键抖动信号,这种方法可以减少CPU负担。...2、按键事件处理 一旦解决了去抖动问题,接下来就是根据不同的按键模式(单击、双击、长按)来识别和响应按键事件。 我们可以通过计时器和状态机来实现。 2.1 单击检测 单击是指按键被快速按下和松开。
GPIO状态的方法来实现按键,当然也可以采用外部中断的方式,对于普通按键来讲,不是很有必要,轮询GPIO状态即可 HAL库GPIO输入模式操作详解与结构介绍 接下来,我们生成代码即可 打开工程之后,我们发现上一节配置的输出...bitstatus; } GPIO输入模式的简单测试 接下来在之前led的任务中,对按键状态进行测试,这里涉及到按键的消抖,所谓“消抖”就是: 当检测到按键状态变化时,不是立即去响应动作,而是先等待闭合或断开稳定后再进行处理...即为按键消抖 按键消抖:可分为硬件消抖和软件消抖。 硬件消抖就是在按键上并联一个电容,如图 8-11 所示,利用电容的充放电特性来对抖动过程中产生的电压毛刺进行平滑处理,从而实现消抖。...但实际应用中,这种方式的效果往往不是很好,而且还增加了成本和电路复杂度,所以实际中使用的并不多。...绝大多数情况下,我们是用软件即程序来实现消抖的 延时消抖 最简单的消抖原理,就是当检测到按键状态变化后,先等待一个 10ms 左右的延时时间,让抖动消失后再进行一次按键状态检测,如果与刚才检测到的状态相同
假设有一个4×4的矩阵按键,它由4行(Row)和4列(Column)组成,共16个按键。 通常,行连接到单片机的GPIO输出端,列连接到GPIO输入端,且列端口通常需要上拉电阻来保持默认高电平。...记录按键位置,并等待去抖动处理。 继续扫描下一行,直到所有行扫描完毕。...FALLING); } } 3、按键去抖动策略 按键在机械接触时会出现抖动,可能会误触发多次按键事件,因此需要去抖动处理。...3.1、软去抖动 通过软件延迟来过滤抖动信号,例如检测到按键按下后,延迟20ms再次检测是否仍然按下。...} return false; } 3.2、硬件去抖动 可在矩阵按键电路中增加一个小电容(如0.1uF)或者使用施密特触发器来稳定按键信号。
GPIO 输入的基本概念 GPIO引脚可以配置为输入或输出模式。在输入模式下,GPIO用于读取外部信号,比如开关、传感器等。...仅在输出模式下有效 } GPIO_InitTypeDef; GPIO_Pin:指定要配置的GPIO引脚,可以是 GPIO_Pin_0 到 GPIO_Pin_15。...GPIO_InitStructure; // 配置PA0为上拉输入模式 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; GPIO_InitStructure.GPIO_Mode...信号去抖动:在读取开关等机械信号时,可能会出现抖动现象。可以通过软件去抖动或硬件滤波器来提高信号的稳定性。 总结 STM32的GPIO输入功能为外部设备交互提供了灵活的解决方案。...通过正确配置GPIO引脚,开发者可以有效地读取外部信号,并在需要时触发中断,增强系统的响应能力。希望本文能够帮助您更好地理解和使用STM32的GPIO输入功能。
当然有专用的去抖电路,也有专用的去抖芯片,但通常我们用软件延时的方法就能解决抖动问题,没有必要添加多余的硬件电路。 ?...GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_2) //PE2 #define WK_UP GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_...= GPIO_Pin_3|GPIO_Pin_4; //KEY2 KEY3对应引脚 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN; //普通输入模式...GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; //100M GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP...按键按松开标志 if(mode)key_up=1; //支持连按 if(key_up&&(KEY0==0||KEY1==0||WK_UP==1)) { delay_ms(10);//去抖动
当然有专用的去抖电路,也有专用的去抖芯片,但通常我们用软件延时的方法就能解决抖动问题,没有必要添加多余的硬件电路。...GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_2) //PE2 #define WK_UP GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_...= GPIO_Pin_3|GPIO_Pin_4; //KEY2 KEY3对应引脚 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN; //普通输入模式...GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; //100M GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP...按键按松开标志 if(mode)key_up=1; //支持连按 if(key_up&&(KEY0==0||KEY1==0||WK_UP==1)) { delay_ms(10);//去抖动
去抖动的方式,我们采用软件延时的方法。过程如下:1. 先设置IO口为高电平(一般上电默认就为高)2. 读取IO口电平确认是否有按键按下3. 如有IO电平为低电平后,延时几个ms4....执行相应按键的程序四、实验内容实验步骤:先用数据线接上电脑和实验盒子,然后在软件中添加对应的源程序编译后的pro.hex文件,断电添加,然后运行一瞬间打开电源。...= 0xFF) //检测按键K1是否按下 { Delay10ms(1); //消除抖动 if (GPIO_KEY !...unsigned char keyValue = 0 , i; //保存键值 //--检测按键1--// if (K1==0) //检测按键K1是否按下 { Delay10ms(1); //消除抖动...= 0xFF)//检测按键K1是否按下{Delay10ms(1);//消除抖动if (GPIO_KEY !
前言在用 ESP32 写项目的时候,很多人一开始都只会用 gpio_set_level 去控制 LED,或者用 gpio_get_level 轮询输入电平。...答案就是——GPIO 中断。这篇文章就围绕官方例程,讲讲怎么用 ESP-IDF 来搞定 GPIO 的中断配置,以及怎么通过任务和队列去处理这些中断事件。痛点在哪?...在做项目的过程中,我们经常会遇到这些问题:想实时响应一个按钮按下的动作,但又不想用轮询多个 GPIO 同时做输入,状态复杂,代码写得很乱想让 GPIO 和任务逻辑解耦,但不知道怎么做这些问题的本质其实就是对...常规处理逻辑使用 while(1) 一直轮询一个按键,如下面代码:void app_main(void){ //zero-initialize the config structure....然后用位运算凑出 “输出引脚掩码” 和 “输入引脚掩码”,方便一口气配置多个引脚。2.
接下来开始分析platform_driver(位于driver/input/keyboard/gpio.keys.c),看看是如何注册按键和实现唤醒的. 4.分析driver/input/keyboard.../gpio.keys.c 4.1该文件里有常用的函数有 static int gpio_keys_probe(struct platform_device *pdev); 设置按键和input_dev...struct gpio_button_data *bdata,const struct gpio_keys_button *button); 设置GPIO,设置input结构体支持的按键值,设置中断,设置防抖动机制...,如果有防抖动,则延时并退出,否则通过schedule_work()来调用gpio_keys_gpio_work_func()一次 static void gpio_keys_gpio_timer(unsigned...long _data); 定时器超时处理函数,用来实现防抖动,里面会通过schedule_work()来调用一次gpio_keys_gpio_work_func(); static void gpio_keys_gpio_work_func
GPIO按键,都是一个子节点,有这些属性: gpios:使用哪个GPIO interrupts:对应的中断 linux,code:对应的按键值 注意:gpios和interrupts至少要保留一个,...不能都省略 debounce-interval: 消除抖动的间隔,单位:ms,默认是5ms 2.2 100ASK_IMX6ULL gpio-keys { compatible = "gpio-keys...IRQ函数 gpio_keys_gpio_isr:设备树中的用gpios来描述用到的引脚 gpio_keys_irq_isr:设备树中的用interrupts来描述用到的引脚 3.2 gpio_keys_gpio_isr...GPIO电平会反复变化,最后才稳定。一般是几十毫秒才会稳定。 如果不处理抖动的话,用户只操作一次按键,会发生多次中断,驱动程序可能会上报多个数据。 怎么处理按键抖动?...看下图: 核心在于:在GPIO中断中并不立刻记录按键值,而是修改定时器超时时间,10ms后再处理。 如果10ms内又发生了GPIO中断,那就认为是抖动,这时再次修改超时时间为10ms。
什么是 GPIO GPIO 是 General Purpose Input Output 的缩写,即“通用输入输出”。...简单的讲,每一个 GPIO 引脚都有两种模式:输出模式(OUTPUT)和输入模式(INPUT)。...和输出模式相反,输入模式是接收外部设备发来的信号。GPIO 通常采用标准逻辑电平,即高电平和低电平,用二进制 0 和 1 表示。在这两个值中间还有阈值电平,即高电平和低电平之间的界限。...GPIO 还可用于中断请求,即设置 GPIO 为输入模式,值达到相应的要求时进行中断。...针对这种抖动现象,可以通过硬件进行去除,比如利用电容的充放电平滑的补偿信号的抖动。也可以利用软件进行去抖,信号抖动的状态有时间限制,添加一个短暂的延时再去检测电平信号。