打印

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

[复制链接]
1312|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还进不去?

使用特权

评论回复
5
huangfeng33| | 2014-1-12 21:20 | 只看该作者
多谢楼主,这段时间也遇到这个问题,看到这个,解决了。

使用特权

评论回复
6
jxmzzr|  楼主 | 2014-1-12 22:06 | 只看该作者
进不去,我觉得是不是中断程序写错了,每次中断智能在while中循环,跳不出来。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

460

主题

2188

帖子

12

粉丝