STM32裸机UART从轮询到中断驱动开发实战 - 第4节

4.1 本章目标与学习路径

本章将引导你使用 STM32CubeMX 图形化配置工具,快速生成一个基于 USART1 轮询模式 的 Keil 工程。通过本章学习,你将掌握从 MCU 选型、时钟树配置到串口参数设置的完整流程,为后续的中断驱动开发打下坚实基础。

学习提示:轮询模式是 UART 通信的基础,虽然效率较低,但逻辑简单、易于调试,非常适合初学者理解串口收发的基本原理。

4.2 使用 CubeMX 选择 MCU 与创建工程

4.2.1 启动 CubeMX 与 MCU 选择

  1. 打开 STM32CubeMX 软件,点击 “New Project” 或选择菜单栏 File → New Project。
  2. 在 “Part Number Search” 选项卡中,输入你使用的具体型号,例如 STM32F103C8T6。
  3. 在搜索结果列表中选中该型号,点击右上角 “Start Project”。
选型建议:本课程以 STM32F103C8T6(蓝色 pill 板)为例,该芯片拥有 64KB Flash、20KB SRAM,内置 3 路 USART,非常适合入门学习。如果你使用其他型号,请确保其至少包含一个 USART 外设。

4.2.2 工程创建后的初始界面

成功创建工程后,你将进入 “Pinout & Configuration” 视图。左侧是外设列表(Categories),右侧是芯片引脚图。此时,所有外设默认处于禁用状态。

STM32CubeMX 初始界面结构 外设列表 (Categories) ▶ Timers ▶ Connectivity └ USART1 ▶ System Core ▶ Analog ▶ Computing 芯片引脚视图 (LQFP48) STM32F103C8T6 PA9 (USART1_TX) PA10 (USART1_RX) 其他 GPIO 电源/地 提示:在引脚图上直接点击即可配置对应引脚的功能

4.3 配置系统时钟(HSE + PLL)

正确的时钟配置是 UART 通信的基础。USART 的波特率发生器依赖于系统时钟(APB 总线时钟),因此我们需要先配置好时钟树。

4.3.1 切换到 Clock Configuration 视图

点击顶部选项卡 “Clock Configuration”,进入时钟树配置界面。默认情况下,系统使用 HSI(内部高速振荡器,8MHz)。

4.3.2 配置步骤

步骤 操作 说明
1 选择 HSE 时钟源 在 HSE 下拉菜单中选择 Crystal/Ceramic Resonator(外部晶振)
2 配置 PLL 倍频 设置 PLL Source 为 HSE,PLL Mul 为 x9(8MHz × 9 = 72MHz)
3 设置系统时钟源 在 System Clock Mux 中选择 PLLCLK
4 配置 APB2 分频器 设置 APB2 Prescaler 为 /1(USART1 挂载在 APB2 上,时钟 = 72MHz)
常见错误:如果 APB2 分频器设置不当(例如设置为 /2),USART1 的时钟将变为 36MHz,此时若仍按 72MHz 计算波特率,会导致通信失败。务必在配置后检查 USART1 的时钟源频率。
时钟树配置流程(HSE + PLL → 72MHz) HSE (8MHz) PLL (x9) SYSCLK (72MHz) APB2 (/1) USART1 (72MHz) 关键点:USART1 时钟 = APB2 时钟 = 72MHz 波特率 = 72MHz / (16 × USARTDIV)

4.4 使能 USART1 并配置参数

4.4.1 在 Pinout & Configuration 中配置

  1. 切换回 “Pinout & Configuration” 视图。
  2. 在左侧 Categories 列表中,展开 Connectivity,点击 USART1。
  3. 在右侧出现的配置面板中,勾选 “Activated” 使能 USART1。
  4. 在 “Mode” 区块中,将 “Mode” 设置为 “Asynchronous”(异步模式)。
  5. 观察芯片引脚图,PA9 和 PA10 会自动被配置为 USART1_TX 和 USART1_RX。

4.4.2 参数配置详情

在 “Configuration” 选项卡中,设置以下参数:

参数 设置值 说明
Baud Rate 115200 标准波特率,与上位机终端软件保持一致
Word Length 8 Bits 数据位长度,最常用的标准设置
Parity None 无校验位,简化通信协议
Stop Bits 1 1 个停止位,标准配置
Data Direction Receive and Transmit 使能收发双向
Over Sampling 16 Samples 过采样率,保持默认 16 倍
波特率计算验证:当 USART1 时钟 = 72MHz,过采样率 = 16 时,USARTDIV = 72000000 / (16 × 115200) ≈ 39.0625。CubeMX 会自动计算并设置最接近的整数值,确保误差在允许范围内(通常 < 3%)。
USART1 参数配置面板 Configuration Settings Baud Rate 115200 Word Length 8 Bits Parity None Stop Bits 1 配置要点 • 异步模式 • 收发双向使能 • 过采样 16 倍 • 硬件流控:禁用 • 引脚自动分配

4.5 生成 Keil 工程代码

4.5.1 工程设置

  1. 点击菜单栏 Project → Settings,或直接点击工具栏的 “Project Settings” 图标。
  2. 在 “Project” 选项卡中:
    • Project Name: 输入工程名称,例如 UART_Polling_Demo。
    • Project Location: 选择工程保存路径。
    • Toolchain / IDE: 选择 MDK-ARM V5(Keil uVision5)。
  3. 在 “Code Generator” 选项卡中:
    • 勾选 “Generate peripheral initialization as a pair of .c/.h files per peripheral”(为每个外设生成独立的 .c/.h 文件)。
    • 勾选 “Copy only the necessary library files”(仅复制必要的库文件)。

4.5.2 生成代码

点击工具栏的 “GENERATE CODE” 按钮(或按快捷键 Ctrl + G),CubeMX 将根据你的配置自动生成完整的 Keil 工程。生成完成后,点击 “Open Project” 即可在 Keil uVision 中打开工程。

生成后的文件结构:在 Keil 工程中,你可以在 Application/User 组下找到 usart.c 和 usart.h 文件,其中包含了 USART1 的初始化函数 MX_USART1_UART_Init()。主函数 main.c 中会自动调用该初始化函数。

4.6 验证配置:检查生成的初始化代码

打开 usart.c 文件,找到 MX_USART1_UART_Init() 函数。你应该能看到类似如下的代码:

static void MX_USART1_UART_Init(void)
{
  huart1.Instance = USART1;
  huart1.Init.BaudRate = 115200;
  huart1.Init.WordLength = UART_WORDLENGTH_8B;
  huart1.Init.StopBits = UART_STOPBITS_1;
  huart1.Init.Parity = UART_PARITY_NONE;
  huart1.Init.Mode = UART_MODE_TX_RX;
  huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
  huart1.Init.OverSampling = UART_OVERSAMPLING_16;
  if (HAL_UART_Init(&huart1) != HAL_OK)
  {
    Error_Handler();
  }
}
代码解读:huart1 是 HAL 库定义的 UART 句柄结构体,所有配置参数都通过该结构体传递给 HAL_UART_Init() 函数。如果初始化失败,会调用 Error_Handler() 进入错误处理循环。

4.7 本章小结

通过本章的学习,你已经完成了以下关键步骤:

  • 使用 STM32CubeMX 选择了目标 MCU 并创建了工程。
  • 配置了系统时钟(HSE + PLL),使系统时钟达到 72MHz,并确保 USART1 挂载在 APB2 总线上获得正确时钟。
  • 使能了 USART1,并设置了标准的异步通信参数(115200-8-N-1)。
  • 生成了 Keil 工程,并验证了初始化代码的正确性。