请问HAL库的超时机制可以修改吗?

2019-07-14 14:18发布

HAL库的超时机制,好像都是采用循环判断的方式(如下面代码中的红 {MOD}部分),这对于低功耗控制和程序的时序控制太不利了,如果超时比较长,
且该段代码在高优先级的任务中执行,则低优先级的任务在这段超时时间内也无法得到执行。此外,超时单位是1ms一个tick(默认用SYSTICK定时器产生),这个可以修改吗?

static HAL_StatusTypeDef UART_WaitOnFlagUntilTimeout(UART_HandleTypeDef *huart, uint32_t Flag, FlagStatus Status, uint32_t Tickstart, uint32_t Timeout)
{
  /* Wait until flag is set */
while((__HAL_UART_GET_FLAG(huart, Flag) ? SET : RESET) == Status)
  {
    /* Check for the Timeout */
    if(Timeout != HAL_MAX_DELAY)
    {
      if((Timeout == 0U)||((HAL_GetTick() - Tickstart ) > Timeout))
      {
        /* Disable TXE, RXNE, PE and ERR (Frame error, noise error, overrun error) interrupts for the interrupt process */
        CLEAR_BIT(huart->Instance->CR1, (USART_CR1_RXNEIE | USART_CR1_PEIE | USART_CR1_TXEIE));
        CLEAR_BIT(huart->Instance->CR3, USART_CR3_EIE);

        huart->gState  = HAL_UART_STATE_READY;
        huart->RxState = HAL_UART_STATE_READY;

        /* Process Unlocked */
        __HAL_UNLOCK(huart);

        return HAL_TIMEOUT;
      }
    }
  }

  return HAL_OK;
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
7条回答
jfuwre
2019-07-15 04:32
testd001xx 发表于 2019-1-30 14:01
我贴出的代码的那个while(1)循环就是CPU在空转啊,如果它是在高优先级的任务中执行,这段时间内低优先级任务是无法得到执行的。

你这里的while(1)判断的是状态,和超时一点关系都没有,if((Timeout == 0U)||((HAL_GetTick() - Tickstart ) > Timeout))这个才是判断超时的!!!!状态采用的查询方式,肯定要等寄存器的状态执行完了才能结束!!!

一周热门 更多>