我試圖了解 STM32F091VB 如何使用該功能通過串行協議管理資料發送HAL_UART_Transmit_IT()
目前我有一個在 main() 中呼叫的函式,它創建資料包并通過串行發送它;它是這樣的:
tx1[0] = STX;
tx1[1] = 0xFF;
tx1[2] = 0x80;
tx1[3] = 0x80;
DE_TAST_HIGH;
HAL_UART_Transmit_IT(&huart3, tx1, 8);
現在,我發送的資料非常小,因此代碼運行得非常快,我試圖了解如果我嘗試通過串行協議發送一個巨大的資料包會發生什么。
例如,如果 mytx1[]是 100 位元組,則HAL_UART_Transmit_IT()功能塊 CPU 在將完整資料包發送到串行埠時等待,或者它更像是一個單獨的行程,我告訴微發送該資料包,并且在發送它的同時還處理剩余的資料包我的代碼/主要功能的一部分?
我試圖在微型資料表上搜索,看看這個程序是否有什么問題,但我沒有運氣。我已閱讀stm32f0xx_hal_uart.c并確認它是通過中斷以非阻塞模式發送的,但我希望有一些關于它的更深入的檔案
uj5u.com熱心網友回復:
首先,您需要了解如何HAL_UART_Transmit_IT使用。我們可以從
該函式是“非阻塞”的,因為當您呼叫它時,它會對中斷進行一些配置,然后回傳。在呼叫您的函式期間不會傳輸緩沖區,而是將繁重的作業推遲到稍后階段。
我們可以進一步查看源代碼,以從我所說的中得到證明(注意我只保留了多汁的部分)。
阻塞
HAL_StatusTypeDef HAL_UART_Transmit(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout)
{
uint16_t* tmp;
uint32_t tickstart = 0U;
// [ ... ]
huart->TxXferSize = Size;
huart->TxXferCount = Size;
while(huart->TxXferCount > 0U)
{
// [ ... ]
// This is were the actual HW regs are accessed, starting the transfer
huart->Instance->DR = (*pData & (uint8_t)0xFF);
}
}
// [ ... ]
return HAL_OK
}
非阻塞
HAL_StatusTypeDef HAL_UART_Transmit_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)
{
huart->pTxBuffPtr = pData;
huart->TxXferSize = Size;
huart->TxXferCount = Size;
/* Enable the UART Transmit data register empty Interrupt */
// This is the only part were HW regs are accessed. What is happening here??
SET_BIT(huart->Instance->CR1, USART_CR1_TXEIE);
return HAL_OK;
}
_IT 函式僅激活一個中斷,同樣基于資料表:


這意味著只要 TX 緩沖區空閑,我們就會收到一個中斷。那么到底是誰在發送資料呢?
在常見問題解答和閱讀源代碼的幫助下,我們發現它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_Transmit_IT
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)
{
huart->Instance->DR = (uint8_t)(*huart->pTxBuffPtr & (uint8_t)0x00FF);
if(--huart->TxXferCount == 0U)
{
/* Disable the UART Transmit Complete Interrupt */
CLEAR_BIT(huart->Instance->CR1, USART_CR1_TXEIE);
/* Enable the UART Transmit Complete Interrupt */
SET_BIT(huart->Instance->CR1, USART_CR1_TCIE);
}
return HAL_OK;
}
else
{
return HAL_BUSY;
}
}
這個函式只傳輸一個位元組!然后它遞減發送的計數器(記住,所有資訊都設定到 uart 處理程式中),如果達到 0,最后complete呼叫中斷。
中斷
請注意,StmCube 會為您完成外設初始化和中斷鏈接,但是如果您從頭開始編程,則需要記住撰寫和注冊UART_IRQ_Handler
您可以在此處找到代碼導航器來查看我的代碼段并進一步調查。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/467410.html
上一篇:如何使用C正確接收串行資料?
