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时钟和代码的原因导致,在可接受范围内) |
STM32L011D4芯片用SWD无法下载程序
求助:STM32L0系列标准库哪里下?
STM32L051低温时LPUART串口波特率异常
STM32L051单片机ADC如何彻底关闭?
STM32L051C8进入低功耗模式电流偏大
STM32L052C8T6通过I2C模拟读16位数
STM32L0的VLCD外接5V会有问题吗
求助!!使用STM32L073 IO口模拟IIC接口读写AT24CM01 程序不停...
STM32L072RB写Bank2 EEPROM不响应中断
STM32L031无法进入boot
评分
查看全部评分
评分
查看全部评分
用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延时。其精度取决于时钟源/晶振
评分
查看全部评分