打印
[STM32F1]

关于串口的中断发送问题~~HAL

[复制链接]
764|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
hzocce|  楼主 | 2020-12-14 10:44 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

大部分使用非中断发送,一直等到发完为止~~。
可是想使用中断发送的话,我的理解就是启动中断发送时候,数据就交给中断自动完成了,其它不用管。不像跟普通发送一样,一直等大到发送为为止,一直执行在发送函数里面。
可是查看这个函数,只知道将pData给了pTxBuffPtr,然后就开启了发送。
可是他内部是怎么执行的?
    huart->TxXferSize = Size;
    huart->TxXferCount = Size;
只有这2个,但是总应该看到一个TxXferCount发一个减一个的地方,搜索了下并没有哎。
也没有看到这个中断发送调用了其它哪个函数了。
各位大佬指导下~~~

HAL_StatusTypeDef HAL_UART_Transmit_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)
{
  /* Check that a Tx process is not already ongoing */
  if (huart->gState == HAL_UART_STATE_READY)
  {
    if ((pData == NULL) || (Size == 0U))
    {
      return HAL_ERROR;
    }

    /* Process Locked */
    __HAL_LOCK(huart);

    huart->pTxBuffPtr = pData;
    huart->TxXferSize = Size;
    huart->TxXferCount = Size;

    huart->ErrorCode = HAL_UART_ERROR_NONE;
    huart->gState = HAL_UART_STATE_BUSY_TX;

    /* Process Unlocked */
    __HAL_UNLOCK(huart);

    /* Enable the UART Transmit data register empty Interrupt */
    __HAL_UART_ENABLE_IT(huart, UART_IT_TXE);

    return HAL_OK;
  }
  else
  {
    return HAL_BUSY;
  }
}

使用特权

评论回复
沙发
wanduzi| | 2020-12-14 22:27 | 只看该作者
不是很清楚,不知道官方有没有提供中断的发送例子。

使用特权

评论回复
板凳
香水城| | 2020-12-15 12:38 | 只看该作者
static HAL_StatusTypeDef UART_Transmit_IT(UART_HandleTypeDef *huart)
{
  uint16_t *tmp;

  /* Check that a Tx process is ongoing */
  if (huart->gState == HAL_UART_STATE_BUSY_TX)
  {
    if ((huart->Init.WordLength == UART_WORDLENGTH_9B) && (huart->Init.Parity == UART_PARITY_NONE))
    {
      tmp = (uint16_t *) huart->pTxBuffPtr;
      huart->Instance->DR = (uint16_t)(*tmp & (uint16_t)0x01FF);
      huart->pTxBuffPtr += 2U;
    }
    else
    {
      huart->Instance->DR = (uint8_t)(*huart->pTxBuffPtr++ & (uint8_t)0x00FF);
    }

    if (--huart->TxXferCount == 0U)
    {
      /* Disable the UART Transmit Complete Interrupt */
      __HAL_UART_DISABLE_IT(huart, UART_IT_TXE);

      /* Enable the UART Transmit Complete Interrupt */
      __HAL_UART_ENABLE_IT(huart, UART_IT_TC);
    }
    return HAL_OK;
  }
  else
  {
    return HAL_BUSY;
  }
}

使用特权

评论回复
地板
guanjiaer| | 2021-1-9 14:37 | 只看该作者
真没理解的这么深入过

使用特权

评论回复
5
heimaojingzhang| | 2021-1-9 14:39 | 只看该作者
城主的代码可以详细读一下

使用特权

评论回复
6
keaibukelian| | 2021-1-9 14:41 | 只看该作者
没有关心过 只要能好好发送数据就行

使用特权

评论回复
7
labasi| | 2021-1-9 14:45 | 只看该作者
其实最后还是一个字节一个字节发送的

使用特权

评论回复
8
paotangsan| | 2021-1-9 14:55 | 只看该作者
城主的代码解答了这个疑问

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

127

主题

561

帖子

4

粉丝