stm32中断嵌套程序
时间: 2023-08-31 20:09:17 浏览: 91
在STM32中,中断可以嵌套,这意味着如果发生多个中断,可以在一个中断正在处理时触发另一个中断。在这种情况下,CPU会进入中断优先级较高的中断处理程序,但是如果另一个中断发生在当前中断处理程序执行期间,它会被挂起并等待当前中断处理程序完成。当当前中断处理程序完成并且退出中断处理程序时,CPU会检查是否有挂起的中断,并根据中断优先级进入相应的中断处理程序。
下面是一个简单的中断嵌套程序的示例:
```c
void EXTI0_IRQHandler(void) // 外部中断0中断服务函数
{
if(EXTI_GetITStatus(EXTI_Line0) != RESET) // 检查是否发生外部中断0
{
// 处理外部中断0
EXTI_ClearITPendingBit(EXTI_Line0); // 清除中断标志位
}
}
void TIM2_IRQHandler(void) // 定时器2中断服务函数
{
if(TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET) // 检查是否发生定时器2溢出中断
{
// 处理定时器2中断
TIM_ClearITPendingBit(TIM2, TIM_IT_Update); // 清除中断标志位
}
}
int main(void)
{
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); // 设置中断优先级分组
NVIC_SetPriority(EXTI0_IRQn, 0); // 设置外部中断0的中断优先级为0
NVIC_SetPriority(TIM2_IRQn, 1); // 设置定时器2的中断优先级为1
// 配置外部中断0
EXTI_InitTypeDef EXTI_InitStructure;
EXTI_InitStructure.EXTI_Line = EXTI_Line0;
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure);
// 配置定时器2
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;
TIM_TimeBaseInitStruct.TIM_Period = 1000;
TIM_TimeBaseInitStruct.TIM_Prescaler = 7200;
TIM_TimeBaseInitStruct.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_TimeBaseInitStruct.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitStruct);
TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);
TIM_Cmd(TIM2, ENABLE);
while(1)
{
// 主循环
}
}
```
在这个程序中,我们配置了外部中断0和定时器2,并设置了它们的中断优先级。在主循环中不做任何事情,只是等待中断的发生。当外部中断0发生时,CPU会进入`EXTI0_IRQHandler`中断服务函数,处理完外部中断0后,如果在此期间定时器2中断也发生了,CPU会挂起`EXTI0_IRQHandler`中断服务函数,并进入`TIM2_IRQHandler`中断服务函数,完成定时器2中断的处理。当`TIM2_IRQHandler`中断服务函数执行完毕后,CPU会返回`EXTI0_IRQHandler`中断服务函数,继续处理外部中断0。