OpenEdv-开源电子网

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

关于用for语句写10s钟粗略计时的疑惑

[复制链接]

48

主题

179

帖子

0

精华

初级会员

Rank: 2

积分
185
金钱
185
注册时间
2017-6-19
在线时间
90 小时
发表于 2020-9-3 11:03:47 | 显示全部楼层 |阅读模式
10金钱
如题,我想要写一个粗略的10s的计时,8s到12s之间都可以,想要用for语句来写,C语言知识比较薄弱,举例如下:
  1. for(i=1;i<500;i++)
  2. for(m=1;m<500;m++)
  3.    for(j=1;j<500;j++)
  4.    ………………………………………………
  5.      for(n=1;n<500;n++)
复制代码
类似于这样无限套娃下去,是否就可以得到想要的任何计时了(但从理论而言,实际项目可能很少人这么做)
问题:这样的计时时间取决于没执行一步单片机的机器周期,大概是这个意思吧,但是STM32的时钟相对比较复杂,包括内部,外部,高速,低速,还是有倍频,这些时钟的选取对于用for写的计时应该是有影响的吧,如果我想要按照上面的思路写10s的计时,时钟以及上面的参数应该如何选取呢????

最佳答案

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

是有这种写法的。这个是和时钟有密切关系。我当时在rtos中加入18b20。因为系统的延时不行,后来临时用这种写法。代码在下面 void delay_us(uint32_t nus) { int i = (72000000 / 8000000 * nus);//此项与PPL倍频因子与晶振频率有关 while (i) { i--; } }
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

5

主题

269

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1053
金钱
1053
注册时间
2020-5-11
在线时间
253 小时
发表于 2020-9-3 11:03:48 | 显示全部楼层
是有这种写法的。这个是和时钟有密切关系。我当时在rtos中加入18b20。因为系统的延时不行,后来临时用这种写法。代码在下面
void delay_us(uint32_t nus)
{
   int i = (72000000 / 8000000 * nus);//此项与PPL倍频因子与晶振频率有关
    while (i)
    {
        i--;
    }
}
回复

使用道具 举报

0

主题

79

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1899
金钱
1899
注册时间
2018-10-11
在线时间
254 小时
发表于 2020-9-4 08:20:47 | 显示全部楼层
亲,这边建议你选个手表哦...
回复

使用道具 举报

2

主题

13

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
481
金钱
481
注册时间
2019-10-25
在线时间
66 小时
发表于 2020-9-4 09:09:36 | 显示全部楼层
用这种写法,还不如按照原子的delay函数,基于SysTick->VAL计数,获取相应的时间
回复

使用道具 举报

48

主题

179

帖子

0

精华

初级会员

Rank: 2

积分
185
金钱
185
注册时间
2017-6-19
在线时间
90 小时
 楼主| 发表于 2020-9-4 09:46:39 | 显示全部楼层
spritels 发表于 2020-9-4 08:20
亲,这边建议你选个手表哦...

好的哦,亲有推荐的款式吗,电子表和指针式的您觉得哪个比较好呢?
回复

使用道具 举报

48

主题

179

帖子

0

精华

初级会员

Rank: 2

积分
185
金钱
185
注册时间
2017-6-19
在线时间
90 小时
 楼主| 发表于 2020-9-4 09:47:39 | 显示全部楼层
ttg 发表于 2020-9-4 09:09
用这种写法,还不如按照原子的delay函数,基于SysTick->VAL计数,获取相应的时间

恩,确实用for来写,还不如直接用院子的delay,话说原子的delay是自己写的吧,官方库好像没有这个吧
回复

使用道具 举报

48

主题

179

帖子

0

精华

初级会员

Rank: 2

积分
185
金钱
185
注册时间
2017-6-19
在线时间
90 小时
 楼主| 发表于 2020-9-4 09:49:14 | 显示全部楼层
thisisdemo 发表于 2020-9-4 09:21
是有这种写法的。这个是和时钟有密切关系。我当时在rtos中加入18b20。因为系统的延时不行,后来临时用这种 ...

查了下资料,有一个说法是晶振本身也存在误差,所以用for来写的定时从准确性来看不太好,同时一旦中途被打断,就会不准了(这个什么意思还没看懂)
回复

使用道具 举报

5

主题

269

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1053
金钱
1053
注册时间
2020-5-11
在线时间
253 小时
发表于 2020-9-4 09:56:12 | 显示全部楼层
王大爷爱吃鱼 发表于 2020-9-4 09:49
查了下资料,有一个说法是晶振本身也存在误差,所以用for来写的定时从准确性来看不太好,同时一旦中途被 ...

1:晶振本身存在误差,这个好理解。就像你手表,每秒秒针动一下,如果动的频率不准那走的时间肯定也不准。

2:这种延时是会被中断打断。打断了以后先执行中断函数内的内容,再出来继续跑延时函数。这种情况延时时间会=你想延时的时间+中断函数执行时间。所以就不准了。

建议:综上所述这种延时临时用用。实际项目需要考虑可行性。
回复

使用道具 举报

48

主题

179

帖子

0

精华

初级会员

Rank: 2

积分
185
金钱
185
注册时间
2017-6-19
在线时间
90 小时
 楼主| 发表于 2020-9-4 10:03:22 | 显示全部楼层
thisisdemo 发表于 2020-9-4 09:56
1:晶振本身存在误差,这个好理解。就像你手表,每秒秒针动一下,如果动的频率不准那走的时间肯定也不准 ...

是的,for的话有助于理解机器周期和晶振之间的计算关系。实际用到定时的话,可能还是定时器和delay用的多
回复

使用道具 举报

2

主题

458

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4464
金钱
4464
注册时间
2018-5-14
在线时间
957 小时
发表于 2020-9-4 10:07:20 | 显示全部楼层
建议你选个表,延时10s用阻塞去消耗CPU,意味着这10s内不响应按键时间,不响应界面刷新,对整个项目都是致命性的。
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-17 19:02

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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