新手上路
- 积分
- 37
- 金钱
- 37
- 注册时间
- 2017-10-30
- 在线时间
- 7 小时
|
1金钱
本帖最后由 p18595923265 于 2018-10-15 15:00 编辑
static u32 fac_us=0; //us延时倍乘数
void delay_init(u8 SYSCLK)
{
HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK);//SysTick频率为HCLK
fac_us=SYSCLK; //不论是否使用OS,fac_us都需要使用
}
void delay_us(u32 nus)
{
u32 ticks;
u32 told,tnow,tcnt=0;
u32 reload=SysTick->LOAD; //LOAD的值
ticks=nus*fac_us; //需要的节拍数
told=SysTick->VAL; //刚进入时的计数器值
while(1)
{
tnow=SysTick->VAL;
if(tnow!=told)
{
if(tnow<told)tcnt+=told-tnow; //这里注意一下SYSTICK是一个递减的计数器就可以了.
else tcnt+=reload-tnow+told;
told=tnow;
if(tcnt>=ticks)break; //时间超过/等于要延迟的时间,则退出.
}
};
}
|
最佳答案
查看完整内容[请看2#楼]
这里是OS里面用的延时函数,采用的是时间摘取法来实现的。 systick的特性就是开启了以后,就会自动从初始值递减计数,计数到0,则重新加载。这是systick的特性。
|