mcu延时一般在定时器中将一个变量TmCnt++,然后在函数中先将TmCnt=0;再判断if(TmCnt>1000){……},满足条件进行下部操作。
尽量不要用while(TmCnt-1000)来延时,因为这样就不能进行下面的逻辑操作。但是这样有个问题就是在函数中赋值可能会被中断打断。如果TmCnt=0这条语句是由多条汇编组成,刚好运行了一部分汇编被中断打断,会造成赋值失败。所以一般TmCnt=0前都会关中断,赋值完后再开中断。
u16 TmCnt,step;
void TIMISR(void)
{
TmCnt++;
}
void ClearCnt(u16 cnt)
{
CloseTIMISR();
TmCnt = 0;
OpenTIMISR();
}
u16 TimOV(u16 Cnt,u16 SetTime)
{
u16 Cntbuf,res;
CloseTIMISR();
Cntbuf = Cnt;
OpenTIMISR();
if(Cntbuf >= Cnt)
res = 1;
else
res = 0;
return res;
}
void Logic(void)
{
switch(step)
{
case 0:
step++;
……
case n:
ClearCnt(TmCnt );
step++;
break;
case n+1:
if(TimOV(TmCnt ,100))
{
step++;
……
}
break;
……
}
}
还有种简单的也很可靠
uint16_t delaymsi(uint16_t TimeCnt,uint16_t OrgTime)
{
return (TimeCnt - OrgTime);
}
void Logic(void)
{
switch(step)
{
case 0:
step++;
……
case n:
OrgTime= TmCnt ;
step++;
break;
case n+1:
if(delaymsi(TmCnt ,OrgTime) >= 100)
{
step++;
……
}
break;
……
}
}
这个不用担心TmCnt 溢出的问题,测试过,当OrgTime= TmCnt=65530 时,TmCnt=95时满足delaymsi(TmCnt ,OrgTime) >= 100。