发新帖本帖赏金 2.00元(功能说明)我要提问
返回列表
[STM32F1]

Systick挂起和解挂问题

[复制链接]
2340|18
手机看帖
扫描二维码
随时随地手机跟帖
zhubowolf|  楼主 | 2015-12-4 11:31 | 显示全部楼层 |阅读模式
本帖最后由 zhubowolf 于 2016-2-16 21:44 编辑

应用程序中,中断优先级分组0(无抢占优先级),systick优先级240,EXTI优先级64。出现的问题是在EXTI触发中断时,Systick被挂起了(通过Jlink在debug时看到NVIC相关寄存器显示systick的pending位为1),表现出来的现象时,本来在Systick中断处理程序中进行闪烁的LED常亮,或者常灭了。想请教下如何给systick解除挂起,谢谢!


到现在也没有找出到底是什么原因导致外部中断一直无法跳出,Active位一直置位。没办法,现在采用查询IO的方式处理,程序逻辑上可以跑通了,先调试其他部分吧,等别的都调试完了,在深入学习下异常和外部中断这部分,等问题解决了,再来整理答案。
感谢大家给的意见!
2016年02月16日更新:
终于找到问题的答案了!!大家自己下来看吧!
http://www.stmcu.com.cn/download?id=2225

打赏榜单

21ic小管家 打赏了 2.00 元 2015-12-04

zhubowolf|  楼主 | 2015-12-4 12:07 | 显示全部楼层
我没有说清楚问题么?

使用特权

评论回复
zhubowolf|  楼主 | 2015-12-4 12:08 | 显示全部楼层
我没有说清楚问题么?

使用特权

评论回复
Larm1| | 2015-12-4 12:36 | 显示全部楼层
是否中断一直被外部中断抢占,导致低优先级中断响应不了?

使用特权

评论回复
zchong| | 2015-12-4 12:39 | 显示全部楼层
给他时间即可
看上去原因是EXTI中断一直在

使用特权

评论回复
zhubowolf|  楼主 | 2015-12-4 13:36 | 显示全部楼层
Larm1 发表于 2015-12-4 12:36
是否中断一直被外部中断抢占,导致低优先级中断响应不了?

你是说外部中断一直在触发吗?没有,外部中断是下降沿触发,触发一次后,保持外部中断电平始终为高,systick依然挂起

使用特权

评论回复
zhubowolf|  楼主 | 2015-12-4 13:39 | 显示全部楼层
另外,我系统中还有USART1的接收中断,但是在系统接收上位机指令后,工作依然正常。USART1中断优先级48,比外部中断和systick都高

使用特权

评论回复
zhubowolf|  楼主 | 2015-12-4 13:45 | 显示全部楼层
有一点,系统共4个外部中断,硬件上对应的是2组限位信号,但是在硬件设计时,管脚依次用的PB12、PB13、PB14、PB15,外部中断用的通道EXTI10_15_IRQn,中断线分别对应12、13、14、15,会不会是这一部分出了问题。但是这一部分程序我完全参考的原子的外部中断例程,感觉配置上应该是没有问题,中断中也调用EXTI_ClearITPendBit()清除了挂起标志位

使用特权

评论回复
zhubowolf|  楼主 | 2015-12-4 13:50 | 显示全部楼层
zchong 发表于 2015-12-4 12:39
给他时间即可
看上去原因是EXTI中断一直在

我中断的优先级分组是0,也就是屏蔽了中断嵌套的功能了吧,可以这么理解吧?

使用特权

评论回复
zchong| | 2015-12-4 16:15 | 显示全部楼层
zhubowolf 发表于 2015-12-4 13:50
我中断的优先级分组是0,也就是屏蔽了中断嵌套的功能了吧,可以这么理解吧? ...

正式因为没有嵌套功能,systick应该一定能执行到,结果却执行不到,说明其它中断没有退出

使用特权

评论回复
zhubowolf|  楼主 | 2015-12-4 16:51 | 显示全部楼层
zchong 发表于 2015-12-4 16:15
正式因为没有嵌套功能,systick应该一定能执行到,结果却执行不到,说明其它中断没有退出 ...

我的闪烁(LED的点亮和熄灭都是在systick中断中操作的)。现在是外部中断来了,灯要么常亮,要么常灭,取决于中断在哪个时刻进来。如果始终不给外部中断的话,灯一直正常的亮1s,灭1S。

使用特权

评论回复
cliffboy| | 2015-12-4 18:27 | 显示全部楼层
产生中断优先级高的任务先执行,低优先级当然会挂起,看下高优先级任务是不是进入死循环了

使用特权

评论回复
justtest111| | 2015-12-4 20:11 | 显示全部楼层
个人感觉是EXTI中断没退出吧

使用特权

评论回复
Larm1| | 2015-12-4 22:51 | 显示全部楼层
可以采用断点调试的方式确认是否一直进外部中断或者卡死在外部中断内...

使用特权

评论回复
zhubowolf|  楼主 | 2015-12-7 17:02 | 显示全部楼层
zchong 发表于 2015-12-4 16:15
正式因为没有嵌套功能,systick应该一定能执行到,结果却执行不到,说明其它中断没有退出 ...

今天上班查了下,确实是外部中断没有没有退出。可是我IO口上的电平已经释放了啊,而且在EXTI的中断函数中也清楚了Pending位了,中断活动位不是硬件自动清零么,为什么不退出外部中断?有点想不通

使用特权

评论回复
zhubowolf|  楼主 | 2015-12-7 17:03 | 显示全部楼层
Larm1 发表于 2015-12-4 22:51
可以采用断点调试的方式确认是否一直进外部中断或者卡死在外部中断内...

外部中断处理程序中没有调用任何函数,只是设置了1个标志位,这不会卡死到中断处理程序中吧?

使用特权

评论回复
zhubowolf|  楼主 | 2015-12-7 17:11 | 显示全部楼层
void EXTI15_10_IRQhandler(void)
{
if(EXTI_GetITStatus(EXTI_Line12) != RESET)
{
  LimitSwitch_1P.Status = ON;
  EXTI_ClearITPendingBit(EXTI_Line12);
}

if(EXTI_GetITStatus(EXTI_Line13) != RESET)
{
  LimitSwitch_1N.Status = ON;  
  EXTI_ClearITPendingBit(EXTI_Line13);
}

if(EXTI_GetITStatus(EXTI_Line14) != RESET)
{
  LimitSwitch_2P.Status = ON;
  EXTI_ClearITPendingBit(EXTI_Line14);
}

if(EXTI_GetITStatus(EXTI_Line15) != RESET)
{
  
  LimitSwitch_2N.Status = ON;
  EXTI_ClearITPendingBit(EXTI_Line15);
}
}
中断程序这么写有问题吗?

使用特权

评论回复
zhubowolf|  楼主 | 2015-12-8 19:14 | 显示全部楼层
到现在也没有找出到底是什么原因导致外部中断一直无法跳出。没办法,现在采用查询IO的方式处理,程序逻辑上可以跑通了,先调试其他部分吧,等别的都调试完了,在深入学习下异常和外部中断这部分。
感谢大家给的意见!

使用特权

评论回复
豆腐块| | 2015-12-8 21:44 | 显示全部楼层
会不会是因为中断优先级的问题

使用特权

评论回复
发新帖 本帖赏金 2.00元(功能说明)我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

9

主题

48

帖子

1

粉丝