久芯网

HAL_GetTick()获取不到计时,IIC等待超时函数无法跳出

avatar 772984087@qq.co 提问时间: 2023-07-08 10:47:53 / 未解决

不是固定时间出现该问题,程序进入IIC超时函数时,由于HAL_GetTick()函数获取到的值没有更新,导致循环无法跳出,并且在获取计时前enable()打开中断也无用,随后看门狗复位

static HAL_StatusTypeDef I2C_WaitOnFlagUntilTimeout(I2C_HandleTypeDef *hi2c, uint32_t Flag, FlagStatus Status, uint32_t Timeout, uint32_t Tickstart)
{
  /* Wait until flag is set */
  while (__HAL_I2C_GET_FLAG(hi2c, Flag) == Status)
  {
    /* Check for the Timeout */
    if (Timeout != HAL_MAX_DELAY)
    {
      if (((HAL_GetTick() - Tickstart) > Timeout) || (Timeout == 0U))
      {
        hi2c->PreviousState     = I2C_STATE_NONE;
        hi2c->State             = HAL_I2C_STATE_READY;
        hi2c->Mode              = HAL_I2C_MODE_NONE;
        hi2c->ErrorCode         |= HAL_I2C_ERROR_TIMEOUT;

        /* Process Unlocked */
        __HAL_UNLOCK(hi2c);

        return HAL_ERROR;
      }
    }
  }
  return HAL_OK;
}
5个回答
  • avatar butterflyspring
    回答时间: 2023-07-08 11:05:28

    可以关掉看门狗,调试一下,看看Tick 有没有增加,或者为什么get 不到。 找到原因了也就能解决了。

  • avatar yklstudent
    回答时间: 2023-07-08 11:26:42

    系统时钟没有开启,还是HAL_IncTick()没有被调用执行

  • avatar 772984087@qq.co
    回答时间: 2023-07-08 11:45:11
    yklstudent 发表于 2023-2-16 20:28
    系统时钟没有开启,还是HAL_IncTick()没有被调用执行

    已经开启了,是运行一段时间后复位的,关闭看门狗后发现卡在这个地方

  • avatar 772984087@qq.co
    回答时间: 2023-07-08 12:05:41
    butterflyspring 发表于 2023-2-16 14:12
    可以关掉看门狗,调试一下,看看Tick 有没有增加,或者为什么get 不到。 找到原因了也就能解决了。 [/m ...

    [md]关掉看门狗,调试结果是tick没有增加,才导致时间相减不变

  • avatar butterflyspring
    回答时间: 2023-07-08 12:24:32
    772984087@qq.co 发表于 2023-2-17 09:23
    关掉看门狗,调试结果是tick没有增加,才导致时间相减不变

    应该可以调试再看看是不是TICK的中断出了问题,是计数逻辑问题还是中断被关闭了。

会员中心 微信客服
客服
回到顶部