mcu定时问题

    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。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值