搜索
bottom↓
回复: 20

大家在开发STM32单片机时候程序需要用到延时一般怎么做?

[复制链接]

出0入8汤圆

发表于 2017-7-7 12:47:06 来自手机 | 显示全部楼层 |阅读模式
一直没用过ARM大家在用STM32时候如果需要延时几ms一般会怎么做呢?也像8位机那样弄一些算式让它空算耗时间吗?

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

发表于 2017-7-7 12:50:47 | 显示全部楼层
释放CPU呀

出0入0汤圆

发表于 2017-7-7 12:53:40 | 显示全部楼层
用Sysstick定时器做定时,做延时很简单

出0入0汤圆

发表于 2017-7-7 13:28:10 来自手机 | 显示全部楼层
使用系统

出0入91汤圆

发表于 2017-7-7 13:39:59 | 显示全部楼层
一般单片机除非 NOP级别才用DELAY 来做,否则一律用定时器做SYSTICK

出40入42汤圆

发表于 2017-7-7 13:50:13 | 显示全部楼层
https://www.amobbs.com/thread-5665490-1-1.html

出0入0汤圆

发表于 2017-7-7 13:53:48 | 显示全部楼层
用滴答定时器

出0入14汤圆

发表于 2017-7-7 14:09:52 | 显示全部楼层
状态机+定时器 释放CPU ,不要搞什么死循环。

出0入76汤圆

发表于 2017-7-7 14:20:14 来自手机 | 显示全部楼层
搭车 嘀嗒定时器 ,很简单很方便

出0入59汤圆

发表于 2017-7-7 14:59:22 | 显示全部楼层
时间要求精确的就直接定时器中断
时间要求一般的可以在while(1)主循环中检测定时器标志

出0入0汤圆

发表于 2017-7-7 15:13:10 来自手机 | 显示全部楼层
我一般都是用滴答定时器做1ms或者500us中断,然后所有任务以此为时间基准,实时性高的1到2ms执行一次,不高的根据需要每隔10ms甚至100ms执行一次,这样很好做计时或者延时!

出0入8汤圆

发表于 2017-7-7 15:18:03 | 显示全部楼层


看了一下,是用 DWT 实现的。
以前也看到过此概念,一直没去看看,再关注一下。

不过其实用 51 时代的做法,就可以。
具体分析,我在这边:「求ARM汇编的高手给个delay函数
17 楼,给出了具体的分析。

这种方法从本质上来说,跟 51 单片机时代的计算软件延时的算法一致:
只需要根据主频计算出一次 loop 的指令周期就好了。
有兴趣的话,可以去看看。

出0入0汤圆

发表于 2017-7-7 15:20:00 | 显示全部楼层
systick while(tick--) __nop();

出0入0汤圆

发表于 2017-7-7 15:20:16 | 显示全部楼层
如果是跑系统的话就简单了,就调用延迟函数就行了。

出0入0汤圆

发表于 2017-7-7 15:44:39 | 显示全部楼层
定时器来做

出40入42汤圆

发表于 2017-7-7 16:04:11 | 显示全部楼层
security 发表于 2017-7-7 15:18
看了一下,是用 DWT 实现的。
以前也看到过此概念,一直没去看看,再关注一下。

多谢告知,之前没有看过这帖子。

我给的那个帖子,除了延时功能外,还有个“计时”功能,这个用ARM做起来简单很多。

本质上延时功能就是要以“精确时间”为基础,倍数乘上去,到了目标值就退出罢了。

定时器方式是一种方式,但用while(i--)这种就不好操作,要移植就得再算,算出来也不一定准,而且编译器不一定放过它

本着“怎么方便怎么来”的电工精神,看需求选择方案吧。

出0入0汤圆

发表于 2017-7-7 16:12:06 | 显示全部楼层

你的头像是什么锁?

出0入8汤圆

发表于 2017-7-7 16:12:19 | 显示全部楼层
它空算耗时间吗?

如果你的项目中只有一个任务,那么空算应该是可以满足需求的,或者说允需的。

但是无论 51 或 stm32 或它平台,好的编程思维是绝对不能空耗的,一定要释放CPU。

推荐楼主看下我之前的一个帖子,应该对你会有所启发

点我 [代码分享]一个简单好用的轮询延时器模块

出0入8汤圆

发表于 2017-7-7 16:14:12 | 显示全部楼层
落叶知秋 发表于 2017-7-7 16:04
多谢告知,之前没有看过这帖子。

我给的那个帖子,除了延时功能外,还有个“计时”功能,这个用ARM做起 ...

用软件模拟的话,
其实最佳的是要用汇编来实现,或者内联汇编,这样就绕开了 C 编译器的优化干扰。
其次,延时 1ms、1us 的 count,可以跟据主频来算,调整主频的话, count 相应被调整了,就不受时钟干扰。

当然这种方案,涉及汇编等知识,对技能的要求会多一点,不如用定时器,来得易理解、传承。

出0入8汤圆

发表于 2017-7-7 16:17:30 | 显示全部楼层
Jmhh247 发表于 2017-7-7 16:12
如果你的项目中只有一个任务,那么空算应该是可以满足需求的,或者说允需的。

但是无论 51 或 stm32 或它 ...

这不是绝对的,纯软件延时也是需要的。
例如软件模拟的 I2C 总线,那么短的时间延时,是要死等的。

出0入8汤圆

发表于 2017-7-7 16:20:05 | 显示全部楼层
security 发表于 2017-7-7 16:17
这不是绝对的,纯软件延时也是需要的。
例如软件模拟的 I2C 总线,那么短的时间延时,是要死等的。 ...

大师说的对,这里是我疏忽了,某些时序方面的延时确实要死等。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-22 09:11

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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