【GPIO】外部中断
下载例程代码: 下载代码 如何使用例程【点击查看教程】
通过外部中断实现按键检测:按KEY1让绿灯亮/灭翻转。
如何使用例程
编译并下载程序到学习板,即可看到程序效果:
程序效果:按下KEY1,触发中断,绿灯亮/灭翻转。
例程讲解
下面介绍了如何自己实现该例程的功能
1、工程配置
分配引脚:在Pinout&Configuration页面,配置如下引脚
中断引脚:将 PB12 设置为 GPIO_EXTI12,并设置 User label 为 KEY1
输出引脚:将 PA7 设置为 GPIO_Outpu,并分别设置 User label 为 GREEN
左键点击对应的引脚,选择 GPIO_Output 或 GPIO_EXTI12;
右键点击对应的引脚,选择 User label,分别输入 GREEN、KEY1
配置GPIO:在Pinout&Configuration -> GPIO
将 PB12 的 GPIO mode 配置为 External Interrupt Mode with Falling edge trigger detection,开启下降沿检测
切换到NVIC选项卡,使能 EXTI line[15:10] Interrupts
注意:如果要在回调函数中使用HAL_Delay(),就必须配置中断优先级
System Core -> NVIC,将 Time base: System tick timer 的主要优先级调到比EXTI line高
否则 HAL_Delay() 函数无法在中断回调函数中执行,会导致程序卡在回调函数中
2、代码
在 stm32f1xx_it.c 中添加中断回调函数 void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin),当中断被触发时,该回调函数就会执行
在中断回调函数中实现绿灯的亮灭翻转
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
// 确认一下是否为KEY1按下
if(HAL_GPIO_ReadPin(KEY1_GPIO_Port, KEY1_Pin) == 0){
// 翻转绿灯
HAL_GPIO_TogglePin(GREEN_GPIO_Port, GREEN_Pin);
// 等待KEY1松开
while(HAL_GPIO_ReadPin(KEY1_GPIO_Port, KEY1_Pin) == 0);
}
}