与龙共舞 发表于 2018-5-30 10:40:02

STM32程序设计中的超时处理

有一个问题 比较迷糊 今天遇到一个具体的情况 表达出来 求助。
现有业务逻辑:两个STM32的设备通讯,一个是门禁产品A,一个是来测试门禁的B,两者连通。
一个 线是门内开门,我B拉低电平,发出开门信号,A应该在relay做翻转响应。

逻辑在B发出信号以后有一个堵塞,也就是超时等待。
我写了个函数
#define KEYCOUNT 1000
#define Enableopendoor()   GPIO_SetBits(KEYGPIO ,KEYGPIOPIN)
#define Disableopendoor()GPIO_ResetBits(KEYGPIO ,KEYGPIOPIN)
#define Is_relay_on()
void Test_Key_Open(void)
{
        int count=0;
        short tem=0;
        while(count<KEYCOUNT)
        {
                //拉低电平 执行开门
                Enableopendoor();
                //堵塞等待是否响应
                while(Is_relay_on())
                {
                  tem++;
                        if(tem>100)//问题就在这里
                                break;
                }
                //响应了
          if(Is_relay_on())
                {
                   //开门成功
                        printf("sucess");
                }
                //超时了没响应
                else
                {
                   //开门失败
                        printf("fail");
                }
                //拉高电平 不在按键
                Disableopendoor();
                count++;
        }
}我的问题就是堵塞的时候:
while(Is_relay_on())
{
tem++;
if(tem>100)
break;
}
我的tem++到100 一共是等待多久呢?
(晶振8M)


另外我UCOS也可以加入
    OSTimeDlyHMSM(0, 0, 0,1);


while(Is_relay_on())
{
   OSTimeDlyHMSM(0, 0, 0,1);
tem++;
if(tem>100)
break;
}
这样我就是知道是等了100个1MS 这样好吗?

TLLED 发表于 2018-5-30 11:22:12

时间要求特别严格的话,我觉得使用定时器来控制会比较好。

feixiang20 发表于 2018-5-30 23:44:16

要不你修改堵塞循环语句里的参数看看有什么变化

weiwei4 发表于 2018-5-31 08:52:42

延时如果很小,用堵塞来做还可以
长一点的延时还是必须用定时器来做,定时准确而且不影响其它程序运行

发表于 2018-5-31 09:00:42

ucos的是1ms,100次也就是100ms。如果不用就看总线时钟是多少了,103是72Mhz,再算机器周期,再算++的执行周期。

anobodykey 发表于 2018-5-31 09:32:23

如果要知道等待时间,肯定就不能用无限循环了,就得用定时器或者滴答时钟了
页: [1]
查看完整版本: STM32程序设计中的超时处理