我使用STM32L151芯片,采用内部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,不知道为什么会出现这种情况呢?和网上说的精度差距有点大 |
我的精准us延迟是这样得到的:
上面的代码是在NXP的MCU上面,调试以后得到的。 注意,
1. CPU的时钟频率,直接影响结果。
2. 编译器的优化选择项,直接影响结果。
3. 使用时,必须用示波器,校准。
评分
查看全部评分
还有这种操作,厉害了
楼主,设置延时时间长一点。
就这么个程序,做乘除法都得一段时间,还有程序进出的进栈、出栈时间。或者把IO电平反转放在紧挨着while的前后,看看相隔多长时间。
另外SystemCoreClock不应该是PUB_DelayInit(4194000)用户指定的吧,除非确定实际时间就是这个,一般是库函数中设置了。
评分
查看全部评分