什么是按键
按键的物理特性
- 平时没人按的时候,弹簧把按键按钮弹开,此时内部断开的。
- 有人按下的时候,手的力量克服弹簧的弹力,将按钮按下,此时内部保持接通状态;如果手拿开,则弹簧作用下按钮又弹开,同时内部又断开
- 一般的按键都有4个引脚,这4个引脚成2对:其中一对是常开触点(像上面描述的,按下则断开,按下则闭合);一对常闭触点(平时不按是闭合的,按下后是断开的)
按键的电学原理(结合原理图分析)
- 硬件接法: SW5:GPH0_2 SW6:GPH0_3 SW7/8/9/10:GPH2_0/1/2/3
- 按键的电路连接分析:平时按钮没有按下,按钮内部断开,GPIO引脚处电压为高电平,当有人按下按钮是,按钮内部导通,外部VDD经过电阻和按钮连接到地,形成回路。此时GPIO引脚处电压就变成低电平。此时VDD电压全部分压在电阻上(这个电阻就叫做分压电阻,这点点租不能太小,因为电阻的功率:U*U/R,会大量发热。)
总结:按键的工作方法:其实就是按键的按下与弹开,分别对应GPIO的两种电平状态(按下则为低电平,弹开则GPIO为高电平)。此时SoC可以通过检测这个GPIO的电平高低,来判断按键有没有按下,这个判断结果即可作为SoC的输入信号。
按键属于输入类设备
按键一般用来做输入设备(由人向SoC发送信息的设备),由人向SoC发送按键信号(按键信号有2种:按下信号和弹开信号)
有些设备就是单纯的输入设备,譬如按键触摸屏等;有些设备就是单纯的输出设备,譬如LCD;还有一些设备既能输入又能输出的,叫输入输出设备(IO),譬如串口
按键的2种响应方法
SoC处理按键有2种思路:轮询方式和中断方式
- 轮询方式,就是SoC主动的每隔一段时间去读取(按键所对应的GPIO电平的高低),以此获得按键信息。
此方法缺点在于:CPU要一直注意按键事件,会影响CPU做其他事情
中断方式就是SoC事先设定好GPIO出发的中断处理程序,当外部按键按下或者弹开时,会自动出发GPIO对应的外部中断,导致ISR执行,从而自动处理按键信息。
轮询方式处理按键
X210开发板的按键接法
- 查看原理图,找到按键对应的GPIO:SW5:GPH0_2 SW6:GPH0_3 SW7/8/9/10:GPH2_0/1/2/3
原理图上可以看出:按下时是低电平,弹起时是高电平
按键对应的GPIO模式设置
- 按键接到GPIO上,按键按下还是弹起,决定外部电路的接通与否,从而决定这个GPIO引脚电压是高还是低;这个电压可以作为这个 GPIO引脚的输入信号,此时GPIO设置为输入模式,即可从SoC内部读取该引脚电平为1还是0(1对应高电平,0对应低电平)
- GPHOCON(0xE0200C00) GPH0DAT(0xE0200C04) GPH2CON(0xE0200C40) GPH2DAT(0xE0200C44)
- 应该将CON寄存器中将GPIO设置为input模式。然后去读取DAT寄存器相应位(读取到相应位的值为1表示外部为高电平(按键弹起),读取到位为0表示外部为低电平(按键按下))
轮询方式处理按键的程序流程
- (1)先初始化GPIO模式位input模式;
- (2)循环读取GPIO的电平值,然后判断有无按键按下
代码编写和调试
串口输出和按键消抖
基于串口标准输出的按键调试
- 以之前的串口stdio的工程为基础来一直添加轮询方式按键处理
- 注意USB下载方式可能有错误(有可能不下载),解决方案就是用SD卡代替
什么是按键消抖
- 按键这种无理器件本身会有抖动信号,抖动信号是指电平信号由高到低(也就是按键按下时)或者电平由高到低(也就是按键弹起时)的过程中,电平的辩护啊不会死立刻变化,而是经过了一段时间的不稳定期才完成,在这个不稳定期,电平可能会时高时低,反复变化,这就叫抖动(抖动期内获取信息时不可靠的)。
- 什么叫消抖?消抖就是用硬件或者软件方法尽量减少抖动起对按键获取的影响。
- 消抖常见的两种思路:硬件消抖和软件消抖
第一:硬件消抖,消抖的思路是尽量减少抖动时间,具体方法是增加一些电容原件等来消抖
第二:软件消抖,消抖的思路是发现一次按键按下/弹起事件后,不立即处理而是延长一段时间(一般10~20ms,这就是消抖时间)后再去获取键值,如果这次键值和上次的一样那么就认为真的按下/弹起。
一般比较精密需要的时候,需要硬件消抖和软件消抖一起配合。