FreeRTOS无法屏蔽外部中断

设置一个外部中断,中断优先级设置为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);   // 清除中断标志位
}

本问题已经解决,详情可见博客http://t.csdn.cn/coN5M

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 以下回答来自chatgpt:

    问题分析: 问题的核心是在使用FreeRTOS时,无法屏蔽某些中断,尽管已经设置了合适的中断优先级。并且还存在一个现象,当将外部中断的优先级设置为3,定时器中断的优先级设置为6时,屏蔽外部中断后,定时器中断也不再触发。

    解决方案: 1. 确认中断优先级设置的正确性:根据问题描述,外部中断的优先级设置为7,定时器中断的优先级设置为6。首先,我们需要确认所使用的芯片和开发板是否支持设置外部中断的优先级。有些芯片可能存在限制,只允许特定的中断优先级设置。另外,确定FreeRTOS是否正确配置了中断优先级。

    1. 检查中断屏蔽的配置:根据问题描述,需要通过按键来控制中断的开关。我们需要确保正确设置了按键的中断配置,并在按键中断处理程序中根据需求来屏蔽或使能指定中断。在FreeRTOS中,可以使用vTaskSuspendAll()函数来临时将调度器挂起,以达到屏蔽中断的目的。

    2. 确认中断触发条件的正确性:根据问题描述,当外部中断触发后,定时器中断再次触发。我们需要了解外部中断和定时器中断的触发条件是否存在冲突。可以尝试调整中断触发的条件或使用其他方式来进行中断触发检测。

    如果以上步骤都没有解决问题,那可能是由于硬件或软件的限制导致无法完全屏蔽外部中断。在这种情况下,可能需要考虑使用其他解决方案,例如使用其他中断处理机制、重新设计硬件电路或调整系统架构等。

    注意: 由于问题描述较为简略,本解决方案仅提供一般性的思路和解决方案。实际解决问题时,需要根据具体情况进行进一步调试和排查。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^