为什么无法实现抢占功能?

[复制链接]
1522|5
 楼主| jxmzzr 发表于 2013-12-30 11:17 | 显示全部楼层 |阅读模式
TI, ni, ic, vi, ST
用的是Stm32f103vb开发板;

KEY1(PB10)和KEY2(PB11)分别触发两个中断,其中KEY1中断的优先级高于KEY2的优先级,
想通过实验验证当中断2程序运行时(LED3、4点亮)可以被中断1的程序抢断(LED1、2点亮);

可是接通实验板运行后按KEY2后LED3、4灯点亮,再按KEY1后无法实现抢断的功能;是我的优先级配置
出错了还是中断程序不对呢,请指教;以下是中断的程序;


void EXTI10_Config(void)
{
        EXTI_InitTypeDef  EXTI_InitStructure;
        NVIC_InitTypeDef  NVIC_InitStructure;

        GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource10);
        EXTI_InitStructure.EXTI_Line=EXTI_Line10;
        EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt;
        EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Falling;
        EXTI_InitStructure.EXTI_LineCmd=ENABLE;
        EXTI_Init(&EXTI_InitStructure);

        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
        NVIC_InitStructure.NVIC_IRQChannel=EXTI15_10_IRQn;
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0;
        NVIC_InitStructure.NVIC_IRQChannelSubPriority=0;
        NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
        NVIC_Init(&NVIC_InitStructure);
}

void EXTI11_Config(void)
{
        EXTI_InitTypeDef  EXTI_InitStructure;
        NVIC_InitTypeDef  NVIC_InitStructure;

        GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource11);
        EXTI_InitStructure.EXTI_Line=EXTI_Line11;
        EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt;
        EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Falling;
        EXTI_InitStructure.EXTI_LineCmd=ENABLE;
        EXTI_Init(&EXTI_InitStructure);

        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
        NVIC_InitStructure.NVIC_IRQChannel=EXTI15_10_IRQn;
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1;
        NVIC_InitStructure.NVIC_IRQChannelSubPriority=1;
        NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
        NVIC_Init(&NVIC_InitStructure);
}
void EXTI15_10_IRQHandler(void)
{

    if (EXTI_GetITStatus(EXTI_Line10)!=RESET)
        {
          while(1)
          {
           LED1_ON;
           LED2_ON;
           LED3_OFF;
           LED4_OFF;
         EXTI_ClearITPendingBit(EXTI_Line10);
          }
        }

        if (EXTI_GetITStatus(EXTI_Line11)!=RESET)
        {
           while(1)
          {
           LED1_OFF;
           LED2_OFF;
           LED3_ON;
           LED4_ON;
         EXTI_ClearITPendingBit(EXTI_Line11);
         }
        }
}



副BAN主就是我 发表于 2013-12-30 11:35 | 显示全部楼层
你重新分析一下逻辑,先DEBUG一下试试,一个中断不退出怎么可以再进入呢?

把IO口换一下,把其中的换成EXTI1试试。
jjjkkk00 发表于 2013-12-31 12:39 | 显示全部楼层
只看到一个中断EXTI15_10_IRQn啊?
只是对一个中断优先级重新赋值了。
你怎么抢?自己抢自己?

你的理解有问题。
拿起书本 发表于 2014-1-2 13:07 | 显示全部楼层
你的EXTI_Line11标志位不是都已经被清除了么?
EXTI_Line10还进不去?
huangfeng33 发表于 2014-1-12 21:20 | 显示全部楼层
多谢楼主,这段时间也遇到这个问题,看到这个,解决了。
 楼主| jxmzzr 发表于 2014-1-12 22:06 | 显示全部楼层
进不去,我觉得是不是中断程序写错了,每次中断智能在while中循环,跳不出来。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

460

主题

2188

帖子

12

粉丝
快速回复 在线客服 返回列表 返回顶部