蓝桥杯物联网基础实验1.5--ex5 USART串口发送实验

实验名称— 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

}

}

猜你喜欢

转载自blog.csdn.net/m0_52468208/article/details/113978425