第三章 按键和中断基础
3.1按键
按键信号的识别:一般来说,按键两个引脚的一端通过电阻上拉到高电平,另一端则接地。即:在没有按键按下的时候,输入引脚为高电平;当有按键按下,输入引脚则为低电平。
通过反复读取按键输入引脚的信号,然后识别高低电平来判断是否有按键触发。
为什么去抖动:按键的输入引脚有低电平产生不代表一定是有按键按下,可能是干扰信号,因此,需要通过去抖动处理,将这些干扰信号过滤,从而获得真实的按键触发信号。
去抖动:首次检测到按键输入引脚有低电平后,稍作延时,再次读取该引脚,如还是低电平,则确认为按键触发信号;否则,判断为干扰信号,不予处理。
电平输入函数
HAL_GPIO_ReadPin(GPIO_TypeDef*GPIOx,unit16_tGPIO_Pin);
例:实现key1按下LED1点亮,key2按下LED2点亮,key3按下全部熄灭。
CubeMX配置:
根据对应的原理图,配置相应的引脚。
图1 设置相应IO口模式
按键消抖处理:
void Scan_Keys(void)
{ /* 读取此时按键值并判断是否是被按下状态,如果是被按下状态进入函数内 */
if(HAL_GPIO_ReadPin(KEY1_GPIO,KEY1_GPIO_PIN)==KEY1_DOWN_LEVEL)
{
/* 延时一小段时间,消除抖动 */
HAL_Delay(10);
/* 延时时间后再来判断按键状态,如果还是按下状态说明按键确实被按下 */
if(HAL_GPIO_ReadPin(KEY1_GPIO,KEY1_GPIO_PIN)==KEY1_DOWN_LEVEL)
{
/* 等待按键弹开才退出按键扫描函数 */
while(HAL_GPIO_ReadPin(KEY1_GPIO,KEY1_GPIO_PIN)==KEY1_DOWN_LEVEL);
}
}
代码实现:
void Scan_Keys(void)
{
if(HAL_GPIO_ReadPin(key1_GPIO_Port,key1_Pin)== GPIO_PIN_RESET)
{
HAL_Delay(10);
if(HAL_GPIO_ReadPin(key1_GPIO_Port,key1_Pin)== GPIO_PIN_RESET)
{
LED1_on();
while (HAL_GPIO_ReadPin(key1_GPIO_Port,key1_Pin)== GPIO_PIN_RESET);
}
}
if(HAL_GPIO_ReadPin(key2_GPIO_Port,key2_Pin)== GPIO_PIN_RESET)
{
HAL_Delay(10);
if(HAL_GPIO_ReadPin(key2_GPIO_Port,key2_Pin)== GPIO_PIN_RESET)
{
LED2_on();
while (HAL_GPIO_ReadPin(key2_GPIO_Port,key2_Pin)== GPIO_PIN_RESET);
}
}
if(HAL_GPIO_ReadPin(key3_GPIO_Port,key3_Pin)== GPIO_PIN_RESET)
{
HAL_Delay(10);
if(HAL_GPIO_ReadPin(key3_GPIO_Port,key3_Pin)== GPIO_PIN_RESET)
{
LED1_off();
LED2_off();
LED3_off();
LED4_off();
while (HAL_GPIO_ReadPin(key3_GPIO_Port,key3_Pin)== GPIO_PIN_RESET);
}
}
}
3.2 外部中断基础
1.ARMCortexM3内核支持256个中断,包括16个内核中断和240个外设中断拥有256个中断优先级
2.STM32的中断通道可能会由多个中断源共用。这就意味着,某一个中断服务函数也可能被多个中断源所共用。所以,在中断服务函数的入口处,需要有一个判断机制,用以辨别是那个中断触发了中断。
3.STM32中有2个优先级的概念:抢占优先级和响应优先级,每个中断都需要指定这两种优先级。
外部中断EXTI是STM32芯片实时处理外部事件的一种机制,由于中断请求来自GPIO端口的引脚,所以称为外部中断。STM32芯片有16个外部中断源EXTI0~EXTI15,分别对应着7个中断向量,也就是对应着7个中断服务函数。
EXTI0、EXTI1、EXTI2、EXTI3、EXTI4:专用。
EXTl5~ EXTI9:共用。
EXTI10~EXTl15:共用
外部中断触发条件:.上升沿触发、 下降沿触发或双边沿触发。
注意:不能配置成高电平触发和低电平触发。
外部中断设计思路:
[1]将GPIO初始化为输入端口。
[2]配置相关I/O引脚与中断线的映射关系。
[3]设置该I/O引脚对应的中断触发条件。
[4]
配置NVIC,并使能中断。
[5]编写中断服务函数。
1→0:下拉
0→1:上拉
[1]将KEY2,即PC13设置为外部中断输入,下降沿触发。在中断服务
函数中,切换LED1的开关状态。
[2]将KEY4,即PB5设置为外部中断输入,.上升沿触发。 在中断服务函
数中,切换LED2的开关状态。
CubeMX配置:
将按键设置为中断模式
设置中断配置方式:

打开中断
重写回调函数
代码:
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
if(GPIO_Pin == GPIO_PIN_1)
{
HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_SET);
HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_8);
}
if(GPIO_Pin == GPIO_PIN_2)
{
HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_SET);
HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_9);
}
}