波特律动
课程中心/STM32基础教程/【GPIO】外部中断

【GPIO】外部中断

下载例程代码: 

注意

CubeIDE:请按照 例程使用方法🔗 导入例程,否则下载的可能不是例程而是其他工程。

Keil:请使用 ArmCC V6 编译,否则可能会出现编译错误。点击此处查看切换编译器方法🔗

通过外部中断实现按键检测:按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
    注意:如果要在回调函数中使用HAL_Delay(),就必须配置中断优先级
    • 将 PB12 的 GPIO mode 配置为 External Interrupt Mode with Falling edge trigger detection,开启下降沿检测
    • 切换到NVIC选项卡,使能 EXTI line[15:10] Interrupts
    • 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),当中断被触发时,该回调函数就会执行
  • 在中断回调函数中实现绿灯的亮灭翻转
C语言
1void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
2{
3 // 确认一下是否为KEY1按下
4 if(HAL_GPIO_ReadPin(KEY1_GPIO_Port, KEY1_Pin) == 0){
5 // 翻转绿灯
6 HAL_GPIO_TogglePin(GREEN_GPIO_Port, GREEN_Pin);
7 // 等待KEY1松开
8 while(HAL_GPIO_ReadPin(KEY1_GPIO_Port, KEY1_Pin) == 0);
9 }
10}