实验名称— USART串口发送实验
实验说明
实验目的:掌握定时器USART发送字符串的方法。
实验现象:下载程序,PC端打开串口助手,选择USB线的端口,波特率为115200,无校验,停止位为1位,文本模式接收,可以看到“ok”1秒接收1次。
STM32CubeMX配置
引脚分配:
PC15引脚:GPIO_Output(输出模式)
PA2、PA3引脚:USART2_TX
Keil5程序编写
新建工程,选择STM32L071KBUx芯片
函数分析
HAL_StatusTypeDef HAL_UART_Transmit(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout);//发送数据,阻塞发送Timeout为溢出时间
//串口中断发送,以中断方式发送指定长度的数据。
HAL_StatusTypeDef HAL_UART_Transmit_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)
{
/* Check that a Tx process is not already ongoing */ //判断huart的状态,如果是Reday状态,才对其进行配置,如果不是,则什么都不做
if(huart->gState == HAL_UART_STATE_READY) 如果 串口空闲,则执行以下语句。
{
if((pData == NULL ) || (Size == 0U)) 如果发送数据为空或者发送长度为0,则返回错误。
{
return HAL_ERROR;
}
//如果数据长度是9bit,则指针必须双字节对齐,否则返回HAL_ERROR
if ((huart->Init.WordLength == UART_WORDLENGTH_9B) && (huart->Init.Parity == UART_PARITY_NONE))
{
if((((uint32_t)pData)&1U) != 0U)
{
return HAL_ERROR;
}
}
/* Process Locked */ //配置前锁定 huart,可能是放置被意外修改吧
__HAL_LOCK(huart); 上锁。
//结构体变量 huart 的 参数设置。发送缓冲区,发送长度,发送计数器。
huart->pTxBuffPtr = pData; //设置缓存指针
huart->TxXferSize = Size; //设置接收数据数量
huart->TxXferCount = Size; //设置接收计数器
huart->ErrorCode = HAL_UART_ERROR_NONE; //ErrorCode设置为无错误
huart->gState = HAL_UART_STATE_BUSY_TX; //状态设为 发送繁忙。
/* Process Unlocked */
__HAL_UNLOCK(huart); //huart解锁。
/* Enable the UART Transmit data register empty Interrupt */
SET_BIT(huart->Instance->CR1, USART_CR1_TXEIE); //使能UART发送数据寄存器空中断,则会触发串口中断(发送中断)
return HAL_OK; //配置顺利,返回HAL_OK
}
else 如果 串口忙,则返回 忙状态。
{
return HAL_BUSY; //huart不是REDAY状态,返回HAL_BUSY
}
}