一、前言
串口通信(UART)是嵌入式系统中最基础、最常用的通信方式之一,在STM32开发中占有重要地位。它结构简单、易于实现,常用于调试信息输出、与传感器模块通信或与其他微控制器进行数据交换。通过学习江协科技的相关教程,我们可以快速掌握在STM32平台上实现串口通信的核心步骤与技巧。
二、串口通信基本原理
串口通信是一种异步全双工通信方式,主要依靠两根数据线(TX发送、RX接收)进行数据传输,无需时钟线。其核心参数包括:
- 波特率(Baud Rate):决定通信速度,常见有9600、115200等。
- 数据位(Data Bits):通常为8位。
- 停止位(Stop Bits):通常为1位。
- 奇偶校验位(Parity Bit):用于简单的错误检测,可选。
在STM32中,USART(通用同步异步收发器)模块提供了完整的串口通信硬件支持。
三、硬件连接与初始化(以STM32F103C8T6为例)
1. 硬件连接
通常将开发板的USART1TX(PA9)连接到USB转TTL模块的RX,USART1RX(PA10)连接到USB转TTL模块的TX,并确保共地(GND)。
2. 初始化步骤(基于标准库或HAL库)
以使用STM32CubeMX配合HAL库为例,关键步骤如下:
a. 引脚配置
在CubeMX中使能USART1,并设置模式为“Asynchronous”(异步)。PA9和PA10会自动配置为复用功能。
b. 参数设置
- 波特率:115200 Bits/s
- 字长:8 Bits
- 停止位:1
- 校验位:None
- 硬件流控制:Disable
c. 生成代码与用户代码添加
生成代码后,在main.c的用户代码区添加初始化后测试代码。
四、核心功能代码实现
1. 发送单个字符与字符串
`c
// 发送一个字符
HALUARTTransmit(&huart1, (uint8_t *)&ch, 1, 1000);
// 发送字符串(以'\0'结尾)
char msg[] = "Hello STM32!\r\n";
HALUARTTransmit(&huart1, (uint8_t *)msg, strlen(msg), 1000);`
2. 接收数据(轮询方式)
uint8t rxdata;
if(HALUARTReceive(&huart1, &rxdata, 1, 1000) == HALOK){
// 成功接收到一个字节,存放在rx_data中
}
3. 中断接收(推荐方式)
a. 使能接收中断
在CubeMX的NVIC设置中使能USART1全局中断,或在代码中调用:`c
_HALUARTENABLEIT(&huart1, UARTITRXNE); // 使能接收中断`
b. 编写中断回调函数
重写HAL<em>UART</em>RxCpltCallback回调函数来处理接收完成事件:`c
uint8t rxbuffer[1];
void HALUARTRxCpltCallback(UARTHandleTypeDef *huart){
if(huart->Instance == USART1){
// 处理接收到的数据 rxbuffer[0]
// ... 例如,回显数据
HALUARTTransmit(&huart1, rxbuffer, 1, 1000);
// 重新启动接收,以等待下一个字符
HALUARTReceiveIT(&huart1, rxbuffer, 1);
}
}`
在main函数初始化后,需先启动一次中断接收:HAL</em>UART<em>Receive</em>IT(&huart1, rx_buffer, 1);
4. 重定向printf(方便调试)
在usart.c文件中添加以下代码,即可使用printf函数通过串口输出:`c
#include
#ifdef GNUC
#define PUTCHARPROTOTYPE int ioputchar(int ch)
#else
#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#endif
PUTCHARPROTOTYPE{
HALUARTTransmit(&huart1, (uint8t *)&ch, 1, 1000);
return ch;
}`
之后在工程属性中勾选“Use MicroLIB”(针对Keil)或进行相应设置。
五、调试与注意事项
- 波特率一致:确保STM32与上位机(如串口助手)的波特率等参数设置完全相同。
- 接线正确:TX接RX,RX接TX,切勿接反。
- 电压匹配:STM32是3.3V电平,确保USB转TTL模块支持3.3V或已做电平转换。
- 中断优先级:如果系统中存在多个中断,需合理配置串口接收中断的优先级。
- 缓冲区管理:在中断接收大量数据时,应使用环形缓冲区(Ring Buffer)来避免数据丢失。
六、进阶应用
掌握基础收发后,可以进一步探索:
- DMA通信:利用DMA进行串口数据收发,极大减轻CPU负担,尤其适合高速或大数据量传输。
- 自定义通信协议:如设计包含帧头、命令字、数据长度、校验和、帧尾的简单协议,以提高通信可靠性。
- 多串口协同:STM32通常有多个USART,可同时与不同设备通信。
七、
通过江协科技教程的系统学习,我们从原理到实践完成了STM32串口通信的开发。从简单的引脚配置、参数设置,到轮询与中断两种数据收发方式,再到printf重定向这一实用技巧,构成了串口应用的坚实基础。在实际项目中,应根据具体需求(如速度、实时性、数据量)灵活选择轮询、中断或DMA方式。串口作为嵌入式开发的“万能钥匙”,其稳定实现是后续学习更复杂通信方式(如SPI、I2C、CAN)的重要前提。不断练习并尝试上述进阶应用,将能更深入地理解和驾驭STM32的通信功能。