设置一个外部中断,中断优先级设置为7,在中断中翻转LED的状态。设置FreeRTOS能够屏蔽优先级为5~15的中断。利用按键控制中断的开关。发现外部中断即使中断优先级为7,也无法被屏蔽。但是测试定时器中断,没有问题。
而且还有一个现象,将外部中断的中断优先级设置成3,定时器的中断优先级设置成6。发现在屏蔽中断后,定时器中断不再进入。但是一旦触发一次外部中断,定时器中断又恢复了。
/*
*==============================================================================
*函数名称:Exit_Init
*函数功能:初始化外部中断
*输入参数:无
*返回值:无
*备 注:无
*==============================================================================
*/
void Exit_Init (void)
{
NVIC_InitTypeDef NVIC_InitStructure;
EXTI_InitTypeDef EXTI_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE); // 开启AFIO时钟
GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource0); //选择GPIO管脚用作外部中断线路
//EXTI0 NVIC 配置
NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn; //EXTI0中断通道
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=7; //抢占优先级
NVIC_InitStructure.NVIC_IRQChannelSubPriority =0; //子优先级
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道使能
NVIC_Init(&NVIC_InitStructure); //根据指定的参数初始化VIC寄存器
EXTI_InitStructure.EXTI_Line=EXTI_Line0; // EXIT0
EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt; // 中断
EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Rising; // 上升沿触发
EXTI_InitStructure.EXTI_LineCmd=ENABLE; // 使能
EXTI_Init(&EXTI_InitStructure);
}
/*
*==============================================================================
*函数名称:EXTI0_IRQHandler
*函数功能:外部中断0中断服务函数
*输入参数:无
*返回值:无
*备 注:无
*==============================================================================
*/
void EXTI0_IRQHandler(void)
{
// 如果EXIT0中断标志位被置1
if(EXTI_GetITStatus (EXTI_Line0)==1)
{
Med_Led_StateReverse(LED1); // LED状态翻转
}
EXTI_ClearITPendingBit (EXTI_Line0); // 清除中断标志位
}