搜索
bottom↓
回复: 38

STM32一个简单有效精确的延时方法

[复制链接]

出0入0汤圆

发表于 2018-9-25 14:27:08 | 显示全部楼层 |阅读模式
           看到有些人延时还整定时器,for循环里面放__NOP()就好了,一个__NOP()就是一个时钟周期,比如72MHZ的时钟,要放72个__NOP();延时一次就是1us,精确可靠简单

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

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

出0入4汤圆

发表于 2018-9-25 14:31:17 | 显示全部楼层
如果要延时10mS呢?难道要放720000个__NOP();?

出0入0汤圆

发表于 2018-9-25 14:41:18 | 显示全部楼层
在for循环中,中断应该可以打断吧,如果像楼上说的10ms,来个中断,可能就不是10ms了,如果关了中断,那么响应就不及时了。个人认为定时器才是最简单的

出0入0汤圆

发表于 2018-9-25 14:42:37 | 显示全部楼层
zqf441775525 发表于 2018-9-25 14:31
如果要延时10mS呢?难道要放720000个__NOP();?

是的,回答正确,恭喜你都会抢答了.

出0入4汤圆

发表于 2018-9-25 14:44:13 | 显示全部楼层

出0入8汤圆

发表于 2018-9-25 14:45:34 | 显示全部楼层
软件模拟延时,是可以像楼主位那样的思路的实现的。
具体的可以戳这里:「大家在开发STM32单片机时候程序需要用到延时一般怎么做?」,看看 12 楼的回复。

出0入0汤圆

发表于 2018-9-25 14:51:36 | 显示全部楼层
楼主这个方法只适用51吧。

出0入0汤圆

发表于 2018-9-25 14:53:54 | 显示全部楼层
一个金牌就发这个

出0入0汤圆

发表于 2018-9-25 14:54:33 | 显示全部楼层
简单有效没错,但说不上精确

出0入0汤圆

发表于 2018-9-25 15:16:06 来自手机 | 显示全部楼层
反正我重来不这么用,也不推荐这种用法

出0入0汤圆

发表于 2018-9-25 15:16:07 | 显示全部楼层
还要关中断,你这感觉都要违反广告法了

出0入0汤圆

发表于 2018-9-25 15:22:59 来自手机 | 显示全部楼层
赞同9楼的说法

出0入0汤圆

发表于 2018-9-25 15:30:14 | 显示全部楼层
我就搬个板凳跟你们学习

出0入0汤圆

 楼主| 发表于 2018-9-25 15:41:52 | 显示全部楼层
void delay_us(uint32_t t)
   {uint32_t i;
    for(i=0;i<t;i++)
      {__NOP();....}
  }; 实际最长可延时4千多秒,算算就知道了,我试验过18b20,dht11,延时越长越不精确,但是一般最长也就几个毫秒吧,精度绝对够用了,具体误差多少,就要研究汇编代码了

出0入0汤圆

 楼主| 发表于 2018-9-25 15:43:15 | 显示全部楼层
     中断的话,用定时器也有中断的问题啊,因为有抢占的问题

出0入0汤圆

 楼主| 发表于 2018-9-25 15:46:57 | 显示全部楼层
          看了一些卖开发板的,里面要么用定时器,要么整个数递减,没示波器器还真不晓得延时了多少,相对而言,这个是个好办法

出0入0汤圆

发表于 2018-9-25 15:54:49 | 显示全部楼层
lionliu 发表于 2018-9-25 15:43
中断的话,用定时器也有中断的问题啊,因为有抢占的问题

定时器的中断不会产生累积误差

出0入4汤圆

发表于 2018-9-25 17:22:24 | 显示全部楼层
1US的话用nop还可以,大于50us还是计算systick的计数值比较靠谱

出0入0汤圆

发表于 2018-9-25 17:28:19 | 显示全部楼层
superAFE 发表于 2018-9-25 15:58
不同的应用场景有不同的写法,像达拉斯协议的延时,还用定时器来延时,是不是麻烦了点。 ...

达拉斯协议 主要用在哪里?

出0入4汤圆

发表于 2018-9-25 19:56:53 来自手机 | 显示全部楼层
zqf441775525 发表于 2018-9-25 14:31
如果要延时10mS呢?难道要放720000个__NOP();?

ms延时有库的。就是us延时比较头疼

出0入0汤圆

发表于 2018-9-25 20:08:53 来自手机 | 显示全部楼层
stm32靠循环延时好像不精确

出0入0汤圆

发表于 2018-9-25 20:40:38 | 显示全部楼层
#define FAC_US        4
#define OW_DELAY480US        479//480.05
void ow_delay_480us(void) {//479.958us
        vu32 temp;
        SysTick->LOAD = OW_DELAY480US * FAC_US - 5; //时间加载,Delay12us5=112:26.50khz,Delay12us5=54:39.919KHZ
        SysTick->VAL = 0x00; //清空计数器
        SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk; //开始倒数
        do {
                temp = SysTick->CTRL;
        } while (temp & 0x01 && !(temp & (1 << 16))); //等待时间到达
        SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk; //关闭计数器
        SysTick->VAL = 0X00; //清空计数器

}

出0入442汤圆

发表于 2018-9-25 21:11:22 来自手机 | 显示全部楼层
superAFE 发表于 2018-9-25 17:29
大名鼎鼎的 DS18B20就是达拉斯协议啊,

这货有人用双向uart搞定。。

出0入0汤圆

发表于 2018-9-25 22:22:10 来自手机 | 显示全部楼层
us延时用定时器延妥妥的

出0入0汤圆

发表于 2018-9-25 22:24:37 | 显示全部楼层
还得考虑for的时间

出0入0汤圆

发表于 2018-9-26 08:00:00 | 显示全部楼层
虽然我不知道怎么实现这么精确的延时但是我知道,光是晶振的误差就不小

出0入0汤圆

发表于 2018-9-26 08:39:54 | 显示全部楼层
循环语句有开始和结束的判断,那必要会消耗机器周期,这样数数谈何精确

出0入0汤圆

发表于 2018-9-26 08:44:43 来自手机 | 显示全部楼层
难道循环本身的jump指令不耗时吗?循环nop根本没意义。

出0入0汤圆

发表于 2018-9-26 08:50:39 | 显示全部楼层
其实并不准确,因为没算进循环出循环的时间

出0入0汤圆

发表于 2018-9-26 08:55:31 | 显示全部楼层
软延时硬延时各有各的用途

出0入85汤圆

发表于 2018-9-26 09:00:42 | 显示全部楼层
处理循环也需要耗费时钟周期。

出0入0汤圆

发表于 2018-9-26 12:31:02 来自手机 | 显示全部楼层
蜗牛蜗牛 发表于 2018-9-26 08:00
虽然我不知道怎么实现这么精确的延时但是我知道,光是晶振的误差就不小

赶紧去打死卖晶振的

出0入0汤圆

发表于 2018-9-26 13:40:29 | 显示全部楼层
这72us的时间就这样被浪费了。 简单是够简单了,精确就不一定了。除非没有中断。

出0入0汤圆

发表于 2018-9-26 13:54:23 | 显示全部楼层
不知道什么时序要求那么高,定时器简单实用就好了...

出0入0汤圆

发表于 2018-9-26 22:40:43 | 显示全部楼层
内核是ARM多流水线执行,执行周期不确定的。

出0入0汤圆

发表于 2018-9-27 09:16:44 | 显示全部楼层
us级延时简单的可以用一下

出0入0汤圆

发表于 2018-9-27 09:40:51 | 显示全部楼层
都是超标量处理器了,一个周期可以执行几条指令,用nop算时间不准了

出0入0汤圆

发表于 2018-9-27 09:50:02 | 显示全部楼层
for循环执行过程中会不会耗时呀?循环72次,for语句耗时多少呢?

我是菜鸟新手,喷我轻点……

出0入0汤圆

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

本版积分规则

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

GMT+8, 2024-5-19 01:28

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

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