跳到主要内容

【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 config
  • 配置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);
}
}

故障排除

工程建立和配置