STM32裸机UART从轮询到中断驱动开发实战 - 第4节
4.1 本章目标与学习路径
本章将引导你使用 STM32CubeMX 图形化配置工具,快速生成一个基于 USART1 轮询模式 的 Keil 工程。通过本章学习,你将掌握从 MCU 选型、时钟树配置到串口参数设置的完整流程,为后续的中断驱动开发打下坚实基础。
学习提示:轮询模式是 UART 通信的基础,虽然效率较低,但逻辑简单、易于调试,非常适合初学者理解串口收发的基本原理。
4.2 使用 CubeMX 选择 MCU 与创建工程
4.2.1 启动 CubeMX 与 MCU 选择
- 打开 STM32CubeMX 软件,点击 “New Project” 或选择菜单栏 File → New Project。
- 在 “Part Number Search” 选项卡中,输入你使用的具体型号,例如
STM32F103C8T6。 - 在搜索结果列表中选中该型号,点击右上角 “Start Project”。
选型建议:本课程以 STM32F103C8T6(蓝色 pill 板)为例,该芯片拥有 64KB Flash、20KB SRAM,内置 3 路 USART,非常适合入门学习。如果你使用其他型号,请确保其至少包含一个 USART 外设。
4.2.2 工程创建后的初始界面
成功创建工程后,你将进入 “Pinout & Configuration” 视图。左侧是外设列表(Categories),右侧是芯片引脚图。此时,所有外设默认处于禁用状态。
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 的时钟源频率。
4.4 使能 USART1 并配置参数
4.4.1 在 Pinout & Configuration 中配置
- 切换回 “Pinout & Configuration” 视图。
- 在左侧 Categories 列表中,展开 Connectivity,点击 USART1。
- 在右侧出现的配置面板中,勾选 “Activated” 使能 USART1。
- 在 “Mode” 区块中,将 “Mode” 设置为 “Asynchronous”(异步模式)。
- 观察芯片引脚图,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%)。
4.5 生成 Keil 工程代码
4.5.1 工程设置
- 点击菜单栏 Project → Settings,或直接点击工具栏的 “Project Settings” 图标。
- 在 “Project” 选项卡中:
- Project Name: 输入工程名称,例如
UART_Polling_Demo。 - Project Location: 选择工程保存路径。
- Toolchain / IDE: 选择 MDK-ARM V5(Keil uVision5)。
- Project Name: 输入工程名称,例如
- 在 “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 工程,并验证了初始化代码的正确性。