野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 11243|回复: 3

利用DWT进行精准延迟误差太大了

[复制链接]
发表于 2018-12-20 18:50:53 | 显示全部楼层 |阅读模式
我采用内部MSI时钟,4.194MHz,在利用DWT进行us延时的时候发现差距特别大,代码如下
void PUB_DelayInit(WORD32 SYSClock)
{
    SystemCoreClock = SYSClock;

    DEM_CR      |= (unsigned int)DEM_CR_TRCENA;     // 开启DWT调试
        DWT_CYCCNT   = (unsigned int)0u;                // 清零
        DWT_CR      |= (unsigned int)DWT_CR_CYCCNTENA;  // 使能
}

void PUB_DelayUs(WORD16 us)
{
    WORD32 tCnt, tDelayCnt;
        WORD32 tStart;
               
        tStart = DWT_CYCCNT;                            // 刚进入时的计数器值
        tCnt = 0;
        tDelayCnt = us * (SystemCoreClock/1000000.0);        // 需要的节拍数                       

        while(tCnt < tDelayCnt)
        {
                tCnt = DWT_CYCCNT - tStart;               
        }
}


先进行PUB_DelayInit(4194000);然后调用PUB_DelayUs(5),示波器观察是10us,不知道为什么会出现这种情况呢?和网上说的精度差距有点大
回复

使用道具 举报

发表于 2018-12-20 20:05:28 | 显示全部楼层
不是dwt误差大,是内部晶振的误差大,正常情况下不用这个晶振的
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-12-21 10:05:30 | 显示全部楼层
flyleaf 发表于 2018-12-20 20:05
不是dwt误差大,是内部晶振的误差大,正常情况下不用这个晶振的

好吧,主要是为了低功耗才用的
回复 支持 反对

使用道具 举报

发表于 2018-12-22 12:02:23 | 显示全部楼层
写delay函数时需不需要先清0,溢出会不会后面的比前面的小
回复 支持 反对

使用道具 举报

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

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-11-23 08:47 , Processed in 0.027858 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表