[技术问答] 关于延时函数

[复制链接]
1281|10
 楼主| shen_hao 发表于 2017-11-22 10:54 | 显示全部楼层 |阅读模式
在time delay源文件中,是以time0 做延时,用time1做获取动作。主要是time1做测试工作,time的时钟设置为HXT,另外把system tick的时钟源设置为HCLK/2,不明白有什么用?time计数计数的时候不是应该依照time时钟吗?跟system tick没有直接关系。time具体获取计数值的过程是下面这样子:
TIMER1->CTL = TIMER_PERIODIC_MODE | (12 - 1);  //我不明白为什么time1 获取的计数值正好就是us级???
    //TIMER_SET_CMP_VALUE(TIMER1, 0xFFFFFF);
    TIMER_Start(TIMER1);

    TIMER_SET_CMP_VALUE(TIMER1, 0xFFFFFF);
    TIMER_Delay(TIMER0, 100000);
                while(i--);
    u32DelayTime = TIMER_GetCounter(TIMER1)/1000 ;

目的:我想做一个延时函数,方便用来延时 秒级,纯粹用
while(i--); //测出一个数值即可,我的想法
问题:这样一个延迟,怎么才能避免换个程序(不同的系统设置)就不能用的?或者大伙延时秒级都是怎么弄得?跪谢!!!

想法:i--的速度跟系统时钟有关系,我把它设为72M,别的应该没关系了吧???

我在time delay测数具(i)为12000100,正好1S,但当我转移到另一个程序中。系统时钟还是72M,设置time也还是HXT,system tick也还是HCLK/2。因为源程序中time获取的计数值正好就是us级的,以此为基础,得出的延时结果是1835ms

捉虫天师 发表于 2017-11-22 11:20 | 显示全部楼层
这个我也没看懂,只管用就行了。
捉虫天师 发表于 2017-11-22 11:20 | 显示全部楼层
库函数好多写的很复杂,一般人无法理解。
wahahaheihei 发表于 2017-11-22 15:06 | 显示全部楼层
这些都不会非常精确的,但是够用。
 楼主| shen_hao 发表于 2017-11-22 16:59 | 显示全部楼层
捉虫天师 发表于 2017-11-22 11:20
库函数好多写的很复杂,一般人无法理解。

那兄台延时函数怎么写的??
 楼主| shen_hao 发表于 2017-11-22 17:00 | 显示全部楼层
wahahaheihei 发表于 2017-11-22 15:06
这些都不会非常精确的,但是够用。

那兄台延时函数怎么写的??
chuanmeng51 发表于 2017-11-23 19:41 | 显示全部楼层
  1. void delay_1ms(uint t)
  2. {
  3.         uint i, j;
  4.         for(i=0;i<t;i++)
  5.         {
  6.                 for(j=0;j<1410;j++);
  7.         }
  8. }



上古写法,使用N76E003内部16M振荡器跑的程序,够用。
 楼主| shen_hao 发表于 2017-11-24 17:16 | 显示全部楼层
chuanmeng51 发表于 2017-11-23 19:41
上古写法,使用N76E003内部16M振荡器跑的程序,够用。

这样写延迟应该只跟core clock有关吗?

我还要再试试。。。ε=(´ο`*)))唉
yiyigirl2014 发表于 2017-11-26 18:49 | 显示全部楼层
一般时序都是有个范围,所以这个定时也不需要非常精确。
wahahaheihei 发表于 2017-12-17 22:15 | 显示全部楼层
时间短的是没法弄的,时间长的用定时器。
643757107 发表于 2017-12-17 22:46 来自手机 | 显示全部楼层
好多单片机官方也是用定时器做延时函数
您需要登录后才可以回帖 登录 | 注册

本版积分规则

79

主题

230

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部