目录
背景
外部中断/事件控制器(EXTI)
主要特性
功能说明
外部中断线
嵌套向量中断控制器
特性
中断线(Interrupt Line)
中断线的定义和作用
STM32中断线的分类和数量
优先级分组
抢占优先级(Preemption Priority)
子优先级(Sub-Priority)
外部中断的配置
第一步、使能GPIO组和AFIO时钟的外设
第二步、配置外部中断线路
第三步、配置EXTI
第四步、配置NVIC
第五步、编写中断服务函数
程序实例
背景
单片机开发过程中经常要用到外部中断(端口为双边沿触发、上升沿、下降沿触发)。
在配置中断的过程中,又需要涉及到中断优先级的配置,中断优先级配置就要NVIC来设置。
外部中断/事件控制器(EXTI)
主要特性

功能说明
外部中断线



嵌套向量中断控制器
特性

中断线(Interrupt Line)
是指用于触发中断请求的信号线。在STM32微控制器中,中断线是连接外设和中断控制器的重要部分,用于检测外设事件的发生并触发中断请求。
中断线的定义和作用
中断线是STM32微控制器中用于检测外部或内部事件(如定时器溢出、按键输入、串口数据到达等)的信号线。当这些事件发生时,中断线会向中断控制器发送中断请求,中断控制器根据优先级管理机制决定是否响应该请求。如果响应,则会暂停当前执行的程序,转而执行相应的中断服务程序(ISR),处理完中断后再返回到原来的程序继续执行12。
STM32中断线的分类和数量
STM32的中断线可以分为内核中断和外部中断。以STM32F103C8T6为例,它支持70个中断,其中包括10个内核中断和60个外部中断。外部中断涵盖了EXTI(外部中断/事件控制器)、TIM(定时器)、ADC(模拟数字转换器)、I2C、SPI等外设。


优先级分组

抢占优先级(Preemption Priority)
用于决定当多个中断同时发生时,哪个中断的处理器会被首先服务。抢占优先级高的中断会抢占正在执行的低优先级中断。
子优先级(Sub-Priority)
在两个或多个中断具有相同抢占优先级时,子优先级决定了哪个中断被首先服务。如果两个中断具有相同的抢占优先级,则子优先级较低的中断会先被服务。
如果中断优先级完全相同,同时触发的话,查看谁在中断列表前面可知谁先执行

外部中断的配置
配置STM32的中断线通常包括以下几个步骤:
第一步、使能GPIO组和AFIO时钟的外设
需要通过设置AFIO寄存器来配置外部中断的输入模式。
第二步、配置外部中断线路
首先需要配置触发中断的外设,如GPIO、定时器、ADC等。
第三步、配置EXTI
设置外部中断的具体参数,如触发条件等。
第四步、配置NVIC
通过NVIC(Nested Vectored Interrupt Controller)设置中断的优先级和分组。
第五步、编写中断服务函数
根据不同的中断源编写相应的中断服务函数。例如,对于EXTI4的中断服务函数命名为EXTI4_IRQHandler,对于EXTI9_5的中断服务函数命名为EXTI9_5_IRQHandler
通过以上步骤,可以有效地配置和使用STM32的中断线,实现高效的中断处理和系统响应。
程序实例
void NVIC_Configuration(void){ //嵌套中断向量控制器 的设置NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
}
void PORTA6_EXITI_INIT (void){ //按键中断初始化NVIC_InitTypeDef NVIC_InitStruct; //定义结构体变量EXTI_InitTypeDef EXTI_InitStruct;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); //启动GPIO时钟 (需要与复用时钟一同启动) RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO , ENABLE);//配置端口中断需要启用复用时钟//第1个中断 GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource4); //定义 GPIO 中断EXTI_InitStruct.EXTI_Line=EXTI_Line4; //定义中断线EXTI_InitStruct.EXTI_LineCmd=ENABLE; //中断使能EXTI_InitStruct.EXTI_Mode=EXTI_Mode_Interrupt; //中断模式为 中断EXTI_InitStruct.EXTI_Trigger=EXTI_Trigger_Falling; //下降沿触发EXTI_Init(& EXTI_InitStruct);NVIC_InitStruct.NVIC_IRQChannel=EXTI4_IRQn; //中断线 NVIC_InitStruct.NVIC_IRQChannelCmd=ENABLE; //使能中断NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority=2; //抢占优先级 2NVIC_InitStruct.NVIC_IRQChannelSubPriority=2; //子优先级 2NVIC_Init(& NVIC_InitStruct);}
void EXTI4_IRQHandler(void){if(EXTI_GetITStatus(EXTI_Line4)!=RESET){//判断某个线上的中断是否发生 //---中断处理部分 ---EXTI_ClearITPendingBit(EXTI_Line4); //清除 LINE 上的中断标志位}
}