OpenEdv-开源电子网

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

延时代码求详细说明

[复制链接]

5

主题

62

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
368
金钱
368
注册时间
2015-9-7
在线时间
82 小时
发表于 2015-9-10 10:23:34 | 显示全部楼层 |阅读模式
5金钱
我是新手,这局中reload*=1000000/OS_TICKS_PER_SEC;为什么要用1000000来除以OS_TICKS_PER_SEC

最佳答案

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

reload=SYSCLK/8;  //此时,一个reload的时间,等于1us. reload*=1000000/OS_TICKS_PER_SEC;  //OS_TICKS_PER_SEC,表示1秒钟有多少个节拍,假定是200,那么中断时间必须是5ms中断一次. //要5ms中断一次,是不是reload*=5000 5000是不是等于:1000 000/200??
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2015-9-10 10:23:35 | 显示全部楼层
reload=SYSCLK/8; 
//此时,一个reload的时间,等于1us.

reload*=1000000/OS_TICKS_PER_SEC; 
//OS_TICKS_PER_SEC,表示1秒钟有多少个节拍,假定是200,那么中断时间必须是5ms中断一次.
//要5ms中断一次,是不是reload*=5000

5000是不是等于:1000 000/200??
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

88

主题

7377

帖子

5

精华

资深版主

Rank: 8Rank: 8

积分
14980
金钱
14980
注册时间
2013-11-13
在线时间
1823 小时
发表于 2015-9-10 10:47:58 | 显示全部楼层
用了操作系统?没用操作系统的话这一行代码不用管,不会编译的。
开往春天的手扶拖拉机
回复

使用道具 举报

72

主题

2711

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3505
金钱
3505
注册时间
2014-8-4
在线时间
696 小时
发表于 2015-9-10 10:49:32 | 显示全部楼层
要结合这条语句的上一句来一起考虑

应该是1M=1000000的原因
以我资质之鲁钝,当尽平心静气、循序渐进、稳扎稳打之力。
回复

使用道具 举报

5

主题

62

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
368
金钱
368
注册时间
2015-9-7
在线时间
82 小时
 楼主| 发表于 2015-9-10 10:51:45 | 显示全部楼层
回复【2楼】zuozhongkai:
---------------------------------
freeRTOS
回复

使用道具 举报

5

主题

62

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
368
金钱
368
注册时间
2015-9-7
在线时间
82 小时
 楼主| 发表于 2015-9-10 10:53:25 | 显示全部楼层
回复【3楼】龙之谷:
---------------------------------

reload=SystemCoreClock/8000000; //每秒钟的计数次数 单位为K    
reload*=1000000/OS_TICKS_PER_SEC;//根据OS_TICKS_PER_SEC设定溢出时间
//reload为24位寄存器,最大值:16777216,在72M下,约合1.86s左右
fac_ms=1000/OS_TICKS_PER_SEC;//代表ucos可以延时的最少单位    
SysTick->CTRL|=SysTick_CTRL_TICKINT_Msk;    //开启SYSTICK中断
SysTick->LOAD=reload;  //每1/OS_TICKS_PER_SEC秒中断一次
SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk;    //开启SYSTICK
回复

使用道具 举报

5

主题

62

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
368
金钱
368
注册时间
2015-9-7
在线时间
82 小时
 楼主| 发表于 2015-9-10 10:55:53 | 显示全部楼层
回复【3楼】龙之谷:
---------------------------------
OS_TICKS_PER_SEC  给他赋值为100的话 就代表每10ms   tick一次,但是为什么要被1M除?
回复

使用道具 举报

72

主题

2711

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3505
金钱
3505
注册时间
2014-8-4
在线时间
696 小时
发表于 2015-9-10 11:01:53 | 显示全部楼层
reload=SYSCLK/8;
reload*=1000000/OS_TICKS_PER_SEC;

以上是寄存器版本配置,和你贴的不一样
以我资质之鲁钝,当尽平心静气、循序渐进、稳扎稳打之力。
回复

使用道具 举报

5

主题

62

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
368
金钱
368
注册时间
2015-9-7
在线时间
82 小时
 楼主| 发表于 2015-9-10 11:06:11 | 显示全部楼层
回复【7楼】龙之谷:
---------------------------------
我的意思是1000000/OS_TICKS_PER_SEC是什么意思,或者说这样算出来的值代表什么意思
回复

使用道具 举报

72

主题

2711

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3505
金钱
3505
注册时间
2014-8-4
在线时间
696 小时
发表于 2015-9-10 11:20:12 | 显示全部楼层
回复【8楼】淡淡的鼬殇:
---------------------------------
我知道你的意思,单独看这一句应该是没有意思的,你懂我的意思?

这句和上一句结合起来组成一个公式,才能发现想要表达的是什么

假如传入时钟是72,1000000的任务就是72*1000000Hz,这样1Hz与1s站在一个水平线上,也就是用于单位统一

不清楚你的SystemCoreClock是如何宏定义的,所以如果宏定义为晶振*1000000,那么和寄存器就统一了,咱么接着讨论,如果连这基础切入点都不一样,越说越远
以我资质之鲁钝,当尽平心静气、循序渐进、稳扎稳打之力。
回复

使用道具 举报

5

主题

62

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
368
金钱
368
注册时间
2015-9-7
在线时间
82 小时
 楼主| 发表于 2015-9-10 11:39:18 | 显示全部楼层
回复【9楼】龙之谷:
---------------------------------
我知道啊,我就是想问第二句为什么要用1M来除以OS_TICKS_PER_SEC
回复

使用道具 举报

5

主题

62

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
368
金钱
368
注册时间
2015-9-7
在线时间
82 小时
 楼主| 发表于 2015-9-10 22:50:38 | 显示全部楼层
回复【11楼】正点原子:
---------------------------------
我想用微妙级的延时  是不是应该1/1000000
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2015-9-10 23:09:29 | 显示全部楼层
回复【12楼】淡淡的鼬殇:
---------------------------------
直接掉用我们的函数
如有不懂,请看我们教程.SYSTEM文件夹介绍.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

12

主题

50

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
211
金钱
211
注册时间
2014-9-13
在线时间
31 小时
发表于 2017-4-23 02:12:06 | 显示全部楼层
我发现有的东西为什么要写的这么啰嗦,明明可以简化的。
回复

使用道具 举报

12

主题

50

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
211
金钱
211
注册时间
2014-9-13
在线时间
31 小时
发表于 2017-4-23 02:44:50 | 显示全部楼层
reload=SYSCLK/8;  
//此时,一个reload的时间,等于1us.

reload*=1000000/OS_TICKS_PER_SEC;  
//OS_TICKS_PER_SEC,表示1秒钟有多少个节拍,假定是200,那么中断时间必须是5ms中断一次.
//要5ms中断一次,是不是reload*=5000

5000是不是等于:1000 000/200??

上面说reload*=5000 ?但reload是之前reload=SystemCoreClock/8000000得到的,如SystemCoreClock=72MHZ,OS_TICKS_PER_SEC=1000.
那程序 reload=SystemCoreClock/8000000;  
        reload*=1000000/OS_TICKS_PER_SEC    这里就等于9/1000=0.009这是什么概念,0.009是什么?
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-8-21 22:53

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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