0 工具准备
Keil uVision5
Cortex M3权威指南(中文)
Cortex M3与M4权威指南
stm32f407的HAL库工程
STM32F4xx中文参考手册
1 使用HAL库配置外部中断
前面我们已经熟悉了有关内核部分的寄存器配置,接下来我们结合stm32f407的GPIO外设,从实战角度进一步加深对这些寄存器的认识。
1.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,可以看到打印出了中断服务函数内的信息:
至此,使用HAL库配置外部中断大功告成。