计算机系统应用教程网站

网站首页 > 技术文章 正文

如何在STM32上配置和使用UART串口通信

btikc 2024-10-12 11:44:23 技术文章 8 ℃ 0 评论

在STM32微控制器上配置和使用UART串口通信涉及多个步骤,包括硬件连接、时钟配置、GPIO配置、UART配置以及编写发送和接收数据的代码。以下是一个详细的指南,包括必要的代码示例。

1. 硬件连接

首先,确保你的STM32开发板与另一个设备(如PC、另一块微控制器或传感器)通过串口线(通常是RS-232)正确连接。通常,你需要连接TX(发送)和RX(接收)引脚,以及地线(GND)。

2. 时钟配置

在STM32中,UART和GPIO模块都需要时钟。你需要在系统初始化代码中启用这些时钟。

```c
// 使能USART1和GPIOA时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
```
### 3. GPIO配置
UART的TX和RX引脚需要配置为复用功能模式(Alternate Function Mode)。以下是一个示例,展示了如何配置USART1的TX(PA9)和RX(PA10)引脚。
```c
GPIO_InitTypeDef GPIO_InitStructure;
// 配置USART1的TX和RX引脚
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_10;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; // 推挽输出模式
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
```

4. UART配置

接下来,你需要配置UART的波特率、数据位、停止位和校验位。以下是一个配置USART1为8位数据、1位停止位、无校验的示例。

```c
USART_InitTypeDef USART_InitStructure;
// USART1初始化设置
USART_InitStructure.USART_BaudRate = 9600;
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
USART_InitStructure.USART_StopBits = USART_StopBits_1;
USART_InitStructure.USART_Parity = USART_Parity_No;
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
USART_Init(USART1, &USART_InitStructure);
```

5. 编写发送和接收数据的代码

发送数据时,你需要检查TX缓冲器是否为空(TXE标志),然后写入数据。接收数据时,你需要检查RX缓冲器非空(RXNE标志),然后读取数据。

```c
// 发送单个字符
void USART1_SendChar(u8 ch) {
while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);
USART_SendData(USART1, ch);
}
// 接收单个字符
u8 USART1_ReceiveChar(void) {
while (USART_GetFlagStatus(USART1, USART_FLAG_RXNE) == RESET);
return USART_ReceiveData(USART1);
}
```

6. 主函数

在主函数中,你可以调用初始化函数来配置UART,并使用发送和接收函数来通信。

```c
int main(void) {
// 初始化USART1
USART1_Init(9600);
while (1) {
// 发送字符串
USART1_SendChar('H');
USART1_SendChar('e');
USART1_SendChar('l');
USART1_SendChar('l');
USART1_SendChar('o');
USART1_SendChar('\n');
// 接收字符并回显
u8 ch = USART1_ReceiveChar();
USART1_SendChar(ch);
}
}
```

注意事项

- 在实际应用中,可能需要配置NVIC和USART的中断来处理接收数据,特别是在数据量大或需要实时响应的情况下。

- 如果使用RS-232接口,可能需要一个电平转换器(如MAX3232),因为RS-232标准使用的是-15V到+15V的电平,而STM32的GPIO输出的是0V到3.3V的TTL电平。

- 在设计硬件连接时,确保TX和RX引脚正确交叉连接,即发送方的TX连接到接收方的RX,反之亦然。

这个示例提供了一个基本的STM32 UART通信框架,你可以根据实际需求进行扩展和优化。在开发过程中,建议使用逻辑分析仪或示波器来验证通信协议的正确性。


嵌入式物联网需要学的东西真的非常多,千万不要学错了路线和内容,导致工资要不上去!

无偿分享大家一个资料包,差不多150多G。里面学习内容、面经、项目都比较新也比较全!某鱼上买估计至少要好几十。

点击文章底部链接

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表