金牌会员
 
- 积分
- 1835
- 金钱
- 1835
- 注册时间
- 2014-6-27
- 在线时间
- 981 小时
|
发表于 2016-7-11 08:56:28
|
显示全部楼层
有2个函数你可以试试,时间测试过是很准的,如果要延时时间准的,用定时器是必要的,刚好有滴答定时器,就用那厮了,打开滴答定时器就行,不用老是开关定时器。
void delay_us(u32 x)//这里可以延时大概4294/Fck秒
{
u32 new_load,old_load,cmp_load=0,tickers;
tickers=x*Fclk;//Fclk为滴答定时器跑的频率,比如1M,x*1,或者8M,x*8。
old_load=SysTick->VAL;
while(1)
{
new_load=SysTick->VAL;
if(new_load!=old_load)
{
if(new_load<old_load)
cmp_load+=old_load-new_load;
else
cmp_load+=SysTick->LOAD+old_load-new_load;
old_load=new_load;
if(cmp_load>=tickers)break;
}
}
}
void delay_ms(u16 x)//可以延时65535秒
{
while(x--)delay_us(1000);
}
|
|