STM32F103 EXTI

STM32F103 EXTI

STM32F103ZET6 支持 20 个外部中断输入(EXIT0~EXIT19),其中有4个:

EXTI线16连接到PVD输出

EXTI线17连接到RTC闹钟事件

EXTI线18连接到USB唤醒事件

EXTI线19连接到以太网唤醒事件(只适用于互联型产品)

另外的16个均可以作为外部输入中断,其中:

EXIT0~EXIT4 有独立的中断向量

EXIT6~EXIT9 共享一个中断向量 EXTI9_5_IRQHandler

EXIT10~EXIT16 共享一个中断向量 EXTI15_10_IRQHandler

共享的中断向量需要在对应的 ISR 中通过读取 Pending 的标志位来判断到底是哪个信号上触发的中断

单板上,PE5/PE6 引脚通过通过上拉电阻连接到 Key1 和 Key2 上,Key1 和 Key2 的另一端连接 GND。

初始化配置 PE5/PE6 成为外部中断的流程如下:

1. 开启 AFIO 和 GPIO 的时钟

2. 配置 GPIO PE5/PE6 为上拉输入

3. 通过 AFIO 的 EXITCR 寄存器组配置 PE5/PE6 为外部 EXIT 中断的输入引脚

4. 配置 EXIT 寄存器,使能 PE5/PE6 的中断

5. 由于按下 Key 后,电平为低,故配置为下降沿产生中断

    1. void SK_EXITInit(void)
    1. {
    1. GPIO_InitTypeDef stGpioInit;
    1. EXTI_InitTypeDef stEXTIInit;
    1. /// Step 1 : Power On the AFIO and GPIOE
    1. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE | RCC_APB2Periph_AFIO, ENABLE);
    1. /// Step 2 : Config the NVIC
    1. SK_SK_EXITNVICConfig();
    1. /// Step 3 : Config (PE5/PE6) As pull up input
    1. stGpioInit.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_6;
    1. stGpioInit.GPIO_Mode = GPIO_Mode_IPD;
    1. GPIO_Init(GPIOE, &stGpioInit);
    1. /// Step 4 : Select the output interrupt source
    1. GPIO_EXTILineConfig(GPIO_PortSourceGPIOE, GPIO_PinSource5);
    1. GPIO_EXTILineConfig(GPIO_PortSourceGPIOE, GPIO_PinSource6);
    1. /// Step 5 : Select the output interrupt source
    1. stEXTIInit.EXTI_Line = EXTI_Line5 | EXTI_Line6;
    1. stEXTIInit.EXTI_Mode = EXTI_Mode_Interrupt;
    1. stEXTIInit.EXTI_Trigger = EXTI_Trigger_Falling;
    1. stEXTIInit.EXTI_LineCmd = ENABLE;
    1. EXTI_Init(&stEXTIInit);
    1. }

由于 EXIT5~EXIT9 共享一个中断向量,故需要在中断中判断 Pending 标志位,便可知是哪个中断线上引起的中断:

    1. void EXTI9_5_IRQHandler(void)
    1. {
    1. if(EXTI_GetITStatus(EXTI_Line5) != RESET)
    1. {
    1. EXTI_ClearITPendingBit(EXTI_Line5);
    1. SK_SetLedStatus(SK_LED_1, SK_LED_ON);
    1. delay_ms(5000);
    1. SK_SetLedStatus(SK_LED_1, SK_LED_OFF);
    1. }
    1. if(EXTI_GetITStatus(EXTI_Line6) != RESET)
    1. {
    1. EXTI_ClearITPendingBit(EXTI_Line6);
    1. SK_SetLedStatus(SK_LED_2, SK_LED_ON);
    1. delay_ms(5000);
    1. SK_SetLedStatus(SK_LED_2, SK_LED_OFF);
    1. }
    1. }
posted @ 2025-11-06 11:19  张大帅哥  阅读(10)  评论(0)    收藏  举报