这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 综合技术 » 基础知识 » easyarm2131,DelayNs 求教:easyarm2131里的延时程序

共2条 1/1 1 跳转至

easyarm2131,DelayNs 求教:easyarm2131里的延时程序DelayNs

院士
2006-09-17 18:14:16     打赏
easyarm2131,DelayNs 求教:easyarm2131里的延时程序DelayNs



关键词: easyarm2131     DelayNs     求教     延时    

院士
2006-12-22 22:43:00     打赏
2楼
问 买了周立功的easyARM2131,其中有个延时函数很多地方都出现了,却不知道它到底延时多久。
void DelayNs(uint32 dly)
{
   uint32 i;
   for(;dly>0;dly--)
      for(i=0;i<50000;i++);
}
在51单片机的外面如果接12M晶振的话,一个指令周期的时间是1us,如果上面这段程序是在51单片机里应该是延时50000×dly(us)。
我不知道lpc2131一个指令周期是多长时间,是不是因为它的流水线所以不能准确计算出一条指令的时间呢?
求教! 1: 愚见可以计算2131在1us内执行多少次加法运算 2: 恩?我只想知道DelayNs延迟多久啊谁知道啊,指点我一下啊? 3: 装个keil,来仿真一下吧。相差不远的。另外,跟时钟源以及倍频设置等有关。 4: 呵呵,我就是不知道跟倍频设置有多大关系啊我知道51的话,12M晶振,12分频,一个时钟周期是1us,在ARM里有Fosc,cclk,Fcco几个值,我就搞不清楚了,圈圈能详解一下吗?呵呵 5: 你可以用中断获得比较准确的延时long timeval;

/* Timer Counter 0 Interrupt executes each 10ms @ 60 MHz CPU Clock */
void tc0 (void) __irq  {
  ++timeval;
  T0IR        = 1;                            // Clear interrupt flag
  VICVectAddr = 0;                            // Acknowledge Interrupt

}


/* Setup the Timer Counter 0 Interrupt */
void init_timer (void) {
  T0MR0 = 149999;                             // 10mSec = 150.000-1 counts
  T0MCR = 3;                                  // Interrupt and Reset on MR0
  T0TCR = 1;                                  // Timer0 Enable
  VICVectAddr15 = (unsigned long)tc0;          // set interrupt vector in 0
  VICVectCntl15 = 0x20 | 4;                    // use it for Timer 0 Interrupt
  VICIntEnable = 0x00000010;                  // Enable Timer0 Interrupt
}

void wait (unsigned int t)  {                             /* wait function */
  unsigned long i;
  if (t<1)    
      t=1;
  i = timeval;
  while ((i + t) != timeval);                  
}

这样在主函数里面用wait(10) 就延时100MS了 6: 你可以用中断获得比较准确的延时long timeval;

/* Timer Counter 0 Interrupt executes each 10ms @ 60 MHz CPU Clock */
void tc0 (void) __irq  {
  ++timeval;
  T0IR        = 1;                            // Clear interrupt flag
  VICVectAddr = 0;                            // Acknowledge Interrupt

}


/* Setup the Timer Counter 0 Interrupt */
void init_timer (void) {
  T0MR0 = 149999;                             // 10mSec = 150.000-1 counts
  T0MCR = 3;                                  // Interrupt and Reset on MR0
  T0TCR = 1;                                  // Timer0 Enable
  VICVectAddr15 = (unsigned long)tc0;          // set interrupt vector in 0
  VICVectCntl15 = 0x20 | 4;                    // use it for Timer 0 Interrupt
  VICIntEnable = 0x00000010;                  // Enable Timer0 Interrupt
}

void wait (unsigned int t)  {                             /* wait function */
  unsigned long i;
  if (t<1)    
      t=1;
  i = timeval;
  while ((i + t) != timeval);                  
}

这样在主函数里面用wait(10) 就延时100MS了

共2条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]