STM32F407 HAL库uart发送函数
时间: 2023-05-24 21:06:12 浏览: 127
以下是STM32F407 HAL库uart发送函数的示例代码:
```
/**
* @brief Sends an amount of data through the UARTx peripheral.
* @param huart: UART handle.
* @param pData: Pointer to data buffer.
* @param Size: Amount of data to be sent.
* @retval HAL status.
*/
HAL_StatusTypeDef HAL_UART_Transmit(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout)
{
uint16_t* tmp;
uint16_t uhMask;
uint32_t tickstart = 0U;
/* Check that a Tx process is not already ongoing */
if(huart->gState == HAL_UART_STATE_READY)
{
/* Compile time check if possible */
#if (USE_HAL_UART_REGISTER_CALLBACKS == 1)
/* Call registered Tx complete callback */
huart->TxCpltCallback(huart);
#else
/* Tx transfer start */
huart->gState = HAL_UART_STATE_BUSY_TX;
#endif /* USE_HAL_UART_REGISTER_CALLBACKS */
huart->ErrorCode = HAL_UART_ERROR_NONE;
if(huart->Init.WordLength == UART_WORDLENGTH_9B)
{
if(huart->Init.Parity == UART_PARITY_NONE)
{
tmp = (uint16_t*) pData;
uhMask = 0x01FFU; /* 9 bits */
}
else
{
tmp = (uint16_t*) pData;
uhMask = 0x00FFU; /* 8 bits + parity */
}
}
else
{
tmp = (uint16_t*) pData;
uhMask = 0x007FU; /* 7 bits */
}
huart->TxXferCount = Size;
/* To avoid building warning message */
/* (__GNUC__ compiler: cast between incompatible function types) */
/* cast pData to uint16_t* in case of 9bits or 8bits + parity format */
huart->pTxBuffPtr = (uint8_t*)(tmp);
huart->TxXferSize = Size;
/* Process Locked */
__HAL_LOCK(huart);
/* Enable the UART Transmit data register empty Interrupt */
__HAL_UART_ENABLE_IT(huart, UART_IT_TXE);
tickstart = HAL_GetTick();
while(huart->TxXferCount > 0U)
{
if((Timeout == 0U) || ((HAL_GetTick()-tickstart) > Timeout))
{
huart->gState = HAL_UART_STATE_TIMEOUT;
/* Process Unlocked */
__HAL_UNLOCK(huart);
return HAL_TIMEOUT;
}
}
/* At end of Tx process, restore huart->pTxBuffPtr and huart->TxXferSize
(could have been changed during Tx process) */
huart->pTxBuffPtr = pData;
huart->TxXferSize = Size;
/* Disable the UART Transmit data register empty Interrupt */
__HAL_UART_DISABLE_IT(huart, UART_IT_TXE);
/* Disable the UART Error Interrupt: (Frame error, noise error, overrun error) */
__HAL_UART_DISABLE_IT(huart, UART_IT_ERR);
/* Process Unlocked */
__HAL_UNLOCK(huart);
/* Call Tx complete callback */
#if (USE_HAL_UART_REGISTER_CALLBACKS == 1)
/* Call registered Tx complete callback */
huart->TxCpltCallback(huart);
#else
/* Call legacy weak Tx complete callback */
HAL_UART_TxCpltCallback(huart);
#endif /* USE_HAL_UART_REGISTER_CALLBACKS */
return HAL_OK;
}
else
{
return HAL_BUSY;
}
}
```
此函数将发送数据缓冲区指针,要发送的数据大小和超时作为参数。在调用此函数之前,必须先初始化UART外设和使用HAL_UART_MspInit()函数配置外设时钟、GPIO等引脚。在发送数据之后,可以使用回调函数处理传输完成事件,或者使用轮询检查状态。在数据传输期间,数据将通过UART外设发送,并在传输完成后通过回调函数或轮询调用进行通知。如果传输过程中超时,函数将返回HAL_TIMEOUT状态。