2. 开发环境搭建

本章是实战课程的“地基”环节。我们将从零开始,依次完成芯片配置、IDE安装、调试工具验证和硬件信号捕获四个步骤。只有环境搭建正确,后续的轮询、中断、DMA三阶段代码才能顺利运行并观察到预期现象。

学习提示: 本章不涉及复杂的C语言逻辑,但每一步操作都直接影响后续调试效率。建议读者按照顺序操作,并在每个工具首次使用时完成一次“冒烟测试”(即发送一个字节并确认回显),确保链路畅通。

2.1 开发工具全景图

本课程使用的工具链及其在开发流程中的位置如下图所示。理解各工具的职责,有助于在后续章节中快速定位问题。

裸机串口开发工具链全景图 裸机串口开发工具链全景图 STM32CubeMX 芯片配置 · 引脚分配 · 时钟树 生成初始化C代码 Keil MDK-ARM 代码编辑 · 编译 · 下载 在线调试(JTAG/SWD) 串口调试助手 SSCOM / Putty 收发数据 · 协议验证 逻辑分析仪 捕获TX/RX波形 分析波特率 · 帧格式 数据流方向 CubeMX → Keil → 串口助手 逻辑分析仪并行监测

2.2 STM32CubeMX 工程生成

STM32CubeMX 是 ST 官方提供的图形化配置工具,用于初始化芯片外设、时钟和引脚。本课程以 STM32F103C8T6(蓝色药丸板)为例进行配置。

2.2.1 新建工程与芯片选择

  1. 打开 STM32CubeMX,点击 New Project。
  2. 在 Board Selector 选项卡中搜索 STM32F103C8,或切换到 MCU Selector 手动选择 STM32F103C8Tx。
  3. 确认后进入 Pinout & Configuration 界面。

2.2.2 串口外设配置(USART1)

本课程使用 USART1(PA9-TX, PA10-RX)作为实验串口。配置步骤如下表所示:

配置项 参数值 说明
Mode Asynchronous 异步模式,全双工
Baud Rate 115200 常用高速率,匹配调试助手
Word Length 8 Bits 标准数据位
Parity None 无校验
Stop Bits 1 1位停止位
GPIO Pins PA9 (TX), PA10 (RX) 自动分配,无需手动修改

2.2.3 时钟树配置

为保证串口波特率精确,建议使用外部晶振(HSE)并通过 PLL 倍频到 72MHz。在 Clock Configuration 界面中:

  • HSE 选择 Crystal/Ceramic Resonator。
  • PLL Source 选择 HSE。
  • HCLK 设置为 72 MHz。
  • APB2 总线时钟(USART1 挂载)自动设置为 72 MHz。
常见错误: 如果使用内部 HSI 时钟(8MHz)且未正确配置分频系数,USART 波特率误差可能超过 2%,导致通信丢帧。务必在 Clock Configuration 页面确认 USART1 时钟源为 APB2(72MHz)。

2.2.4 生成代码

  1. 切换到 Project Manager 选项卡。
  2. Project Name 填写 uart_polling(后续章节可分别命名为 uart_interrupt、uart_dma)。
  3. Toolchain / IDE 选择 MDK-ARM V5。
  4. 点击 GENERATE CODE,等待生成完成。
STM32CubeMX 串口配置流程 STM32CubeMX 串口配置流程 新建工程 选择MCU 配置USART1 时钟树设置 生成MDK代码

2.3 Keil MDK-ARM 安装与配置

Keil MDK-ARM 是 ARM Cortex-M 系列最常用的商业 IDE。本课程使用 MDK-ARM V5.38 版本,兼容 STM32F1 系列。

2.3.1 安装步骤

  1. 从 ARM 官网下载 MDK-ARM 安装包,双击运行。
  2. 安装路径建议保持默认(C:\Keil_v5),避免中文路径。
  3. 安装完成后,打开 Keil,点击 Pack Installer 图标。
  4. 在 Pack Installer 中搜索 STM32F1xx_DFP(Device Family Pack),点击 Install。
关键提示: 如果没有安装对应的 DFP 包,Keil 无法识别 STM32F103C8 芯片,编译时会报错 “device not found”。DFP 包版本建议选择 2.4.0 或以上。

2.3.2 打开 CubeMX 生成的工程

  1. 在 CubeMX 生成目录下找到 MDK-ARM 文件夹,双击 .uvprojx 文件。
  2. Keil 会自动加载所有源文件和外设驱动库。
  3. 在 Project 窗口中展开 Application/User,找到 main.c,确认 HAL 初始化代码已生成。

2.3.3 编译与下载配置

配置项 推荐值 操作路径
Target晶振 8.0 MHz(外部HSE) Project → Options → Target
Debugger ST-Link Debugger Project → Options → Debug
Flash Download 勾选 Reset and Run Debug → Settings → Flash Download
优化等级 Level 0(调试阶段) Project → Options → C/C++ → Optimization

完成配置后,点击 Build (F7) 编译工程,确认 0 Error(s), 0 Warning(s)。然后点击 Download (F8) 将程序烧录至开发板。

2.4 串口调试助手使用(SSCOM / Putty)

串口调试助手是验证 MCU 与 PC 通信的最直接工具。本课程推荐 SSCOM(轻量、稳定)和 Putty(支持串口与网络)两种。

2.4.1 硬件连接

  • 使用 USB-TTL 转换器(如 CH340G)连接开发板:
  • USB-TTL TX → 开发板 PA10 (RX)
  • USB-TTL RX → 开发板 PA9 (TX)
  • GND → GND(必须共地)
接线警告: TX 与 RX 必须交叉连接(即 MCU 的 TX 接 PC 的 RX,MCU 的 RX 接 PC 的 TX)。如果接成直连,数据将无法通信。此外,部分 USB-TTL 模块输出电平为 5V,而 STM32F103 的 GPIO 容忍 5V 输入,但建议使用 3.3V 供电的模块。

2.4.2 SSCOM 配置

  1. 打开 SSCOM,在界面左侧选择正确的 COM 端口(可在设备管理器中查看)。
  2. 设置参数:波特率 115200,数据位 8,停止位 1,无校验,无流控。
  3. 点击 打开串口,状态栏显示 “COMx opened”。
  4. 在发送区输入 Hello STM32!,点击 发送。

2.4.3 Putty 配置

  1. 打开 Putty,选择 Serial 连接类型。
  2. Serial line 填写 COM 端口号(如 COM3),Speed 填写 115200。
  3. 在左侧 Connection → Serial 中确认 Flow control 为 None。
  4. 点击 Open,进入终端界面。直接键盘输入即可发送数据。
PC与MCU串口通信链路 PC与MCU串口通信链路 PC 端 SSCOM / Putty USB-TTL CH340 / FT232 STM32F103 USART1 (PA9/PA10) USB TX/RX交叉

2.5 逻辑分析仪连接方法

逻辑分析仪用于捕获串口 TX/RX 引脚的数字波形,是分析时序问题(如波特率偏差、帧错误)的利器。本课程以 Saleae Logic 8(或兼容的 24MHz/8通道逻辑分析仪)为例。

2.5.1 硬件连接

  • 逻辑分析仪的 通道 0 (CH0) 连接开发板的 PA9 (TX)。
  • 逻辑分析仪的 通道 1 (CH1) 连接开发板的 PA10 (RX)。
  • 逻辑分析仪的 GND 连接开发板的 GND。
实用技巧: 如果逻辑分析仪通道数充足,可以同时捕获 TX 和 RX 两条线,便于观察“发送请求”与“接收响应”之间的延迟。建议使用带颜色标识的杜邦线(如 TX 用黄色,RX 用绿色,GND 用黑色)。

2.5.2 软件配置(Saleae Logic)

  1. 打开 Saleae Logic 软件,点击 Start 开始采样。
  2. 采样率设置为 24 MHz(至少为波特率的 16 倍以上,以保证每个位有足够采样点)。
  3. 采样时长设置为 10 ms(发送一个字节约 87 µs @115200,10ms 足够捕获多个字节)。
  4. 点击 Stop 停止采样,观察波形。
  5. 在波形上右键添加 Async Serial 分析器,设置波特率 115200、8位数据、无校验、1位停止位。
  6. 软件会自动解码并显示每个字节的十六进制值。

2.5.3 波形解读要点

波形特征 可能原因 排查方向
TX 线始终为高电平 MCU 未发送数据,或 GPIO 未配置 检查 CubeMX 配置、代码中是否调用发送函数
数据位宽度异常(偏宽或偏窄) 波特率不匹配 检查时钟树配置、HSE 频率、USART 分频系数
停止位缺失或帧错误 波特率误差过大或电气干扰 降低波特率(如 9600)测试,检查接线是否过长
RX 线有波形但解码为乱码 PC 端串口助手参数与 MCU 不一致 核对数据位、校验位、停止位设置
逻辑分析仪捕获的UART波形(发送0x55) 逻辑分析仪捕获的UART波形(发送0x55 = 01010101b) 0 t (µs) 起始位 bit0 bit1 bit2 bit3 bit4 bit5 bit6 bit7 停止位 8.68 µs 0x55 = 0101 0101 每个数据位交替高低电平

2.6 环境验证:发送第一个字节

完成上述所有配置后,我们编写一段最简代码,验证整个链路是否通畅。在 CubeMX 生成的 main.c 的 main() 函数中添加:

/* main.c - 环境验证代码片段 */
#include "main.h"

int main(void)
{
    HAL_Init();
    SystemClock_Config();
    MX_USART1_UART_Init();

    uint8_t tx_data[] = "Hello from STM32!\r\n";

    while (1)
    {
        HAL_UART_Transmit(&huart1, tx_data, sizeof(tx_data) - 1, 1000);
        HAL_Delay(1000);
    }
}

编译下载后,打开 SSCOM 或 Putty,应每隔 1 秒收到一行 Hello from STM32!。同时,逻辑分析仪应捕获到 TX 引脚上周期性的串口波形。

验证清单:
✅ SSCOM/Putty 收到预期字符串 → 串口通信链路正常
✅ 逻辑分析仪解码出 ASCII 字符 'H'(0x48), 'e'(0x65)... → 硬件时序正确
✅ 改变波特率后通信失败 → 确认配置一致性
✅ 拔掉 TX 线后无数据 → 确认物理连接有效