99久久全国免费观看_国产一区二区三区四区五区VM_久久www人成免费看片中文_国产高清在线a视频大全_深夜福利www_日韩一级成人av

關于stm32 hal庫usart HAL_UART_Transmit_IT函數(shù)解析

1、原因

最近在看安富萊的bsp教程,關于usart的部分使用了fifo的管理,但是安富萊的教程中,F(xiàn)IFO管理部分都是自己寫的,而stm32官方的hal庫里面,關于usart發(fā)送部分是有HAL_UART_Transmit_IT可以以中斷的方式發(fā)送數(shù)據(jù)的。我現(xiàn)在的疑惑就是,我只使用安富萊的fifo管理部分,將發(fā)送部分交給hal庫的函數(shù)進行處理,可不可是實現(xiàn)和安富萊bsp教程相同的功能。

2、函數(shù)解析

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;
  }
}

該段代碼是stm32f4的HAL_UART_Transmit_IT函數(shù)代碼。再該段代碼中,1、先判斷了發(fā)送是否處于忙。2、進行上鎖。3、設置隊列,并設置相關參數(shù)4、解鎖5、開始發(fā)送通過上面一段代碼,可以知道該函數(shù)是非阻塞的發(fā)送方式,其方式是在串口中斷中進行管理實現(xiàn)的隊列數(shù)據(jù)發(fā)送。詳細說明如下:

void HAL_UART_IRQHandler(UART_HandleTypeDef *huart)
{
  /* UART in mode Transmitter ------------------------------------------------*/
  if (((isrflags & USART_SR_TXE) != RESET) && ((cr1its & USART_CR1_TXEIE) != RESET))
  {
    UART_Transmit_IT(huart);
    return;
  }

  /* UART in mode Transmitter end --------------------------------------------*/
  if (((isrflags & USART_SR_TC) != RESET) && ((cr1its & USART_CR1_TCIE) != RESET))
  {
    UART_EndTransmit_IT(huart);
    return;
  }
}

在函數(shù)里面由這兩段代碼進行判斷,其中標志位說明如下

由標志位我們可以知道,當一組數(shù)據(jù)未傳輸完成時,TXE數(shù)據(jù)會置1,如果開啟了中斷,那么tc也會置1,但是根據(jù)if語句的先后順序,會先執(zhí)行UART_Transmit_IT(huart);函數(shù),在該函數(shù)路面,會再次對dr寄存器進行數(shù)據(jù)寫入。寫入完成后,會對tc位置0。當所有的數(shù)據(jù)都發(fā)送完成之后,UART_Transmit_IT(huart);不會再次寫入dr寄存器,程序進入UART_EndTransmit_IT(huart);函數(shù),觸發(fā)HAL_UART_TxCpltCallback(huart);中斷。

修改思路

接下來的問題就簡單了,我們只需要在安富萊的發(fā)送開始函數(shù)改成HAL_UART_Transmit_IT()即可,然后在發(fā)送中斷里面寫fifo的發(fā)送即可。

聲明:本內(nèi)容為作者獨立觀點,不代表電子星球立場。未經(jīng)允許不得轉(zhuǎn)載。授權事宜與稿件投訴,請聯(lián)系:editor@netbroad.com
覺得內(nèi)容不錯的朋友,別忘了一鍵三連哦!
贊 6
收藏 4
關注 11
成為作者 賺取收益
全部留言
0/200
成為第一個和作者交流的人吧
主站蜘蛛池模板: 99久RE热视频这里只有精品6 | 国产成人无码a区精油按摩 大地资源在线观看免费高清官网 | 伊人第一页 | 日韩国产免费一区二区三区 | 日韩小片 | 嘿咻嘿咻免费区在线观看 | 中文字幕一区在线观看视频 | 蜜乳av入口 | 亚洲av无码偷拍在线观看 | 69久久夜色精品国产69蝌蚪网 | 日韩无马砖区芒果 | 亚洲毛片AV日韩AV无码 | 狠狠躁夜夜躁人人爽蜜桃 | gogogo高清在线观看中文 | 好大好爽好深国产在线 | 国产猛男猛女无遮无掩 | 亚洲一级视频在线观看 | 亚洲AV网址在线 | 911精品美国片911久久久 | 诱人的女邻居9中文观看 | 久久久久久久久无码精品亚洲日韩 | 中国丰满熟妇xxxx性 | 中文字幕无码AV激情不卡 | av免费片| 成人片免费看 | 欧美精品二区中文乱码字幕高清 | a国产亚洲欧美精品一区在线观看 | 欧美一级鲁丝片 | 精品成人一区二区三区四区 | 手机成人在线观看 | 加勒比无码一区二区三区 | 成人午夜黄色 | 麻豆福利影院 | 午夜剧场大片亚洲欧洲一区 | 91ponry九色| 久久精品女人毛片国产 | 草草亚洲视频 | 国产一区二区三区别 | 十八禁羞羞视频爽爽爽 | 久久伊人天堂 | 国产欧美一区二区白浆黑人 |