主题 : 有关2440test裸机程序的delay延时函数分析 复制链接 | 浏览器收藏 | 打印
级别: 新手上路
UID: 43836
精华: 0
发帖: 20
金钱: 100 两
威望: 20 点
综合积分: 40 分
注册时间: 2011-04-20
最后登录: 2012-01-13
楼主  发表于: 2011-06-13 22:21

 有关2440test裸机程序的delay延时函数分析

2440lib.c里面有一个delay函数
我做过以下分析:
//初步估算这个延时函数,延时1MS,1毫秒
void Delay(int time)
{
    U32 val = (PCLK>>3)/1000-1;//PCLK=50Mhz
    
    rTCFG0 &= ~(0xff<<8);   //此8 位决定定时器2,3,4 的预标定器值,这样的写法是不改变其他位的数值,只改变8-15位的数值
    rTCFG0 |= 3<<8;            //prescaler = 3+1
    rTCFG1 &= ~(0xf<<12);
    rTCFG1 |= 0<<12;        //mux = 1/2//Select MUX input for PWM Timer3
    //这么一来定时器3的输入频率=PCLK/4/2=1/8*PCLK
    //定时器3的输入时钟频率为6.25Mhz,周期就是倒数
    //在计数缓存寄存器中存的值为6.25Mhz/1000-1,那么与6.25Mhz的倒数相乘就得到1/1000秒,也就是1MS
    //那么定时器的时间为1/6.25,应该定时1ms左右,但是减了个1,不明白
    rTCNTB3 = val;          //定时器3 计数缓存寄存器
    rTCMPB3 = val>>1;        // 50%比较缓存寄存器,这中的值是val的一半,也就是到了0.5MS的时候
    //当TCNTn的值等于TCMPN的值时,定时器N的输出管脚TOUTN反转;TCNTN继续减一计数,当TCNTN的值到达0时,其管脚TOUTN再次反转,并触发定时器N的中断。
    rTCON &= ~(0xf<<16);    //设置16-19位
    rTCON |= 0xb<<16;        //interval, inv-off, update TCNTB3&TCMPB3, start timer 3(1011)//设置开启定时器3,内部模式(自动加载),手动更新TCNTB3&TCMPB3,Inverter关闭
    rTCON &= ~(2<<16);        //clear manual update bit,定时器3的一些定时器控制,又将这个手动更新TCNTB3&TCMPB3功能关闭
    while(time--) {
        while(rTCNTO3>=val>>1);//定时器3 计数观察寄存器
        while(rTCNTO3<val>>1);
    };
}
有注释,我觉得该函数延时是一毫秒的。。由于有些裸机程序的外设比如SD卡是需要用到这个delay函数的。我试过,只有在2440test中调用SDI的读写函数是可以读写SD卡的,但是一旦将SD卡的驱动放到别的2440模板上面就不能运行了。仿真了一下,发现都是卡在这个delay函数上面的。
这个delay函数到底是不是延时1ms,大家讨论一下?还有我可不可以用for循环或者是别的什么方式代替呢???求解答
级别: 新手上路
UID: 43836
精华: 0
发帖: 20
金钱: 100 两
威望: 20 点
综合积分: 40 分
注册时间: 2011-04-20
最后登录: 2012-01-13
1楼  发表于: 2011-06-16 10:32
看来没人对这个感兴趣。。。
级别: 新手上路
UID: 47479
精华: 0
发帖: 8
金钱: 40 两
威望: 8 点
综合积分: 16 分
注册时间: 2011-05-23
最后登录: 2011-10-03
2楼  发表于: 2011-06-16 13:38
按说是可以的,用for循环来达到延时目的。
arm in arm
级别: 新手上路
UID: 43836
精华: 0
发帖: 20
金钱: 100 两
威望: 20 点
综合积分: 40 分
注册时间: 2011-04-20
最后登录: 2012-01-13
3楼  发表于: 2011-06-16 18:25
试过了,for循环代替,不起作用。。。程序就卡在for循环
级别: 侠客
UID: 17308
精华: 0
发帖: 50
金钱: 250 两
威望: 50 点
综合积分: 100 分
注册时间: 2010-03-27
最后登录: 2012-11-13
4楼  发表于: 2011-06-16 19:16
是否定时器0还用于其它的用途?
级别: 新手上路
UID: 43836
精华: 0
发帖: 20
金钱: 100 两
威望: 20 点
综合积分: 40 分
注册时间: 2011-04-20
最后登录: 2012-01-13
5楼  发表于: 2011-06-17 08:05
这个延时是用于定时器3的。。。和定时器0有什么关心呢???
级别: 新手上路
UID: 43836
精华: 0
发帖: 20
金钱: 100 两
威望: 20 点
综合积分: 40 分
注册时间: 2011-04-20
最后登录: 2012-01-13
6楼  发表于: 2011-06-18 21:59
因为最近我在做sd卡的驱动,里面就用到这个delay函数,并且,这个delay函数很奇怪,只能在2440test裸机程序中运行,一移到其他的2440模板就不能够运行,所以我考虑用for循环代替,发现没有用,程序照样卡在延时上面,用示波器测试,可惜不知道怎么测。。。。求教?????还有什么办法可以解决的
级别: 新手上路
UID: 48730
精华: 0
发帖: 8
金钱: 45 两
威望: 9 点
综合积分: 16 分
注册时间: 2011-06-03
最后登录: 2011-08-30
7楼  发表于: 2011-07-01 00:40
额  前后台里面用For延时?   貌似不行吧   以前做51的前后台时碰到过