Cortex-M3/M4内核NVIC及HAL库函数详解(4):使用HAL库配置外部中断

0 工具准备

Keil uVision5
Cortex M3权威指南(中文)
Cortex M3与M4权威指南
stm32f407的HAL库工程
STM32F4xx中文参考手册

1 使用HAL库配置外部中断

前面我们已经熟悉了有关内核部分的寄存器配置,接下来我们结合stm32f407的GPIO外设,从实战角度进一步加深对这些寄存器的认识。

1.1 原理图分析

Cortex-M3/M4内核NVIC及HAL库函数详解(4):使用HAL库配置外部中断_第1张图片
我们这里使用PA0作为输入引脚,可以看到SW1未按下时为低电平,按下时为高电平。我们我们想要在SW1按下时触发中断,只需要配置PA0端口为上升沿触发即可。

1.2 初始化PA0

/**
 * @brief 初始化SW1中断
 * 
 */
void init_sw1_interrupt(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;

    // 使能GPIOA时钟
    __GPIOA_CLK_ENABLE();

    GPIO_InitStructure.Pin = GPIO_PIN_0;
    // 配置上升沿触发
    GPIO_InitStructure.Mode = GPIO_MODE_IT_RISING;
    GPIO_InitStructure.Pull = GPIO_NOPULL;
    HAL_GPIO_Init(GPIOA, &GPIO_InitStructure);

    // 设置中断优先级为(2,2)
    HAL_NVIC_SetPriority(EXTI0_IRQn, 2, 2);
    // 清中断标志
    __HAL_GPIO_EXTI_CLEAR_IT(GPIO_PIN_0);
    // 使能中断
    HAL_NVIC_EnableIRQ(EXTI0_IRQn);
}

该函数操作步骤如下:
(1)使能GPIOA时钟
(2)设置PA0为浮空输入模式,上升沿触发
(3)初始化PA0
(4)设置中断优先级分组为2
(5)设置中断优先级为(2,2)
(6)清中断标志
(7)失能EXTI0中断请求(PA0的中断请求是映射到EXTI0上的)

1.3 编写中断服务函数

/**
 * @brief EXIT0中断服务函数
 * 
 */
void EXTI0_IRQHandler(void)
{
    // 查看是否产生了有效中断
    if (__HAL_GPIO_EXTI_GET_IT(GPIO_PIN_0) != RESET)
    {
        printf("SW1 press down\r\n");
        // 清除中断标志位
        __HAL_GPIO_EXTI_CLEAR_IT(GPIO_PIN_0);
    }
}

进入中断服务函数的首要工作就是检查是否产生了符合预期的中断,如果是的话则执行相应的操作,最后清除中断标志。

1.4 中断测试

完成PA0的初始化后,我们手动按下KEY1,可以看到打印出了中断服务函数内的信息:
Cortex-M3/M4内核NVIC及HAL库函数详解(4):使用HAL库配置外部中断_第2张图片
至此,使用HAL库配置外部中断大功告成。

你可能感兴趣的:(单片机开发,ARM内核,stm32,ARM,中断,HAL库)