论坛元老
 
- 积分
- 4462
- 金钱
- 4462
- 注册时间
- 2018-5-11
- 在线时间
- 932 小时
|

楼主 |
发表于 2022-7-30 13:09:54
|
显示全部楼层
不大可能是延时函数的问题,
最近不太研究这个,
一时可能进入不了情况,
我长期稳定使用的延时函数是这样的,
你可以参考一下。
////微秒延时函数:
////本函数仅反复读取SYSTICK的当前值,直到给定的延时时间到达, 不影响SYSTICK的自动重装,也不影响其中断
////即使在延时过程中发生中断,只要中断服务耗时不超出1ms, 都不会影响本函数的延时精度
////nus:0~2^32/fac_us=4294967296/9=477,218,588 高达4.7亿微秒
void delay_us(u32 nus)
{
u32 ticks;
u32 told,tnow,tcnt=0;
u32 reload=SysTick->LOAD; //reload中保存原1ms装载的值
ticks=nus*fac_us; //需要延时的节拍数
// ticks=nus*9; //需要延时的节拍数
tcnt=0;
told=SysTick->VAL; //刚进入时的计数器值
while(1)
{
tnow=SysTick->VAL; //当前计数值
if(tnow!=told) //如果计数值有变化, 则(这里注意一下SYSTICK是一个递减的计数器就可以了):
{
if(tnow<told) //一般情况, 计数器递减了, 则累计经历的节拍数
tcnt+=told-tnow;
else //有溢出的情况, 计数值变大了, 则累计时要增加满载值
tcnt+=reload-tnow+told;
told=tnow; //每次累计后, 将当前值变成基础旧值
if(tcnt>=ticks)break; //累计节拍数大于/等于需要延迟的节拍数,即延时时间到达, 则退出本函数.
}
}
}
//毫秒延时函数:
//将给定的延时毫秒数乘以1000后直接调用微秒延时函数
//nms:0---2^32/1000/fac_us=47万毫秒
void delay_ms(u32 nms)
{
delay_us((u32)(nms*1000)); //直接调用delay_us函数进行延时
}
|
|