训练题——按键部分
Author:Cherry_Ywj
1. 按键读取
CubeMx 配置:
-
设置任意一 GPIO 口为
GPIO_Input
-
上拉和下拉
这一步非常重要!如果你期望按键按下时是低电平,那么就需要上拉。如果没有上拉,此时输入引脚呈高阻态,时而会检测到高电平,时而会检测到低电平。
HAL 库相关函数
//读取引脚状态,这里读取的是PA0,高电平返回1,低电平返回0
int statue = HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0);
按键消抖
按键在按下的那一刻是不稳定的,称为抖动
由于程序跑的很快,抖动的过程中很有可能识别成了多次按键按下,就不是我们想要的效果。相应的办法就是消抖
-
软件消抖
软件消抖的方法很简单,就是检测到按键按下时,加个延时函数,然后再检测一次,延时函数往往不用太长,因为抖动的时间也很短
if(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0)==0) { HAL_Delay(10); //延时10ms //再次检测按键是否按下 if(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0)==0) { ... } }
-
硬件消抖
在按键两端并联一个电容即可,由于电容两端的电压不能突变,会消除按键按下带来的抖动
2. 外部中断
外部中断的最常见形式是硬件监听一个引脚的信号状态,当该引脚的电平发生翻转时,即出现上升沿或下降沿,触发外部中断并进入中断处理函数。用户则可以在相应的回调函数中进行处理。
CubeMx 配置:
-
设置某一 GPIO 口为
GPIO_EXTIx
模式 -
选择电平触发模式
如下图所示,最常用的是红色方框内的三个模式:上升沿触发、下降沿触发以及上升沿下降沿都触发。
注:这里和按键检测一样,也需要加上拉或者下拉。如果希望是下降沿触发,即由高电平变为低电平触发中断,应该选择上拉电阻。
-
NVIC(嵌套向量中断控制器)
在这里设置的是中断优先级,一般说来,对于实时性要求越高的中断,优先级越高。
由于这里只有一个中断,可以不管。
HAL 库配置:
中断触发后,程序会进入void EXTIx_IRQHandler(void)
,这里的 x 根据实际引脚有不同的数值。内部有个HAL_GPIO_EXTI_IRQHandler()
,该函数主要帮助我们清楚中断标志位等其他内容,这样我们就不需要考虑这些东西,只需考虑用户需要做的事情。
现在,找到HAL_GPIO_EXTI_Callback(GPIO_Pin)
的定义,发现前面有个__weak
,我们需要对该函数重新定义一遍,就会覆盖原本内容。
/**
* 函数功能: 外部中断回调函数
* 输入参数: GPIO_Pin:中断引脚
*/
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
if(GPIO_Pin==KEY1_GPIO_PIN)
{
...
}
else if(GPIO_Pin==KEY2_GPIO_PIN)
{
...
}
}