EXTI 简介
EXTI(External interrupt/event controller)—外部中断/事件控制器,管理了控制器的 20 个中断/事件线。每个中断/事件线都对应有一个边沿检测器,可以实现输入信号的上升沿检测和下降沿的检测。EXTI 可以实现对每个中断/事件线进行单独配置,可以单独配置为中断或者事件,以及触发事件的属性。
中断/事件线
EXTI 有 20 个中断/事件线,每个 GPIO 都可以被设置为输入线,占用 EXTI0 至 EXTI15,还有另外七根用于特定的外设事件,见表 17_1 。4 根特定外设中断/事件线由外设触发,具体用法参考《STM32F10X-中文参考手册》中对外设的具体说明。表 17‑1 EXTI 中断/事件线
EXTI0 至 EXTI15 用于 GPIO,通过编程控制可以实现任意一个 GPIO 作为 EXTI 的输入源。由表17_1 可知,EXTI0 可以通过 AFIO 的外部中断配置寄存器 1(AFIO_EXTICR1) 的 EXTI0[3:0] 位选择配置为 PA0、PB0、PC0、PD0、PE0、PF0、PG0、PH0 或者 PI0,见图 17_2。其他 EXTI 线 (EXTI中断/事件线) 使用配置都是类似的。
//初始化函数
__HAL_RCC_GPIOD_CLK_ENABLE();
GPIO_InitStruct.Pin = GPIO_PIN_7;
GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING;
HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);
HAL_NVIC_SetPriority(EXTI9_5_IRQn, 1, 5);
HAL_NVIC_EnableIRQ(EXTI9_5_IRQn);
EXTI_InitStruct.Line = EXTI_LINE_7;
EXTI_InitStruct.Mode = EXTI_MODE_INTERRUPT;
EXTI_InitStruct.Trigger = EXTI_TRIGGER_FALLING; //下降沿中断
EXTI_InitStruct.GPIOSel = EXTI_GPIOD;
HAL_EXTI_SetConfigLine(&hexti, &EXTI_InitStruct);
//中断函数
void EXTI9_5_IRQHandler(void)
{
EXTI_HandleTypeDef hext;
hext.Line=EXTI_LINE_7;
if(HAL_EXTI_GetPending(&hext, EXTI_TRIGGER_RISING_FALLING)!= RESET) /* 确保是否产生了EXTI Line中断 */
{ while(1) }
//清除中断标志位
HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_7);
if(__HAL_GPIO_EXTI_GET_IT(GPIO_PIN_7) != RESET) {
//清除中断标志位
__HAL_GPIO_EXTI_CLEAR_IT(GPIO_PIN_7);
}
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{ switch (GPIO_Pin)
{ case GPIO_PIN_7 :
// LED1_TOGGLE
break;
// case KEY2_INT_GPIO_PIN :
// LED2_TOGGLE
// break;
} }