打印

STM32在进入其他外设中断之后,能不能进入Systick中断?

[复制链接]
11798|18
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
LAORUAN|  楼主 | 2012-8-10 14:12 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
如题。在我写的代码中,由于使用Systick作为延时,在EXTI中断中使用该延时函数的时候,发现无法进入Systick中断,但是该延时函数在主函数中可以使用。


如果说进入外设中断后就不能进入systick中断的话,为什么会这样?
systick中断不是CM3内核的么,优先级不是比较高么?
沙发
qzx0580| | 2012-8-10 14:21 | 只看该作者
Systick的优先级可以设置吗?
如果可以,你将它放在0,0级,除了NMI,别的中断都打断不了它。

使用特权

评论回复
板凳
i55| | 2012-8-10 14:35 | 只看该作者
估计就是NVIC设置的问题,systick优先级比exti低所以永远也进不来。
但是不管怎么说,楼猪是个崭新崭新地菜鸟那是没跑了,不管是基于RTOS的系统,还是基于前后台的裸奔系统,一个基本设计原则就是中断处理函数必须尽可能地快速结束,以避免其他中断无法处理,在中断处理函数里面放延时是严重违法嵌入式软件设计原则的!

使用特权

评论回复
地板
LAORUAN|  楼主 | 2012-8-10 14:39 | 只看该作者
3# i55

额,这个知道啊,我只是在写触摸屏的程序,先这么写着,调通了之后会改的。

使用特权

评论回复
5
LAORUAN|  楼主 | 2012-8-10 14:45 | 只看该作者
3# i55


嘿嘿,我知道了,默认的Systick中断是最低级的。


但是有点不理解,既然是CM3内核的,为啥做得像外设一样可以设置的?

使用特权

评论回复
6
i55| | 2012-8-10 14:51 | 只看该作者
看《Cortex-M3权威指南》吧,我只是翻了一遍,还稀里糊涂地。

使用特权

评论回复
7
qzx0580| | 2012-8-10 14:57 | 只看该作者
3# i55

定时器不用来做延时用来做什么?
在定时器里设个标志TimeStick++;
外部判断TimeStick的值,只要保证定时器的优先级足够高就可以了。

如果不是很精确的计时,定时器的中断等级低一点也无所谓,被高级中断打断就打断,高级处理完了自然回来处理低级中断。

使用特权

评论回复
8
qzx0580| | 2012-8-10 15:00 | 只看该作者
以我这点微不足道的经验,我认为中断资源很宝贵是针对低端的单片机而言,对于速度足够快,内存足够大,中断资源足够丰富的高端单片机来说你尽可以把重要的代码大段大段的放在中断里处理。

使用特权

评论回复
9
i55| | 2012-8-10 16:41 | 只看该作者
3# i55  

定时器不用来做延时用来做什么?
在定时器里设个标志TimeStick++;
外部判断TimeStick的值,只要保证定时器的优先级足够高就可以了。

如果不是很精确的计时,定时器的中断等级低一点也无所谓,被高级中断 ...
qzx0580 发表于 2012-8-10 14:57

没干过复杂项目吧,我systick一直设最低,也没有累积误差问题,stm32的systick是自动重装载的。

使用特权

评论回复
10
LAORUAN|  楼主 | 2012-8-10 19:30 | 只看该作者
9# i55


既然你一直设置为最低,都没出现无法进中断的问题?

使用特权

评论回复
11
李富贵| | 2012-8-10 20:06 | 只看该作者
既然用了stm32,最好上一个RTOS,我见到的RTOS在stm32上面的移植,systick都是最低优先级。这是毫无问题的,因为RTOS一般要求中断处理函数里面不能有延时,不能有挂起(Pend),发一个sem或者q给task,赶紧结束中断处理。至于中断处理则在task里面进行。这样只要中断处理时间不超过两次systick中断之间的时间,那么就是毫无问题的。

建议楼主学学ucos-ii一类的RTOS,你的编程能力会上一个新台阶,不会在闹出7楼那样的笑话。

使用特权

评论回复
12
LAORUAN|  楼主 | 2012-8-10 21:02 | 只看该作者
11# 李富贵


谢谢你的回答。

请问:systick是CM3内核的中断,也就是中断优先级比外设的高,那为什么在EXTI中断中无法进入systick中断呢?

使用特权

评论回复
13
李富贵| | 2012-8-10 21:26 | 只看该作者
谁告诉你中断优先级比外设的高?

ARM网站找 DUI0522看 4.3.8节 System Handler Priority Registers

使用特权

评论回复
14
aceice| | 2013-5-4 10:11 | 只看该作者
李富贵 发表于 2012-8-10 20:06
既然用了stm32,最好上一个RTOS,我见到的RTOS在stm32上面的移植,systick都是最低优先级。这是毫无问题的 ...

有道理。。。正在做freertos的应用,卡在使用外设中断上了,也许是看文档不仔细,没找到systick相关的说明。
用的STM32,那么外设中断就是尽量用高优先级的了。

使用特权

评论回复
15
yswtxiao| | 2013-8-10 11:02 | 只看该作者
我也正好查这方面的资料,谢谢了。

使用特权

评论回复
16
ranqingfa| | 2014-11-1 15:49 | 只看该作者
很久之前遇到这个问题,后来就是不在中断里面用systick的中断,它的优先级竟然是最低?

使用特权

评论回复
17
摩天轮1111| | 2015-8-7 14:43 | 只看该作者
楼主可以参加我的帖子,我在实验中断优先级的问题上遇到一样的问题了,https://bbs.21ic.com/icview-1038520-1-1.html,不过我知道要设置systick优先级高于EXTI,但是我调用的设置函数错了,最后我也找到原因了,你可以参考参考

使用特权

评论回复
18
ar3000a| | 2019-7-25 18:58 | 只看该作者
我想说点个人看法一直不敢。因为来这里是为了当学生。

楼上都说要防止中断时间过长这些,也不是不对,但更像是计算机编程人员的铁律,而不是硬件开发的铁律。
stm32越来越高级,多核心高主频,软件太复杂了就要配个51/avr/pic之类做从机。因为失去了实时性,只能作个低端电脑用(彩色屏幕这类东西)。

比如,经常有这种用法:时刻检测某个管脚,不能漏掉0.几us,恨不能全用汇编。这时候就没时间置标志了,多一条指令都会感觉性能降低。
按钮修改参数就开一个外部中断,一套键盘操作,时间很长。正常工作时一个状态,中断中完成其他任务。

不这样的话,就只能重新启动机器的时候,按住某个键作设置。

反正用户看来,随时不关机就能操作最好。

使用特权

评论回复
19
caoenq| | 2019-7-26 10:38 | 只看该作者
总之一句话:单片机的时间并不宝贵,程序员的时间才宝贵,不要为了优化那百分之0.几的性能而通宵加班的。

使用特权

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

本版积分规则

6

主题

211

帖子

1

粉丝