1. 项目概述
作为一名嵌入式开发新手,掌握串口通信是进入STM32世界的必修课。这两天我使用正点原子STM32F407探索者开发板,完成了基础的串口通信实验。这个看似简单的实验,实际上包含了嵌入式系统中最核心的通信原理和调试技巧。
串口通信(UART)作为最古老却又最实用的通信方式之一,在嵌入式开发中占据着不可替代的地位。无论是打印调试信息、与传感器通信,还是进行固件升级,都离不开串口。通过这个实验,我不仅学会了如何配置STM32的USART外设,更重要的是理解了异步通信的底层机制和实际应用中的各种坑点。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 硬件准备与环境搭建
2.1 开发板与工具清单
本次实验使用的硬件平台是正点原子STM32F407探索者开发板,它搭载了STM32F407ZGT6芯片,主频高达168MHz,具有丰富的外设资源。具体需要准备的硬件和软件包括:
- 正点原子STM32F407探索者开发板(含USB数据线)
- 杜邦线若干(用于连接USB转TTL模块)
- USB转TTL模块(如CH340、CP2102等)
- Keil MDK开发环境(已安装STM32F4支持包)
- 串口调试助手(如SecureCRT、Putty或正点原子自带的XCOM)
注意:USB转TTL模块的TX/RX需要与开发板交叉连接,即模块的TX接开发板的RX(PA10),模块的RX接开发板的TX(PA9)。这是新手最容易犯的错误之一。
2.2 开发环境配置
在Keil中新建工程时,需要正确选择器件型号STM32F407ZGTx。正点原子提供的标准库或HAL库已经包含了USART的驱动代码,我们可以直接调用相关函数进行开发。
关键的环境配置步骤包括:
- 在Manage Run-Time Environment中启用USART支持
- 配置系统时钟为168MHz(确保串口波特率计算准确)
- 在Options for Target中设置正确的调试器(ST-Link Debugger)
- 配置正确的Flash算法(STM32F4xx 1MB Flash)
3. USART外设配置详解
3.1 寄存器级配置原理
STM32的USART外设功能强大但配置复杂,理解寄存器级的配置原理对排查问题很有帮助。主要需要配置的寄存器包括:
- USART_CR1:控制寄存器1,配置字长、校验位、使能等
- USART_BRR:波特率寄存器,决定通信速率
- USART_CR2:控制寄存器2,配置停止位等
- USART_CR3:控制寄存器3,配置硬件流控制等
波特率的计算公式为:
code复制波特率 = fck / (16 * USARTDIV)
其中fck是USART的时钟频率(APB1总线为42MHz,APB2为84MHz),USARTDIV是一个浮点数,整数部分写入BRR[15:4],小数部分*16后写入BRR[3:0]。
3.2 使用标准库配置USART
正点原子的例程通常使用标准库进行开发,配置USART1的基本流程如下:
c复制// 1. 使能时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
// 2. 配置GPIO
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_10;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_Init(GPIOA, &GPIO_InitStructure);
// 3. 引脚复用
GPIO_PinAFConfig(GPIOA, GPIO_PinSource9, GPIO_AF_USART1);
GPIO_PinAFConfig(GPIOA, GPIO_PinSource10, GPIO_AF_USART1);
