您的位置 首页 系统

ARM的延时 LPC2100系列延时的研讨

ARM延时问题一直是比较令人头疼的问题,因为ARM是流水工作,并且在程序跳转的时候不遵循流水规律,所以不像51单片机一样好计算,今天为了调

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–);
}
这样在主函数里就可以用以上函数基本上到达非准确延时的意图了。这种办法延时不大准确,可是不占用资源,而且可移植性很好,因而主张在非准确守时的情况下选用此办法进行守时。

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/qianrushi/xitong/260763.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部