目录
引言:
EXTI (External interrupt) 就是指外部中断,通过 GPIO检测输入脉冲,引起中断事件,打断原来的代码执行流程,进入到中断服务函数中进行处理,处理完后,再返回到中断之前的代码中执行。
- void NVIC_Configuration(void)
- {
- NVIC_InitTypeDef NVIC_InitStructure = {0};
-
- /* 配置中断源的优先级 */
- // 配置分组 组优先级、子优先级
- NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
-
- /* 为中断源提供中断号 */
- NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQn; // 需要配置的中断向量
- NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; // 使能或关闭相应中断向量的中断响应
- NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2; // 配置相应中断向量抢占优先级
- NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2; // 配置相应中断向量的响应优先级
- NVIC_Init(&NVIC_InitStructure);
-
- NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;
- NVIC_Init(&NVIC_InitStructure);
- }
- 1. EXTI0: 外部中断线0
- 2. EXTI1: 外部中断线1
- 3. EXTI2: 外部中断线2
- 4. EXTI3: 外部中断线3
- 5. EXTI4: 外部中断线4
- 6. EXTI5: 外部中断线5
- 7. EXTI6: 外部中断线6
- 8. EXTI7: 外部中断线7
- 9. EXTI8: 外部中断线8
- 10. EXTI9: 外部中断线9
- 11. EXTI10: 外部中断线10
- 12. EXTI11: 外部中断线11
- 13. EXTI12: 外部中断线12
- 14. EXTI13: 外部中断线13
- 15. EXTI14: 外部中断线14
- 16. EXTI15: 外部中断线15
- 17. PVD: 低压检测中断
- 18. RTC Alarm: 实时时钟闹钟中断
- 19. USB OTG FS Wakeup: USB OTG FS唤醒中断
- 20. ETH Wakeup: 以太网唤醒中断
- 21. RTC Tamper/Timestamp/Security: 实时时钟防窃取/时间戳/安全中断
PAx~PGx 端口的中断事件都连接到了EXTIx,即同一时刻EXTx只能相应一个端口的事件 触发,不能够同一时间响应所有GPIO端口的事件,但可以分时复用。它可以配置为上升沿触发,下降沿触发或双边沿触发。EXTI 最普通的应用就是接上一 个按键,设置为下降沿触发,用中断来检测按键。
- void EXTI_Configuration(void)
- {
- EXTI_InitTypeDef EXTI_InitStruct = {0};
-
- /* 初始化EXIT外部事件线 为EXTI选择输入源*/
- GPIO_EXTILineConfig(GPIO_PortSourceGPIOC, GPIO_PinSource8);// 选择要设置为EXTI 线的端口及引脚
- GPIO_EXTILineConfig(GPIO_PortSourceGPIOC, GPIO_PinSource9);
- GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource0);
-
- EXTI_InitStruct.EXTI_Line = EXTI_Line8 | EXTI_Line9 | EXTI_Line0;
- EXTI_InitStruct.EXTI_LineCmd = ENABLE;
- EXTI_InitStruct.EXTI_Mode = EXTI_Mode_Interrupt; // 把EXTI_Linexx的模式设置为为中断模式,也可以赋值为事件模式
- // EXTI_Mode_Event 这个模式不会立刻触发中断,而只是在寄存器上把相应的事件标置位置1
- EXTI_InitStruct.EXTI_Trigger = EXTI_Trigger_Falling; // 下降沿中断
- EXTI_Init(&EXTI_InitStruct);
- }
- /* 中断处理函数 */
- void EXTI9_5_IRQHandler(void)
- {
- // 检测EXTI信号来源 ---> 由按键触发中断
- while(EXTI_GetITStatus(EXTI_Line9)){
-
- // 工作内容
- // ....
- EXTI_ClearITPendingBit(EXTI_Line9); // 用于清除外部中断线上的中断挂起标志位
- }
- while(EXTI_GetITStatus(EXTI_Line8)){
-
- // 工作内容
- // ....
- EXTI_ClearITPendingBit(EXTI_Line8);
- }
- // 等等...
- return;
- }
NVIC 是中断控制器, EXTI是外部事件中断源,EXTI仅仅是NVIC上的一个中断源
中断号(由NVIC编号)的顺序和异常向量表的顺序相关