4895|6

84

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

ADS环境下延时时间计算? [复制链接]

对ADS不是很熟悉,以前用Keil的时候可以软件仿真直接查看设定频率下延时函数的延时时间,但不知道ADS下是怎么看的,比如主频是60M,那下面这段延时函数的延时时间是多少呢?太菜了,还问这么低级的问题。取t=1情况计算。谢谢了!ARM7内核
void DelayMs(INT16U t)                       
{
        INT16U i;
        do
        {
                for (i=0; i<5000; i++);
        }
        while(t--);
}

最新回复

正好需要,谢谢了  详情 回复 发表于 2010-4-9 15:18
点赞 关注

回复
举报

71

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
实际测试吧~~~~~有CACHE没CACHE仍是不同的
 
 

回复

79

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
没CACHE的话还要看代码是在什么样的存储器中运行.....
 
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

4
 
查了一下资料,看来要弄个准确的延时还要实际测试,唉~可惜没示波器
 
 
 

回复

90

帖子

0

TA的资源

一粒金砂(初级)

5
 
[转]:ARM的延时 LPC2100系列延时的研究
ARM延时问题一直是比较令人头疼的问题,因为ARM是流水工作,并且在程序跳转的时候不遵循流水规律,所以不像51单片机一样好计算,今天为了调18B20,因此把ARM的延时问题研究了一下。总结起来,有三种计算方法。

         1.做好看一下编译出来的汇编语句,再自己用笔做个加减乗除,算出结果。
这种方法最直接,但是最麻烦,因为汇编指令的时间不好计算,并且要弄明白流水的工作原理,一个指令执行的时间等,因此对于像我这样的菜鸟级人物,这种方法虽然最直观,但是不可取。
       2.用定时器的中断获得精确的延时。
用定时器中断获得的延时非常精确,现将代码举例如下:
void __irq IRQ_Timer0 (void)
{
++timeval;
T0IR = 0x01;     清除中断标志     VICVectAddr = 0x00;     //通知VIC中断处理结束      
}
void time0_init(void) //定时器0初始化
{
         timeval = 0;
T0TC   = 0;     //定时器设置为0       T0PR   = 0;     //时钟不分频       T0MCR = 0x03;   //设置T0MR0匹配后复位T0TC,并产生中断标志   T0MR0 = Fpclk/1000; //1毫秒钟定时       T0TCR = 0x01;   //启动定时器
      
         VICIntSelect = 0x00; //所有中断通道设置为IRQ中断   
VICVectCntl0 = 0x20 | 0x04;//设置定时器0中断通道分配最高优先级
VICVectAddr0 = (uint32)IRQ_Timer0;//设置中断服务程序地址     VICIntEnable = 1 << 0x04;//使能定时器0中断      
         IRQEnable();   //IRQ中断使能

void wait(uint32 t)   //延时
{                           
       unsigned long i;
       if (t<1)   
           t="1";
       i = timeval;
       while ((i + t) != timeval);                  
}
这样在主函数里面用wait(10) 就延时10毫秒了。这种延时相当精确,但是占用了一个定时器,比较浪费,并且可移植性也比较差,因此在并非要求精确定时的情况下,一半不建议采用。
             3.用等待作延时。
此方法最经典的用法就是书本上经常用的用法:
void DelayNS (uint32 dly)
{
uint32 i;

for ( ; dly>0; dly--)
   for (i=0; i<50000; i++);
}
那么这个程序到底延时多长时间呢,有很多人一直用,但是并不知道延时多长时间,就像我,以前一直不知道这个程序到底延时多长时间,直到昨天用示波器观察了一下,才明白这个程序在主频为11.0592*4M的情况下延时大概为5.6毫秒,因此延时1毫秒的程序就写出来了,代码如下:
void Delay(uint32 time)     //1毫秒延时
{
uint32 i;
for(;time>0;time--)
   for(i=8929;i>0;i--);
}
10微秒和1微秒延时程序分别如下:
void delay(uint32 time)     //10微秒延时
{
uint32 i;
for(;time>0;time--)
   for(i=84;i>0;i--);
}
void delay_1(uint32 time)     //1微秒延时
{
uint32 i;
for(;time>0;time--)
   for(i=5;i>0;i--);
}
这样在主函数里就可以用以上函数基本上达到非精确延时的目的了。这种方法延时不大精确,但是不占用资源,并且可移植性很好,因此建议在非精确定时的情况下采用此方法进行定时。
 
 
 

回复

82

帖子

0

TA的资源

一粒金砂(初级)

6
 
学习
 
 
 

回复

78

帖子

0

TA的资源

一粒金砂(初级)

7
 
正好需要,谢谢了
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/8 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表