你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

关于 HAL 库中 串口的参数 疑问

[复制链接]
su-409464 提问时间:2016-7-8 17:31 /
请问大家 HAL  库中, 串口的Timeout 参数 具体代表什么意思  如何使用

1. HAL_StatusTypeDef HAL_USART_Receive (USART_HandleTypeDef * husart, uint8_t * pRxData, uint16_t Size, uint32_t Timeout)

Timeout  是超时限制 这个可以理解,  但是 问题是 它的单位是多少????

比如填个1    代表  1 什么?  1ms  还是1 us ?

另外  填0 呢?  不限时,  填 ffff 呢??

看了 HAL 的手册 都没有说清楚:




1.png
收藏 1 评论7 发布时间:2016-7-8 17:31

举报

7个回答
Paderboy 回答时间:2016-7-8 18:01:29
本帖最后由 Paderboy 于 2016-7-8 18:06 编辑
  1. HAL_StatusTypeDef HAL_UART_Receive(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout)
  2. {
  3.   uint16_t* tmp;
  4.   uint16_t uhMask;

  5.   if((huart->State == HAL_UART_STATE_READY) || (huart->State == HAL_UART_STATE_BUSY_TX))
  6.   {
  7.     if((pData == NULL ) || (Size == 0))
  8.     {
  9.       return  HAL_ERROR;
  10.     }

  11.     /* Process Locked */
  12.     __HAL_LOCK(huart);

  13.     huart->ErrorCode = HAL_UART_ERROR_NONE;
  14.     /* Check if a non-blocking transmit process is ongoing or not */
  15.     if(huart->State == HAL_UART_STATE_BUSY_TX)
  16.     {
  17.       huart->State = HAL_UART_STATE_BUSY_TX_RX;
  18.     }
  19.     else
  20.     {
  21.       huart->State = HAL_UART_STATE_BUSY_RX;
  22.     }

  23.     huart->RxXferSize = Size;
  24.     huart->RxXferCount = Size;

  25.     /* Computation of UART mask to apply to RDR register */
  26.     UART_MASK_COMPUTATION(huart);
  27.     uhMask = huart->Mask;

  28.     /* as long as data have to be received */
  29.     while(huart->RxXferCount > 0)
  30.     {
  31.       huart->RxXferCount--;
  32.       if(UART_WaitOnFlagUntilTimeout(huart, UART_FLAG_RXNE, RESET, Timeout)!= HAL_OK)
  33.       {
  34.         return HAL_TIMEOUT;
  35.       }
  36.       if ((huart->Init.WordLength == UART_WORDLENGTH_9B) && (huart->Init.Parity == UART_PARITY_NONE))
  37.       {
  38.         tmp = (uint16_t*) pData ;
  39.         *tmp = (uint16_t)(huart->Instance->RDR & uhMask);
  40.         pData +=2;
  41.       }
  42.       else
  43.       {
  44.         *pData++ = (uint8_t)(huart->Instance->RDR & (uint8_t)uhMask);
  45.       }
  46.     }

  47.     /* Check if a non-blocking transmit Process is ongoing or not */
  48.     if(huart->State == HAL_UART_STATE_BUSY_TX_RX)
  49.     {
  50.       huart->State = HAL_UART_STATE_BUSY_TX;
  51.     }
  52.     else
  53.     {
  54.       huart->State = HAL_UART_STATE_READY;
  55.     }
  56.     /* Process Unlocked */
  57.     __HAL_UNLOCK(huart);

  58.     return HAL_OK;
  59.   }
  60.   else
  61.   {
  62.     return HAL_BUSY;
  63.   }
  64. }
复制代码
  1. HAL_StatusTypeDef UART_WaitOnFlagUntilTimeout(UART_HandleTypeDef *huart, uint32_t Flag, FlagStatus Status, uint32_t Timeout)
  2. {
  3.   uint32_t tickstart =HAL_GetTick();

  4.   /* Wait until flag is set */
  5.   if(Status == RESET)
  6.   {
  7.     while(__HAL_UART_GET_FLAG(huart, Flag) == RESET)
  8.     {
  9.       /* Check for the Timeout */
  10.       if(Timeout != HAL_MAX_DELAY)
  11.       {
  12.         if((Timeout == 0) || ((HAL_GetTick()-tickstart) > Timeout))
  13.         {
  14.           /* Disable TXE, RXNE, PE and ERR (Frame error, noise error, overrun error) interrupts for the interrupt process */
  15.           __HAL_UART_DISABLE_IT(huart, UART_IT_TXE);
  16.           __HAL_UART_DISABLE_IT(huart, UART_IT_RXNE);
  17.           __HAL_UART_DISABLE_IT(huart, UART_IT_PE);
  18.           __HAL_UART_DISABLE_IT(huart, UART_IT_ERR);

  19.           huart->State = HAL_UART_STATE_READY;

  20.           /* Process Unlocked */
  21.           __HAL_UNLOCK(huart);

  22.           return HAL_TIMEOUT;
  23.         }
  24.       }
  25.     }
  26.   }
  27.   else
  28.   {
  29.     while(__HAL_UART_GET_FLAG(huart, Flag) != RESET)
  30.     {
  31.       /* Check for the Timeout */
  32.       if(Timeout != HAL_MAX_DELAY)
  33.       {
  34.         if((Timeout == 0) || ((HAL_GetTick()-tickstart) > Timeout))
  35.         {
  36.           /* Disable TXE, RXNE, PE and ERR (Frame error, noise error, overrun error) interrupts for the interrupt process */
  37.           __HAL_UART_DISABLE_IT(huart, UART_IT_TXE);
  38.           __HAL_UART_DISABLE_IT(huart, UART_IT_RXNE);
  39.           __HAL_UART_DISABLE_IT(huart, UART_IT_PE);
  40.           __HAL_UART_DISABLE_IT(huart, UART_IT_ERR);

  41.           huart->State = HAL_UART_STATE_READY;

  42.           /* Process Unlocked */
  43.           __HAL_UNLOCK(huart);

  44.           return HAL_TIMEOUT;
  45.         }
  46.       }
  47.     }
  48.   }
  49.   return HAL_OK;
  50. }
复制代码
你自己再好好分析下。。 确实HAL库的说明太过于简单了。。。 还得靠你自己。。摸索。。

UART_WaitOnFlagUntilTimeout(huart, UART_FLAG_RXNE, RESET, Timeout)

HAL_GetTick();






评分

参与人数 1ST金币 +2 收起 理由
zero99 + 2 赞一个!

查看全部评分

su-409464 回答时间:2016-7-9 09:36:58
Paderboy 发表于 2016-7-8 18:01
你自己再好好分析下。。 确实HAL库的说明太过于简单了。。。 还得靠你自己。。摸索。。

UART_ ...

谢谢你, 这个我已经找到 了 ,而且我知道

/**
* @brief uwTick_variable uwTick variable
*/
__IO uint32_t uwTick;

/**
  * @brief Provides a tick value in millisecond.
  * @note This function is declared as __weak to be overwritten in case of other
  *       implementations in user file.
  * @retval tick value
  */
__weak uint32_t HAL_GetTick(void)
{
  return uwTick;
}


但具体 uwTick 单位是什么呢???
Paderboy 回答时间:2016-7-9 15:39:03
Tick 就是ms为单位的。。
assssdz 回答时间:2016-7-9 21:30:08
签到  签到
LJYHN 回答时间:2016-7-11 14:19:39
HAL_GetTick();基于这个函数计时来比较是否超时,而HAL_GetTick()计数单位为ms,所以就是ms了。至于填多少,就得看你的波特率,接收发送数据大小大致估算下时间。
eefishing 回答时间:2016-7-16 23:04:24
楼主问题解决了吗
su-409464 回答时间:2016-7-18 16:43:56
eefishing 发表于 2016-7-16 23:04
楼主问题解决了吗

可以参考 楼上的!!

1ms!!!

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版