STM32的HAL库开发系列 - GPIO中断/外部中断EXTI的初始化

STM32的HAL库开发系列 - GPIO中断/外部中断EXTI的初始化

在应用中,STM32的GPIO中断/外部中断EXTI常用于外设控制,如按键检测、计数器等。同时也用于其他系统中,如智能家居、智能交通、工业控制等。

这部分一般由CubeMX自动生成,但了解其中的过程也是有必要的。

STM32的GPIO中断/外部中断EXTI还可以支持软件中断和硬件中断两种方式,软件中断可以通过软件代码实现中断,硬件中断则是通过硬件外设实现中断。

  // 引脚定义
 #define KEY_INT_GPIO_PORT                GPIOA
 #define KEY_INT_GPIO_CLK_ENABLE()        __GPIOA_CLK_ENABLE();
 #define KEY_INT_GPIO_PIN                 GPIO_PIN_0
 #define KEY_INT_EXTI_IRQ                 EXTI0_IRQn
 #define KEY_IRQHandler                   EXTI0_IRQHandler
 
 // 初始化函数
 void EXTI_Key_Config(void)
 {
     GPIO_InitTypeDef GPIO_InitStructure;

     /*开启按键GPIO口的时钟*/
     KEY_INT_GPIO_CLK_ENABLE();

     /* 选择按键的引脚 */
     GPIO_InitStructure.Pin = KEY_INT_GPIO_PIN;
     /* 设置引脚为输入模式 */
     GPIO_InitStructure.Mode = GPIO_MODE_IT_RISING;
     /* 设置引脚不上拉也不下拉 */
     GPIO_InitStructure.Pull = GPIO_NOPULL;
     /* 使用上面的结构体初始化按键 */
     HAL_GPIO_Init(KEY_INT_GPIO_PORT, &GPIO_InitStructure);
     /* 配置 EXTI 中断源 到 KEY 引脚、配置中断优先级*/
     HAL_NVIC_SetPriority(KEY_INT_EXTI_IRQ, 0, 0);
     /* 使能中断 */
     HAL_NVIC_EnableIRQ(KEY_INT_EXTI_IRQ);
 }

自己实现中断服务函数。这里没有调用中断回调函数,而是直接在服务函数内完成动作。

在使用STM32的GPIO中断/外部中断EXTI时,需要在程序中实现中断服务程序,用来响应中断事件并执行相应的操作。中断服务程序通常需要在硬件中断向量表中注册,以便在中断发生时被系统调用。

 // 中断服务函数
 void KEY_IRQHandler(void)
 {
     // 确保是否产生了EXTI Line中断
     if (__HAL_GPIO_EXTI_GET_IT(KEY_INT_GPIO_PIN) != RESET) {
         // LED电平翻转
         LED1_TOGGLE;
         // 清除中断标志位
         __HAL_GPIO_EXTI_CLEAR_IT(KEY_INT_GPIO_PIN);
     }
 }

另外,在使用STM32的GPIO中断/外部中断EXTI时,需要注意中断的启用和禁用,避免在不需要的时候浪费系统资源。在中断服务程序中,还需要注意中断的嵌套,避免中断死循环。

主函数如下:

 int main(void)
 {
    SystemClock_Config();

    LED_GPIO_Config();

    /* 
    初始化EXTI中断,按下按键会触发中断,
    触发中断会进入stm32f4xx_it.c文件中的函数
    KEY1_IRQHandler和KEY2_IRQHandler,处理中断,反转LED灯。
    */
    EXTI_Key_Config();

    // 等待中断,由于使用中断方式,CPU不用轮询按键
    while (1) {
    }
  }

STM32的GPIO中断/外部中断EXTI是STM32微控制器中一项重要功能,它可以帮助我们在系统中更好的响应外部设备的变化,提高系统的可靠性和灵活性。使用时需要注意中断服务程序、中断启用和禁用、中断嵌套等问题。

你可能感兴趣的:(stm32,单片机,嵌入式硬件)