1.引言

UART串口通信是嵌入式系统中常用的通信方式,广泛应用于设备间的数据传输。在蓝桥杯嵌入式竞赛中,UART串口通信是必考内容之一。本文将基于STM32的HAL库,详细介绍如何构建UART串口模板工程,并结合HAL库中的相关函数,深入解析其原理和实现方法。

2. UART串口通信基础
2.1 UART通信原理

UART(Universal Asynchronous Receiver/Transmitter)是一种异步串行通信协议,通过TX(发送)和RX(接收)两根信号线实现全双工通信。

2.2 串口参数配置
  • 波特率:通信速率,常见值有9600、115200等。

  • 数据位:每次传输的数据位数,通常为8位。

  • 停止位:表示数据帧结束,通常为1位。

  • 校验位:用于错误检测,可选无校验、奇校验或偶校验。

3. STM32CubeMX配置 

在这里我们仅仅配置了串口一,模式选择异步时钟(Asynchronous),将波特率设置为9600Bits/s,同时支持接受和发送,数据位为8,停止位为1,校验位选择NONE其他选项默认即可,对应的IO口是PA9和PA10。

时钟树部分,USART与2线相连所以选择PCLK2;同时不要忘记打开NVIC中断。

以上就是STM32CubeMX配置的部分。

4.代码实现
UART_HandleTypeDef huart1;

/* USART1 init function */

void MX_USART1_UART_Init(void)
{

  /* USER CODE BEGIN USART1_Init 0 */

  /* USER CODE END USART1_Init 0 */

  /* USER CODE BEGIN USART1_Init 1 */

  /* USER CODE END USART1_Init 1 */
  huart1.Instance = USART1;
  huart1.Init.BaudRate = 9600;
  huart1.Init.WordLength = UART_WORDLENGTH_8B;
  huart1.Init.StopBits = UART_STOPBITS_1;
  huart1.Init.Parity = UART_PARITY_NONE;
  huart1.Init.Mode = UART_MODE_TX_RX;
  huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
  huart1.Init.OverSampling = UART_OVERSAMPLING_16;
  huart1.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE;
  huart1.Init.ClockPrescaler = UART_PRESCALER_DIV1;
  huart1.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;
  if (HAL_UART_Init(&huart1) != HAL_OK)
  {
    Error_Handler();
  }
  if (HAL_UARTEx_SetTxFifoThreshold(&huart1, UART_TXFIFO_THRESHOLD_1_8) != HAL_OK)
  {
    Error_Handler();
  }
  if (HAL_UARTEx_SetRxFifoThreshold(&huart1, UART_RXFIFO_THRESHOLD_1_8) != HAL_OK)
  {
    Error_Handler();
  }
  if (HAL_UARTEx_DisableFifoMode(&huart1) != HAL_OK)
  {
    Error_Handler();
  }
  /* USER CODE BEGIN USART1_Init 2 */

  /* USER CODE END USART1_Init 2 */

}

以上代码为uart1的初始化部分。

5. UART串口通信示例
5.1 发送数据
__IO uint32_t uwTick_Usart_Set_Point = 0;
int counter = 0;
char str[40];

void Usart_Proc(void)
{
	if((uwTick -  uwTick_Usart_Set_Point)<1000)	return;//减速函数
	uwTick_Usart_Set_Point = uwTick;
	
	sprintf(str, "%04d:Hello,world.\r\n", counter);
  HAL_UART_Transmit(&huart1,(unsigned char *)str, strlen(str), 50);
	
	if(++counter == 10000)
		counter = 0;
}
5.2 接收数据
HAL_UART_Receive_IT(&huart1,&rx_buffer,1);//开启已中断方式接收数据
 while (1)
  {
    /* USER CODE END WHILE */
		Lcd_Proc();
		Key_Proc();
		Usart_Proc();
		if (uart_rx_flag)
		{ // 检查接收完成标志
      uart_rx_flag = 0; // 清除标志
      LED_Disp(0x88); // 显示 LED 状态
    }
    /* USER CODE BEGIN 3 */
  }


void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
	 if (huart->Instance == USART1)// 判断是哪个 UART 触发的中断
	 { 
     uart_rx_flag = 1; // 设置接收完成标志
     HAL_UART_Receive_IT(&huart1, &rx_buffer, 1); // 重新启用接收中断
   }
}

HAL_UART_RxCpltCallback是STM32 HAL库 中 UART 接收中断完成回调函数,作用是处理UART接收事件。

6. HAL库中其他相关函数详解
6.1 HAL_UART_Transmit
  • 功能:普通发送数据。

  • 参数:UART句柄、发送数据缓冲区、数据长度、超时时间。

6.2 HAL_UART_Receive
  • 功能:普通接收数据。

  • 参数:UART句柄、接收数据缓冲区、数据长度、超时时间。

6.3 HAL_UART_Transmit_IT
  • 功能:以中断方式发送数据。

  • 参数:UART句柄、发送数据缓冲区、数据长度。

6.4 HAL_UART_Receive_IT
  • 功能:以中断方式接收数据。

  • 参数:UART句柄、接收数据缓冲区、数据长度。

6.5HAL_UART_Transmit_DMA
  • 功能:以DMA方式发送数据。

  • 参数:UART句柄、发送数据缓冲区、数据长度。

6.6 HAL_UART_Receive_DMA
  • 功能:以DMA方式接收数据。

  • 参数:UART句柄、接收数据缓冲区、数据长度。

7.结束

通过本文的学习,相信你已经掌握了UART串口模板工程的构建方法,并对HAL库中的相关函数有了更深入的理解。希望这些内容能为你的蓝桥杯嵌入式竞赛之路提供帮助。如果有任何问题或建议,欢迎在评论区留言讨论!

Logo

openvela 操作系统专为 AIoT 领域量身定制,以轻量化、标准兼容、安全性和高度可扩展性为核心特点。openvela 以其卓越的技术优势,已成为众多物联网设备和 AI 硬件的技术首选,涵盖了智能手表、运动手环、智能音箱、耳机、智能家居设备以及机器人等多个领域。

更多推荐