USART_SendData()这个函数是怎么写的
时间: 2023-05-25 10:06:24 浏览: 1366
USART_SendData()函数是芯片厂商提供的库函数之一,用于向USART发送单个字节的数据。其函数定义通常包含两个参数:USARTx代表USART端口号,Data表示要发送的数据。
以下是STM32HAL库中USART_SendData()函数的代码:
```
void HAL_UART_Transmit(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout)
{
uint16_t* tmp = (uint16_t*) pData;
uint32_t tickstart = HAL_GetTick();
huart->TxXferSize = Size;
huart->TxXferCount = Size;
/* Check the remain data to be sent */
while(huart->TxXferCount > 0U)
{
/* Wait until TXE flag is set to send data */
if(UART_WaitOnFlagUntilTimeout(huart, UART_FLAG_TXE, RESET, tickstart, Timeout) != HAL_OK)
{
return HAL_TIMEOUT;
}
/* Send data with format Data, par, stop */
if(huart->Init.WordLength == UART_WORDLENGTH_9B)
{
huart->Instance->TDR = (*tmp & (uint16_t)0x01FF);
tmp++;
}
else
{
huart->Instance->TDR = (*pData++ & (uint8_t)0xFF);
}
huart->TxXferCount--;
}
/* Wait until TC flag is set to close transmission */
if(UART_WaitOnFlagUntilTimeout(huart, UART_FLAG_TC, RESET, tickstart, Timeout) != HAL_OK)
{
return HAL_TIMEOUT;
}
/* Clear TXE flag */
__HAL_UART_CLEAR_FLAG(huart, UART_FLAG_TC);
/* Process Unlocked */
__HAL_UNLOCK(huart);
return HAL_OK;
}
```
在此函数中,首先通过tickstart变量记录当前时间,定义了TxXferSize和TxXferCount变量来表示要发送的数据的大小和剩余的数据量。然后在while循环中,判断TxXferCount是否大于0,即是否还有数据未发送。如果TXE标志位被设置,则可以发送数据。在发送数据之前,如果使用了9位字长,则从pData指向的地址中取出9个bit,然后再将其写入TDR寄存器。否则,直接将pData指向的8个bit写入TDR寄存器。最后,等待数据发送完毕,并清除TC标志位。
需要注意的是,USART_SendData()函数在发送数据之前必须调用USART_Init()函数初始化串口参数,确保参数设置正确。
阅读全文