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