STM32L0 求一个LL库或寄存器的 us延时代码

2019-07-20 02:32发布

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时钟和代码的原因导致,在可接受范围内)




友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
3条回答
edmund1234
1楼-- · 2019-07-20 07:25
LL_TIM_SetPrescaler(TIM2, 16);
这是分频17, 1us的分频是LL_TIM_SetPrescaler(TIM2, 15);
sammy902583
2楼-- · 2019-07-20 11:33
us延时的时间太短了, 多运行一个指令都会有影响, 函式里面尽量不要写太多代码, timer就在程序一运行就让它跑, 不要开关, 这样试试看.
我觉得, 原子提供的函式就很好了, 应该不用再自己做了.
nigel19830616
3楼-- · 2019-07-20 16:14
 精彩回答 2  元偷偷看……

一周热门 更多>