主题 : 将watchdog用作计时器出现的问题 复制链接 | 浏览器收藏 | 打印
级别: 新手上路
UID: 62351
精华: 0
发帖: 16
金钱: 80 两
威望: 16 点
综合积分: 32 分
注册时间: 2012-01-26
最后登录: 2013-06-20
楼主  发表于: 2012-10-24 20:44

 将watchdog用作计时器出现的问题


我用看门狗来作计时器,计算一段程序的耗费时间,程序写好后,我发现用AXD单步调试可以得到最后的时间,但是直接运行却总是得到0,这里把程序贴出来,代码比较少,希望高手帮帮忙!
先把main函数放上来:
void Main(void)
{
        Uart_Init(115200);
        Uart_Printf("\nwatchdog test is beginning\n");  
        watchdog_test();
}
main中主要用到的watchdog_test()函数:
void watchdog_test(void)
{
        int i=0,time;
        rWTCON=((prescaler_value<<8)|(clock_select<<3));        //设置预分频数和除数因数
        count_start();//写的开始计时的函数,后面给出具体函数体
        for(i=0;i<10;i++);//随便写的一个延时,计算这段程序所耗时间,为了测试程序是否可用
        time=count_stop();//停止计时,并将得到的微秒数赋给time
        Uart_Printf("time is %d\n",time);
        while(1);
}
下面是watchdog_test()中调用两个子函数,也比较简单:
void count_start(void)
{
        rWTDAT=0xffff;
        rWTCNT=0xffff;
        rWTCON &= ~(1<<2);                //关闭中断
        rWTCON |= (1<<5);         //打开WDT定时器
}

int count_stop(void)
{
        int i=0;
        rWTCON &= ~(1<<5); //关闭定时器,计时结束
        i=0xffff-rWTCNT;
        return i*259;
}嬀/size]用dnw来测试,直接run,就成了0,如图:


用AXD单步调试,就能输出:

大神们帮帮我吧!!另外,除了watchdog外,大家在裸机下还有什么计算程序耗时的方法(精度越高越好啊),欢迎大神赐教啊!!
级别: 新手上路
UID: 62351
精华: 0
发帖: 16
金钱: 80 两
威望: 16 点
综合积分: 32 分
注册时间: 2012-01-26
最后登录: 2013-06-20
1楼  发表于: 2012-10-25 16:48
    
级别: 新手上路
UID: 62351
精华: 0
发帖: 16
金钱: 80 两
威望: 16 点
综合积分: 32 分
注册时间: 2012-01-26
最后登录: 2013-06-20
2楼  发表于: 2012-10-25 20:09
问题好像主要出在这句话:
rWTCON=((prescaler_value<<8)|(clock_select<<3));
我原来是宏定义prescaler_value为100,clock_select为11,即分频因子为128,而PCLK为50MHz,这样得到的定时器计数时间间隔为0.02微秒,可能是反应不过来吧,所以我这次把预分频改成0,分频因子定为64,这样时间间隔为1.2微秒,现在能正常运行,也能出数据了,就是不知道数据是否正确。
级别: 新手上路
UID: 70226
精华: 0
发帖: 35
金钱: 175 两
威望: 35 点
综合积分: 70 分
注册时间: 2012-05-17
最后登录: 2013-01-22
3楼  发表于: 2012-10-30 08:44
    
级别: 侠客
UID: 26382
精华: 0
发帖: 51
金钱: 255 两
威望: 51 点
综合积分: 102 分
注册时间: 2010-08-07
最后登录: 2014-06-13
4楼  发表于: 2012-10-30 22:17
你直接RUN的时候,BOOT把看门狗关了吧