STM32 UART 基础
介绍
UART(Universal Asynchronous Receiver/Transmitter,通用异步收发传输器)是一种常见的串行通信协议,广泛应用于嵌入式系统中。STM32 微控制器内置了多个 UART 外设,能够实现与其他设备(如传感器、GPS 模块、蓝牙模块等)的通信。本文将带你了解 UART 的基本概念、配置方法以及如何在 STM32 中使用 UART 进行数据传输。
UART 的工作原理
UART 是一种异步通信协议,意味着它不需要时钟信号来同步数据传输。UART 通信通常由两根信号线组成:
- TX(Transmit):发送数据线
- RX(Receive):接收数据线
数据传输的基本单位是帧,每帧包含以下部分:
- 起始位:标志数据传输的开始,通常为低电平。
- 数据位:实际传输的数据,通常为 5-9 位。
- 校验位(可选):用于错误检测。
- 停止位:标志数据传输的结束,通常为高电平。
备注
UART 通信是全双工的,意味着数据可以同时发送和接收。
STM32 中的 UART 配置
在 STM32 中,UART 的配置通常包括以下几个步骤:
- 启用 UART 外设的时钟。
- 配置 GPIO 引脚为 UART 功能。
- 设置 UART 的波特率、数据位、校验位和停止位。
- 启用 UART 外设。
以下是一个简单的 UART 初始化代码示例:
c
#include "stm32f4xx.h"
void UART_Init(void) {
// 1. 启用 GPIOA 和 USART2 的时钟
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);
// 2. 配置 GPIOA 的引脚 2 和 3 为 UART 功能
GPIO_InitTypeDef GPIO_InitStruct;
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_2 | GPIO_Pin_3;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;
GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_Init(GPIOA, &GPIO_InitStruct);
GPIO_PinAFConfig(GPIOA, GPIO_PinSource2, GPIO_AF_USART2); // TX
GPIO_PinAFConfig(GPIOA, GPIO_PinSource3, GPIO_AF_USART2); // RX
// 3. 配置 UART
USART_InitTypeDef USART_InitStruct;
USART_InitStruct.USART_BaudRate = 9600;
USART_InitStruct.USART_WordLength = USART_WordLength_8b;
USART_InitStruct.USART_StopBits = USART_StopBits_1;
USART_InitStruct.USART_Parity = USART_Parity_No;
USART_InitStruct.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
USART_InitStruct.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
USART_Init(USART2, &USART_InitStruct);
// 4. 启用 UART
USART_Cmd(USART2, ENABLE);
}
发送和接收数据
发送数据
要发送数据,可以使用 USART_SendData
函数。以下是一个发送字符串的示例:
c
void UART_SendString(USART_TypeDef* USARTx, char* str) {
while (*str) {
while (!(USARTx->SR & USART_FLAG_TXE)); // 等待发送缓冲区为空
USART_SendData(USARTx, *str++);
}
}
接收数据
要接收数据,可以使用 USART_ReceiveData
函数。以下是一个接收字符的示例:
c
char UART_ReceiveChar(USART_TypeDef* USARTx) {
while (!(USARTx->SR & USART_FLAG_RXNE)); // 等待接收到数据
return USART_ReceiveData(USARTx);
}
实际应用案例
假设你正在开发一个基于 STM32 的环境监测系统,需要将温湿度传感器的数据通过 UART 发送到上位机。以下是一个简单的实现:
c
void SendSensorData(float temperature, float humidity) {
char buffer[50];
sprintf(buffer, "Temperature: %.2f C, Humidity: %.2f %%\r\n", temperature, humidity);
UART_SendString(USART2, buffer);
}
提示
在实际应用中,建议使用 DMA(直接内存访问)来提高 UART 的传输效率,尤其是在需要传输大量数据时。
总结
UART 是 STM32 中常用的串行通信协议,适用于多种应用场景。通过本文,你已经学习了 UART 的基本工作原理、配置方法以及如何在 STM32 中实现数据的发送和接收。希望这些知识能帮助你在未来的项目中更好地使用 UART。
附加资源与练习
- 练习 1:修改代码,使其支持 115200 的波特率。
- 练习 2:尝试使用 DMA 实现 UART 数据传输。
- 资源:参考 STM32 官方参考手册,了解更多关于 UART 的高级功能(如硬件流控制、中断模式等)。
警告
在实际开发中,务必注意 UART 的波特率设置,确保发送端和接收端的波特率一致,否则会导致通信失败。