什么是中断
中断执行机制,简单概述为三步:
1 中断请求
2 响应中断
3 退出中断
外部中断的介绍:
检测GPIO口电平信号,当检测到指定的电平变化时,触发外部中断,执行中断服务函数
实战分析
目的:使用外部中断线,实现KEY_UP控制BEEP相停,KEY1控制LED1翻转,KEY0控制LED0翻转。
知识点:使用外部中断 检测按键的状态
外部中断线只能有一个pin(晚点查资料补全)
步骤1:(参照原理图设置GPIO)
原理图中,KEY-UP外接是3.3v,故当按键按下时,PA0口接受到高电平,故设置上边沿触发
同理,其余三个按键是接GND,导通后是低电平,设置为低电平触发。
步骤2:配置中断(使能中断—设置中断优先级)
此处涉及到知识点:中断(中断优先级)可以参考如下文章进行学习,本次重点学习如何使用,后面详细学习。
STM32--中断使用(超详细!)_stm32中断-优快云博客
步骤3 生成代码
步骤4 寻找中断回调函数
4-1 打开stm32f4xx_it.c
4-2任选其中的一个中断服务函数,点击"Open Declaration"
4-3 找到下面这个回调函数(知识:带有_weak表示用户能够自己定义函数),并且复制到mian
函数里面。
代码如下:
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
HAL_Delay(10); //加入delay函数时模拟按键进行消抖,但是注意这个函数借助sys滴答定时器进行延时
//故配置中断优先级要把sys滴答定时器配置在外部中断线前面
switch(GPIO_Pin)
{
case KEY_UP_Pin:
if(HAL_GPIO_ReadPin(KEY_UP_GPIO_Port,KEY_UP_Pin) == GPIO_PIN_SET)
{
BEEP_TOGGLE();
break;
}
case KEY_0_Pin:
if(HAL_GPIO_ReadPin(KEY_1_GPIO_Port,KEY_1_Pin) == GPIO_PIN_SET)
{
LED0_TOGGLE();
break;
}
case KEY_1_Pin:
if(HAL_GPIO_ReadPin(KEY_2_GPIO_Port,KEY_2_Pin) == GPIO_PIN_SET)
{
LED1_TOGGLE();
break;
}
}
}
led.h文件:
#ifndef BSP_LED_LED_H_
#define BSP_LED_LED_H_
#define LED0(x) HAL_GPIO_WritePin(LED0_GPIO_Port,LED0_Pin,GPIO_PIN_SET):\
HAL_GPIO_WritePin(LED0_GPIO_Port,LED0_Pin,GPIO_PIN_RESET)
#define LED1(x) HAL_GPIO_WritePin(LED0_GPIO_Port,LED1_Pin,GPIO_PIN_SET):\
HAL_GPIO_WritePin(LED0_GPIO_Port,LED1_Pin,GPIO_PIN_RESET)
#define LED0_TOGGLE() HAL_GPIO_TogglePin(LED0_GPIO_Port,LED0_Pin)
#define LED1_TOGGLE() HAL_GPIO_TogglePin(LED0_GPIO_Port,LED1_Pin)
#endif /* BSP_LED_LED_H_ */
beep.h文件:
#ifndef BSP_BEEP_BEEP_H_
#define BSP_BEEP_BEEP_H_
#define BEEP(x) x? HAL_GPIO_WritePin(BEEP_GPIO_Port,BEEP_Pin,GPIO_PIN_SET):\
HAL_GPIO_WritePin(BEEP_GPIO_Port,BEEP_Pin,GPIO_PIN_RESET)
#define BEEP_TOGGLE() HAL_GPIO_TogglePin(BEEP_GPIO_Port,BEEP_Pin)
#endif /* BSP_BEEP_BEEP_H_ */