OpenEdv-开源电子网

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

SysTick定时器延迟函数,是不是遇到中断就刷新了?

[复制链接]

92

主题

202

帖子

0

精华

高级会员

Rank: 4

积分
637
金钱
637
注册时间
2014-3-14
在线时间
95 小时
发表于 2014-8-18 00:00:22 | 显示全部楼层 |阅读模式
5金钱
SysTick定时器延迟函数,感觉遇到中断就刷新了。。这就有个问题了。

我使LED闪烁亮、灭时间是,间隔delay_ms(1000)。。。但是还有一个端口,我设置了外部按键中断,现在感觉我只要触发一下中断,LED就马上闪一下,有时外部按键中断来了很多干扰,LED就不停的快速闪动。。。

求一个以前用那种while() i--;循环延迟那种函数,是不是可以避免SysTick定时器延迟函数,遇到中断就刷新的情况???

最佳答案

查看完整内容[请看2#楼]

最好不要在中断里面调用delay函数。 因为一旦你在中断里面调用了delay函数,外部的delay函数就有一次不准确了。 原因很简单: 因为delay都是公用同一个systick,A在延时的时候,比如本来应该延时10秒 但是延时1秒的时候,中断打断了,在中断里面延时了50ms,中断延时也使用的是 SYSTICK,等中断里面的延时结束,systick也就停止了。当中断退出的时候 A的延时本来应该继续延时的,但是中断里面的 延时,把systick给关了,自然 ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165516
金钱
165516
注册时间
2010-12-1
在线时间
2116 小时
发表于 2014-8-18 00:00:23 | 显示全部楼层
最好不要在中断里面调用delay函数。
因为一旦你在中断里面调用了delay函数,外部的delay函数就有一次不准确了。
原因很简单:
因为delay都是公用同一个systick,A在延时的时候,比如本来应该延时10秒
但是延时1秒的时候,中断打断了,在中断里面延时了50ms,中断延时也使用的是
SYSTICK,等中断里面的延时结束,systick也就停止了。当中断退出的时候
A的延时本来应该继续延时的,但是中断里面的 延时,把systick给关了,自然,A的延时
也就迅速over了。
所以实际上只延时了1秒零50ms,就结束了。。。。
导致延时不准
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

14

主题

41

帖子

0

精华

初级会员

Rank: 2

积分
117
金钱
117
注册时间
2014-2-19
在线时间
0 小时
发表于 2014-8-18 08:24:00 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
顶原子哥,虽然我没仔细分析,但我想相信原子大侠
回复

使用道具 举报

92

主题

202

帖子

0

精华

高级会员

Rank: 4

积分
637
金钱
637
注册时间
2014-3-14
在线时间
95 小时
 楼主| 发表于 2014-8-21 22:12:43 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
中断里面不加延时消抖不行啊,感觉不消抖,太容易被干扰了。。。我设置一个IO口为外部按键输入中断,中断开启后,我用镊子的尖头去撞击那个引脚都会不断触发中断,LED不停的闪动。。。下降沿中断触发后,进入中断函数,加1ms延时,再判断如果还是低电平,才认为是有按键按下,这样就好了。

中断不延时,太灵敏了,不行啊。
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165516
金钱
165516
注册时间
2010-12-1
在线时间
2116 小时
发表于 2014-8-22 00:41:19 | 显示全部楼层
回复【4楼】haohan163:
---------------------------------
那就加延时吧
其它延时偶尔一次不准应该也不影响很大。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

头像被屏蔽

2

主题

164

帖子

1

精华

禁止访问

积分
1316
金钱
1316
注册时间
2012-5-13
在线时间
127 小时
发表于 2014-8-22 23:15:45 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

92

主题

202

帖子

0

精华

高级会员

Rank: 4

积分
637
金钱
637
注册时间
2014-3-14
在线时间
95 小时
 楼主| 发表于 2014-8-24 17:39:48 | 显示全部楼层
回复【6楼】qq371833846:
---------------------------------
如果中断没延时,中断中开定时器,干扰来了,定时器也会因为中断而不断重复开启。。
回复

使用道具 举报

头像被屏蔽

2

主题

164

帖子

1

精华

禁止访问

积分
1316
金钱
1316
注册时间
2012-5-13
在线时间
127 小时
发表于 2014-8-24 17:49:03 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

10

主题

43

帖子

0

精华

初级会员

Rank: 2

积分
157
金钱
157
注册时间
2016-1-21
在线时间
30 小时
发表于 2016-1-25 10:48:05 | 显示全部楼层
正点原子 发表于 2014-8-18 00:00
最好不要在中断里面调用delay函数。
因为一旦你在中断里面调用了delay函数,外部的delay函数就有一次不准确 ...

感谢原子哥的分析,我明白了为什么我会卡死在delay_us函数了
回复

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
16
金钱
16
注册时间
2018-3-2
在线时间
9 小时
发表于 2017-2-20 17:39:08 | 显示全部楼层
正点原子 发表于 2014-8-18 00:00
最好不要在中断里面调用delay函数。
因为一旦你在中断里面调用了delay函数,外部的delay函数就有一次不准确 ...

感谢原子哥
回复

使用道具 举报

0

主题

2

帖子

0

精华

新手上路

积分
27
金钱
27
注册时间
2019-10-30
在线时间
4 小时
发表于 2020-2-26 15:07:36 | 显示全部楼层
@mark 看了下源码,原子哥说的很对,若中断恰好发生在未执行结束的长延时,那么等中断结束后 SysTick->LOAD == 0,中断返回时长延时也会结束。
回复

使用道具 举报

33

主题

1628

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
6660
金钱
6660
注册时间
2015-8-25
在线时间
1034 小时
发表于 2020-2-26 16:35:37 | 显示全部楼层
其实是可以用一个栈结构来将要打断的delay的剩余时间存起来,后期恢复即可。然后就可以多次嵌套delay使用了
He who fights with monsters should look to it that he himself does not become a monster, when you gaze long into the abyss, the abyss also gazes into you.
过于执着就会陷入其中,迷失自己,困住自己。
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-21 02:15

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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