导图社区 中断
中断是处理器对系统发生的某个事件作出的一种反应。处理器内部或者外部发生的某一事件请求处理,于是控制器暂时停止当前的工作,转去处理所发生的事。
编辑于2022-03-27 21:11:11中断
概念
中断系统
硬件
硬件是处理器内部能够实现上述中断功能的物理电路,一般称为中断控制器
因为STM32的中断系统比较复杂,所以在内核中有一个专门管理中断的控制器,称为嵌套向量中断控制器,NVIC(Nested Vectored Interrupt Controller)。NVIC负责几乎所有中断的控制(其中包括中断源、抢占优先级、响应优先级、中断的使能与失能),十分重要!
软件
软件是中断触发后所要运行的具体功能代码,一般称为中断服务程序。
优先级
STM32F103芯片的60个可屏蔽中断通道,每一个都具备自己的中断优先级控制字节(8 位,但只有高4位有效,可设置为0-15,数值越小,优先级越高)。 用于表达优先级的高4位又被分组成抢占优先级和响应优先级,每个中断源都需要被指定这两种优先级
响应优先级
抢占优先级
执行流程(嵌套)
1.打开外部中断时钟AFIO2.中断线配置(GPIO_EXTILineConfig())3.EXTI中断初始化配置(EXTI_InitTypeDef)4.NVIC中断优先级设置(NVIC_InitTypeDef)5.外部中断处理函数(在startup_stm32f1010x_hd.s中)6.外部中断函数内,中断完成后要清除中断的线路挂起位EXTI_ClearITPendingBit();
外部中断
外部中断配置初始化
IO口输入
开AFIO时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE); GPIO_EXTILineConfig(GPIO_PortSourceGPIOE, GPIO_PinSource3);// 选 择 GPIO 管脚用作外部中断线路 GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource0);// 选 择 GPIO 管脚用作外部中断线路
配置中断线
//EXTI0 NVIC 配置 NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;//EXTI0 中断通道 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2;//抢占优先级 NVIC_InitStructure.NVIC_IRQChannelSubPriority =3; //子优先级 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ 通道使能 NVIC_Init(&NVIC_InitStructure); //根据指定的参数初始化 VIC 寄存器 //EXTI3 NVIC 配置 NVIC_InitStructure.NVIC_IRQChannel = EXTI3_IRQn;//EXTI3 中断通道 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2;//抢占优先级 NVIC_InitStructure.NVIC_IRQChannelSubPriority =1; //子优先级 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ 通道使能 NVIC_Init(&NVIC_InitStructure); //根据指定的参数初始化 VIC 寄存器
配置分组
EXTI_InitStructure.EXTI_Line=EXTI_Line0; EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt; EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Rising; EXTI_InitStructure.EXTI_LineCmd=ENABLE; EXTI_Init(&EXTI_InitStructure); EXTI_InitStructure.EXTI_Line=EXTI_Line3; EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt; EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Falling; EXTI_InitStructure.EXTI_LineCmd=ENABLE; EXTI_Init(&EXTI_InitStructure);
中断服务函数
入口函数名
void EXTI3_IRQHandler(void)
检查中断请求位
if(EXTI_GetITStatus(EXTI_Line3)==1)
服务代码
delay_msa(100000); if(K_UP==1) { smgstart=6; }
清除中断挂起位
EXTI_ClearITPendingBit(EXTI_Line3);
中断最小代码
配置中断线//EXTI0 NVIC 配置 NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;//EXTI0 中断通道 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2;//抢占优先级 NVIC_InitStructure.NVIC_IRQChannelSubPriority =3; //子优先级 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ 通道使能 NVIC_Init(&NVIC_InitStructure); //根据指定的参数初始化 VIC 寄存器 配置分组EXTI_InitStructure.EXTI_Line=EXTI_Line0; EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt; EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Rising; EXTI_InitStructure.EXTI_LineCmd=ENABLE; EXTI_Init(&EXTI_InitStructure); 入口函数void EXTI3_IRQHandler(void) 中断请求位if(EXTI_GetITStatus(EXTI_Line3)==1) 服务代码 delay_msa(100000); if(K_UP==1) { smgstart=6; } 清除中断挂起位EXTI_ClearITPendingBit(EXTI_Line3);
中断是处理器对系统发生的某个事件作出的一种反应。处理器外部或者内部发生的某一事件请求处理,于是控制器暂时中止当前的工作,转去处理所发生的事件。处理完该事件后,再返回到原来被中止的地方继续原来的工作,这样的过程称为中断。