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

关于 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管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版