void Configure_TIMTimeBase(void) { uint32_t v; //TIM2使用的时钟为HSI 16MHz(AHB,APB1总线未分频) LL_APB1_GRP1_EnableClock(LL_APB1_GRP1_PERIPH_TIM2); LL_TIM_SetPrescaler(TIM2, 16); LL_TIM_SetCounterMode(TIM2,LL_TIM_COUNTERMODE_DOWN); } void DelayUs(uint16_t us) { LL_TIM_SetCounter(TIM2,us); LL_TIM_EnableCounter(TIM2); while( LL_TIM_IsEnabledCounter(TIM2) && !LL_TIM_IsActiveFlag_UPDATE(TIM2)) { } LL_TIM_ClearFlag_UPDATE(TIM2); LL_TIM_DisableCounter(TIM2); } 延时误差相当大,延时越长误差越大。没搞懂原因. 2ms 误差0.14ms (140us)。 用SYSTICK定时器精度正常,误差一直在14us左右(由于HSI是RC时钟和代码的原因导致,在可接受范围内) |
评分
查看全部评分
评分
查看全部评分
用while做延时粗调,NOP做短延时补尝微调。
要求高的话,还可以分段细化延时,比如Delay_us()、Delay_10us()、Delay_100us()、Delay_ms()、Delay_10ms()、Delay_100ms()。
评分
查看全部评分
可以用更少的分频,更多的计数 看一看。
评分
查看全部评分
LL_TIM_SetPrescaler(TIM2, 15);
我的回复你都没看明白?
分频16, 是写成16-1的, 你写16就变成分频17了, 明白?
例如:
配置中断触发间隔1us;
SysTick_Handler中断只计数count。
应用时只需要对count监测差值,就能得到准确的us延时。其精度取决于时钟源/晶振
评分
查看全部评分