OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 16690|回复: 27

关于stm32中中断嵌套的时候,不能抢占的问题,值得大家看看!!!

[复制链接]

9

主题

66

帖子

0

精华

初级会员

Rank: 2

积分
122
金钱
122
注册时间
2013-3-16
在线时间
0 小时
发表于 2013-5-27 20:05:51 | 显示全部楼层 |阅读模式
请教各位,首先将我的问题描述一下:
1、我这个程序能够实现中断响应(我理解为切换)
2、我这个程序不能实现中断抢占(假如我在定时器中断中死循环,但这时候外部中断就不能对定时器中断进行抢占了)
3。、终端配置什么的没有问题的,个人觉得可能是抢占的设置有些问题。
各位大神可以各抒己见
下面贴上我的部分代码
1、中断配置
void NVIC_Configuration(void)
{
  NVIC_InitTypeDef NVIC_InitStructure;

  NVIC_SetVectorTable(NVIC_VectTab_FLASH,0x0);
  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);                          //选择中断分组2
  
  NVIC_InitStructure.NVIC_IRQChannel=TIM2_IRQn;     //选择中断通道0 
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority =1; //抢占式中断优先级设置为1
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;        //响应式中断优先级设置为0
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//通道使能                                   //使能中断
  NVIC_Init(&NVIC_InitStructure);

  NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;       //中断线1全局中断
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;//抢占优先级为0
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;  //响应优先级为0
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;  //允许EXTI0_IRQn中断
  NVIC_Init(&NVIC_InitStructure);
}
void TIM_Configuration(void)  //定时器配置
{
TIM_TimeBaseInitTypeDef TIM_InitStucture;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
TIM_InitStucture.TIM_Prescaler=100;  //60
//预分频系数为7199,时钟计数频率为{72M/(7199+1)}/2*2
TIM_InitStucture.TIM_CounterMode=TIM_CounterMode_Up;//计数模式为向上计数
TIM_InitStucture.TIM_Period=50;//重装值为9999
TIM_InitStucture.TIM_ClockDivision=0;//时钟分割系数
TIM_TimeBaseInit(TIM2,&TIM_InitStucture);
TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);//使能更新中断源并使能
TIM_Cmd(TIM2,ENABLE);  //使能TIM2
}
void EXTI_Configuration(void)
{
EXTI_InitTypeDef EXTI_InitStructure;
/* 定义PB.7为外部中断7输入通道(EXIT9_5)*/
    GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource0);
//definition a structure
EXTI_InitStructure.EXTI_Line=EXTI_Line0; //7线
    EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt; //设置成中断模式
EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Falling; //下降沿
EXTI_InitStructure.EXTI_LineCmd=ENABLE; //使能
EXTI_Init(&EXTI_InitStructure);
}

然后。我模拟一下我中断的伪代码
void TIM2_IRQHandler(void)
{  
    while(1);
}
void EXTI0_IRQHandler(void)  
{  

}
此时,假如我按键按下的时候,本来应该是发生外部中断了的。但是单步调试不能进入外部中断,也就是说一直在定时器中断里面。所以并没有实现抢占
问题就是这样。



正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165516
金钱
165516
注册时间
2010-12-1
在线时间
2116 小时
发表于 2013-5-28 00:31:50 | 显示全部楼层
NVIC_PriorityGroup_1,这个是不是有问题?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

9

主题

66

帖子

0

精华

初级会员

Rank: 2

积分
122
金钱
122
注册时间
2013-3-16
在线时间
0 小时
 楼主| 发表于 2013-5-28 01:39:48 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
没问题吧,第一组就意思就是抢占优先级用1位表示、响应优先级用3位表示。
那我外部中断抢占式优先级设为0,定时器抢占式优先级设为1;这就是1位来表示。
同时,我把外部中断和定时器中断响应优先级设为0。。
这样我使用group1还有什么问题么?
回复 支持 反对

使用道具 举报

34

主题

805

帖子

4

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1865
金钱
1865
注册时间
2011-3-29
在线时间
140 小时
发表于 2013-5-28 05:07:07 | 显示全部楼层
使能外部中断了么……
业余程序玩家。
回复 支持 反对

使用道具 举报

9

主题

66

帖子

0

精华

初级会员

Rank: 2

积分
122
金钱
122
注册时间
2013-3-16
在线时间
0 小时
 楼主| 发表于 2013-5-28 06:54:13 | 显示全部楼层
回复【4楼】ofourme:
---------------------------------
明显使能了,注意:如果定时器里面我不使用whil(1)的话,只是使用一段小延时的话,那么这样是可以进外部中断的。
关键就在这里了。这样的话,那么我的外部中断就不是抢占定时器中段了,而是等定时器中断出来了,才去响应外部中断的
这就是我理解并非发生了抢占,而是切换过去了。
回复 支持 反对

使用道具 举报

25

主题

683

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1351
金钱
1351
注册时间
2012-4-25
在线时间
195 小时
发表于 2013-5-28 10:42:04 | 显示全部楼层
测试的方法都不合理,得出的结论也是 不合理
1-1
回复 支持 反对

使用道具 举报

9

主题

66

帖子

0

精华

初级会员

Rank: 2

积分
122
金钱
122
注册时间
2013-3-16
在线时间
0 小时
 楼主| 发表于 2013-5-28 11:54:36 | 显示全部楼层
回复【6楼】mygod:
---------------------------------
在线求助,哥们,能说仔细点么?
回复 支持 反对

使用道具 举报

9

主题

66

帖子

0

精华

初级会员

Rank: 2

积分
122
金钱
122
注册时间
2013-3-16
在线时间
0 小时
 楼主| 发表于 2013-6-20 10:54:49 | 显示全部楼层
回复【6楼】mygod:
---------------------------------
回复【2楼】正点原子:
---------------------------------
原子哥,如果我在定时器中断里面使用了while(1);那理论上外部中断肯定是能够有打断定时器中断的吧,当然我这个外部中断优先级别是更高的
回复 支持 反对

使用道具 举报

25

主题

683

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1351
金钱
1351
注册时间
2012-4-25
在线时间
195 小时
发表于 2013-6-20 15:03:29 | 显示全部楼层
回复【8楼】wsshopping:
---------------------------------
STM32 好像是 不能中断嵌中断的,
1-1
回复 支持 反对

使用道具 举报

9

主题

66

帖子

0

精华

初级会员

Rank: 2

积分
122
金钱
122
注册时间
2013-3-16
在线时间
0 小时
 楼主| 发表于 2013-6-20 15:16:17 | 显示全部楼层
回复【9楼】mygod:
---------------------------------
这也是我所疑惑的地方,我在想stm32这也算一款性能较高的处理器啊,怎么会不支持中断嵌套呢?
回复 支持 反对

使用道具 举报

25

主题

683

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1351
金钱
1351
注册时间
2012-4-25
在线时间
195 小时
发表于 2013-6-20 16:05:33 | 显示全部楼层
回复【10楼】wsshopping:
---------------------------------
好像 ARM CPU 基本都不支持中断嵌入中断,不知道 X86是否 是中断 嵌入中断,
1-1
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165516
金钱
165516
注册时间
2010-12-1
在线时间
2116 小时
发表于 2013-6-20 19:24:14 | 显示全部楼层
STM32可以嵌套!
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

9

主题

66

帖子

0

精华

初级会员

Rank: 2

积分
122
金钱
122
注册时间
2013-3-16
在线时间
0 小时
 楼主| 发表于 2013-6-21 17:13:07 | 显示全部楼层
回复【12楼】正点原子:
---------------------------------
真是很疑惑,那理论上我说的那种抢占是可行的吧?
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165516
金钱
165516
注册时间
2010-12-1
在线时间
2116 小时
发表于 2013-6-22 18:55:09 | 显示全部楼层
可以
回复 支持 反对

使用道具 举报

9

主题

66

帖子

0

精华

初级会员

Rank: 2

积分
122
金钱
122
注册时间
2013-3-16
在线时间
0 小时
 楼主| 发表于 2013-6-22 21:12:12 | 显示全部楼层
回复【14楼】正点原子:
---------------------------------
恩,那好吧!还是得再仔细看看了
回复 支持 反对

使用道具 举报

0

主题

23

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
401
金钱
401
注册时间
2014-3-17
在线时间
105 小时
发表于 2014-5-29 09:37:33 | 显示全部楼层
请问楼主的问题是怎么解决的!
回复 支持 反对

使用道具 举报

3

主题

16

帖子

0

精华

新手上路

积分
48
金钱
48
注册时间
2014-5-8
在线时间
0 小时
发表于 2014-7-11 09:21:06 | 显示全部楼层
回复【12楼】正点原子:
---------------------------------
原子哥 STM可以中断嵌套中断 有没有什么官方的证明 
我们用过好多次 都发现能嵌套 但是时间出问题了
我做过一个TIM中断里面使能ADC 然后等待ADC触发DMA中断的 
就发现嵌套中断的时候ADC转换时间变成了单独执行的两倍
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165516
金钱
165516
注册时间
2010-12-1
在线时间
2116 小时
发表于 2014-7-11 23:27:29 | 显示全部楼层
回复【17楼】baichixiaodaren:
---------------------------------
你可以自己写代码测试下.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

0

主题

27

帖子

0

精华

初级会员

Rank: 2

积分
51
金钱
51
注册时间
2012-8-20
在线时间
1 小时
发表于 2015-1-13 09:49:08 | 显示全部楼层
回复【15楼】wsshopping:
---------------------------------
我也觉得是中断优先级设置问题。我现在的程序也出现这个问题。
回复 支持 反对

使用道具 举报

4

主题

35

帖子

0

精华

初级会员

Rank: 2

积分
96
金钱
96
注册时间
2015-2-10
在线时间
6 小时
发表于 2016-4-11 15:56:01 | 显示全部楼层
wsshopping 发表于 2013-6-22 21:12
回复【14楼】正点原子:
---------------------------------
恩,那好吧!还是得再仔细看看了

楼主,中断嵌套你解决了吗?现在遇到同样的问题了
大湿,你好,我还在学习中!
回复 支持 反对

使用道具 举报

4

主题

35

帖子

0

精华

初级会员

Rank: 2

积分
96
金钱
96
注册时间
2015-2-10
在线时间
6 小时
发表于 2016-4-11 15:57:11 | 显示全部楼层
茶亦爽 发表于 2015-1-13 09:49
回复【15楼】wsshopping:
---------------------------------
我也觉得是中断优先级设置问题。我现在的程序 ...

你好,你有没有找出中优先级的问题啊?
大湿,你好,我还在学习中!
回复 支持 反对

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
8
金钱
8
注册时间
2016-10-26
在线时间
0 小时
发表于 2016-10-26 09:01:05 | 显示全部楼层
我也碰到同样问题,期待高手来解释一下。我把定时器设为1s的周期,用N多空指令堆到800ms左右,不是while(1)指令。
TIM3:先熄灭发光二极管,延时约800ms,点亮发光二极管,退出中断。
EXTI2:如果发光二极管是灭的,说明发生了中断嵌套,修改标识,让TIM3不再点亮发光二极管。
试验结果:不管怎么按键触发外部中断,都没有发生嵌套。硬件仿真运行时,两个中断都可以进入。
回复 支持 反对

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
8
金钱
8
注册时间
2016-10-26
在线时间
0 小时
发表于 2016-10-26 09:09:09 | 显示全部楼层
晕,可以嵌套,刚才的代码忘了写这么一句“NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);”
回复 支持 反对

使用道具 举报

4

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
82
金钱
82
注册时间
2013-8-4
在线时间
7 小时
发表于 2018-9-4 10:27:59 | 显示全部楼层
为什么楼主的中断没有清标志,这句:TIM_ClearFlag(TIM2, TIM_FLAG_Update);
修行的路是孤独的。
回复 支持 反对

使用道具 举报

4

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
82
金钱
82
注册时间
2013-8-4
在线时间
7 小时
发表于 2018-9-4 10:29:45 | 显示全部楼层
外部中断也要清标志啊
修行的路是孤独的。
回复 支持 反对

使用道具 举报

4

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
82
金钱
82
注册时间
2013-8-4
在线时间
7 小时
发表于 2018-9-4 10:31:49 | 显示全部楼层
zsd029 发表于 2016-10-26 09:01
**** 作者被禁止或删除 内容自动屏蔽 ****

N多空指令堆到800ms 是阻塞运行,不能这么做。

可以参考以下
定时器
{
        if(sysled_ledswitchDelay10ms)
        {
                sysled_ledswitchDelay10ms--;
        }
        else
        {
              sysled_sysLedSwitch();
              sysled_ledswitchDelay10ms=30;       
        }
}
修行的路是孤独的。
回复 支持 反对

使用道具 举报

2

主题

14

帖子

0

精华

初级会员

Rank: 2

积分
128
金钱
128
注册时间
2015-10-29
在线时间
25 小时
发表于 2020-1-17 14:49:26 | 显示全部楼层
我设置TIM2为100HZ与TIM3为32KHZ的两定时器,其中TIM1中断里
while(qiantao <= 1000);       
qiantao = 0;
TIM2中断里
qiaotao++;
TIM3优先级高,结果死在while(qiantao <= 1000);        qiantao这个变量一直为1,就是开始进去了TIM3一次。
证明TIM3没有打断TIM2,没能实现嵌套,有谁证明了中断嵌套,能发个代码来跑跑吗?
回复 支持 反对

使用道具 举报

2

主题

14

帖子

0

精华

初级会员

Rank: 2

积分
128
金钱
128
注册时间
2015-10-29
在线时间
25 小时
发表于 2020-1-17 14:52:57 | 显示全部楼层
void TIM2_IRQHandler(void)               
{
        uint32_t a1,a2,i;
        if(TIM_GetITStatus(TIM2,TIM_IT_Update)==SET) //溢出中断,更新中断
        {               
                GlPara.flag_1ms = 1;
                while(qiantao <= 2);//qiaotao一直为1,死在这句
                qiantao = 0;
        }       
        TIM_ClearITPendingBit(TIM2,TIM_IT_Update);  //清除中断标志位
}

//定时器3中断服务函数-MTR1
void TIM3_IRQHandler(void)
{
        if(TIM_GetITStatus(TIM3,TIM_IT_Update)==SET) //溢出中断,更新中断
        {
                qiantao++;
        }
        TIM_ClearITPendingBit(TIM3,TIM_IT_Update);  //清除中断标志位
}
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-19 18:00

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表