STM32 HAL库串口发送函数HAL_UART_Transmit()分析
硬件平台:STM32F103VET6
软件平台:STM32CubeMX 4.22
MDK 5.23
HAL库版本:FW_F1 V1.6.0
以下是分析过程:
HAL_StatusTypeDef HAL_UART_Transmit(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout)
{
uint16_t* tmp;
uint32_t tickstart = 0U;
/* Check that a Tx process is not already ongoing */
/*检查有没有一个发送的处理正在运行*/
/*如果是准备好的状态就判断指针是否为空或者接收到数据的大小是否为0,上述条件满足
*任意一个就返回错误标志。
*/
if(huart->gState == HAL_UART_STATE_READY)
{
if((pData == NULL) || (Size == 0U))
{
return HAL_ERROR;
}
/* Process Locked */
/*锁住进程*/
__HAL_LOCK(huart);
/*无错误码,将状态设置为发送忙*/
huart->ErrorCode = HAL_UART_ERROR_NONE;
huart->gState = HAL_UART_STATE_BUSY_TX;
/* Init tickstart for timeout managment */
/*初始化超时计时*/
tickstart = HAL_GetTick();
huart->TxXferSize = Size;
huart->TxXferCount = Size;
/*判断数值是否大于0*/
while(huart->TxXferCount > 0U)
{
huart->TxXferCount--;
/*判断是不是9个字节的长度*/应该是字长是9位数据格式2022.7.20
if(huart->Init.WordLength == UART_WORDLENGTH_9B)
{
if(UART_WaitOnFlagUntilTimeout(huart, UART_FLAG_TXE, RESET, tickstart, Timeout) != HAL_OK)
{
return HAL_TIMEOUT;
}
tmp = (uint16_t*) pData;
huart->Instance->DR = (*tmp & (uint16_t)0x01FF);
if(huart->Init.Parity == UART_PARITY_NONE)
{
pData +=2U;
}
else
{
pData +=1U;
}
}
/*不是9个字节长度*/应该是字长是9位数据格式2022.7.20
else
{
/*等待超时标志,如果发送寄存器为空(详见STM32中文参考手册V10),则执行此if函数
*并返回HAL_TIMEOUT
*/
if(UART_WaitOnFlagUntilTimeout(huart, UART_FLAG_TXE, RESET, tickstart, Timeout) != HAL_OK)
{
return HAL_TIMEOUT;
}
/*将数据送给发送数据移位寄存器*/
huart->Instance->DR = (*pData++ & (uint8_t)0xFF);
}
}
/*等待超时标志,如果发送还未完成(详见STM32中文参考手册V10),则执行此if函数,并
*返回HAL_TIMEOUT
*/
if(UART_WaitOnFlagUntilTimeout(huart, UART_FLAG_TC, RESET, tickstart, Timeout) != HAL_OK)
{
return HAL_TIMEOUT;
}
/* At end of Tx process, restore huart->gState to Ready */
/*在发送处理结束的时候,重新将状态设置为准备好的状态*/
huart->gState = HAL_UART_STATE_READY;
/* Process Unlocked */
/*处理解锁*/
__HAL_UNLOCK(huart);
/*返回HAL_OK成功标志*/
return HAL_OK;
}
/*如果状态不是准备好的状态则返回忙标志*/
else
{
return HAL_BUSY;
}
}
ST官方手册Description of STM32F1 HAL and Low - layer drivers对于此函数的介绍
这是在写STM32F103VET6基于HAL库(非标准库)关于串口发送时的时候出现了一些问题,将分析函数的过程记录在这里,还会继续更新相关内容。