2、开发环境搭建:Keil MDK安装与配置、STM32CubeMX生成初始化代码、串口驱动安装与调试

好,咱们正式开始动手了。这一章我带你搭好开发环境。说实话,环境搭建这事儿,看着简单,但坑不少。我见过太多新手卡在这一步,一卡就是半天。咱们稳一点,一步步来。

2.1 Keil MDK 安装与配置

Keil MDK,说白了就是我们写代码、编译、下载的“大本营”。我个人习惯用 MDK 5.38 版本,太新的版本有时候对老芯片支持不好,太旧的又缺功能。

2.1.1 安装步骤

  1. 下载安装包:去 Keil 官网下 MDK-ARM。注意别下成 C51 版本,那是给 51 单片机用的。
  2. 运行安装:一路 Next 就行。安装路径我建议别带中文,也别有空格。比如 D:\Keil_v5,干净利落。
  3. 激活 License:安装完会弹出一个 License Management 窗口。你需要一个 License ID Code(正版或教育版)。填进去,点 Add LIC。嗯,这里要注意,如果提示“Invalid License”,多半是版本不对应。
  4. 安装芯片包:Keil 本身不带芯片支持包。你得去 Pack Installer 里装。比如咱们用 STM32F103,就搜“STM32F1”,点 Install。我曾经有一次忘了装包,编译时一堆“device not found”错误,折腾了半天才发现。
避坑指南:安装路径不要有中文!不要有空格!否则后面编译会报一些莫名其妙的路径错误。我曾经帮一个学员远程调试,他装在“D:\我的工具\Keil”下,结果死活编译不过。改回纯英文路径,一切正常。

2.1.2 配置要点

装好之后,咱们调几个关键设置:

  • 编译器版本:Project → Manage → Project Components → 选 ARM Compiler V6。V5 太老了,V6 编译更快,代码也更小。
  • 调试器设置:Project → Options for Target → Debug → 选 ST-Link Debugger。然后点 Settings,把 SWD 速度调到 4MHz。太快容易掉线,太慢下载像蜗牛。
  • Flash Download:在 Debug 页的 Flash Download 选项卡里,勾选“Reset and Run”。这样下载完程序自动复位运行,省得你每次手动按复位键。
小技巧:我个人习惯把 Keil 的字体调成 Consolas 12号,看着舒服,代码对齐也清晰。在 Edit → Configuration → Colors & Fonts 里改。

2.2 STM32CubeMX 生成初始化代码

STM32CubeMX 是个图形化工具。你点点鼠标,它就能帮你生成初始化代码。说白了,就是帮你把那些繁琐的时钟配置、GPIO 设置、外设初始化全干了。你想想看,要是手写这些寄存器,得翻多少页数据手册?

2.2.1 新建工程

  1. 打开 CubeMX,点“New Project”。
  2. 在 Board Selector 里搜“STM32F103C8”,选好后双击。
  3. 系统会问你要不要初始化所有外设。点“Yes”,省事。

2.2.2 配置时钟

时钟是芯片的心脏。配错了,整个系统跑不起来。我建议你直接用 CubeMX 的 Clock Configuration 页面:

  • HCLK 填 72 MHz(F103 的最高主频)。
  • 点回车,软件会自动帮你算好 PLL 分频系数。
  • 如果出现红色警告,说明时钟树有冲突。别慌,看看提示,一般是某个分频器值不对。
重点:时钟配置完,一定要检查 APB1 和 APB2 的时钟频率。APB1 最高 36MHz,APB2 最高 72MHz。超了的话,外设可能工作不正常。我在项目里遇到过,SPI 通信老是丢数据,查了半天发现是 APB1 时钟超了。

2.2.3 配置串口

咱们后面调试要用串口打印信息。配置很简单:

  1. Pinout & Configuration 页面,点 USART1。
  2. Mode 选 Asynchronous(异步模式)。
  3. Baud Rate 填 115200。这个速度够快,也稳定。
  4. 其他参数默认:8位数据、1位停止位、无校验。

2.2.4 生成代码

点 Project → Generate Code。这里要注意:

  • Toolchain / IDE 选 MDK-ARM V5。
  • 勾选“Generate peripheral initialization as a pair of .c/.h files per peripheral”。这样每个外设单独一个文件,好管理。
  • 点 Generate,等几秒。代码就生成了。
个人经验:生成代码后,别急着关 CubeMX。万一后面要改配置,再打开工程文件(.ioc)修改,重新生成就行。CubeMX 会保留你之前的手写代码(前提是写在特定注释区里)。

2.3 串口驱动安装与调试

串口是嵌入式开发者的“眼睛”。没有它,你根本不知道芯片内部在干什么。我刚开始学的时候,全靠串口打印来调试。

2.3.1 安装串口驱动

咱们用的 ST-Link 调试器自带虚拟串口。插上 USB 后,电脑会识别到一个新的 COM 口。如果没识别,多半是驱动没装:

  • 去 ST 官网搜“ST-Link driver”,下载安装。
  • 或者用驱动精灵之类的工具自动安装。
  • 装好后,在设备管理器里能看到“STMicroelectronics STLink Virtual COM Port”。记下 COM 号,比如 COM3。
注意:有些山寨 ST-Link 的驱动不一样。如果你插上后显示“Unknown device”,那可能是盗版芯片。我建议你买正版 ST-Link V2,也就几十块钱,省心很多。

2.3.2 串口调试助手

推荐用 SSCOM 或者 Putty。我个人习惯用 SSCOM,界面简单:

  1. 打开 SSCOM,选对 COM 口(比如 COM3)。
  2. 波特率设 115200,数据位 8,停止位 1,无校验。
  3. 点“打开串口”。

如果一切正常,你会在接收区看到芯片发来的数据。如果没反应,别急,先检查接线:TX 接 RX,RX 接 TX,GND 接 GND。这个交叉连接我犯过好几次错。

2.3.3 编写测试代码

在 CubeMX 生成的代码里,找到 main.c,在 main() 函数里加几行:

#include "stdio.h"  // 记得加这个头文件

int fputc(int ch, FILE *f) {
    HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xFFFF);
    return ch;
}

int main(void) {
    HAL_Init();
    SystemClock_Config();
    MX_USART1_UART_Init();
    
    while (1) {
        printf("Hello, 自动售货机!\r\n");
        HAL_Delay(1000);  // 延时1秒
    }
}

这段代码实现了 printf 重定向。说白了,就是把 printf 的输出指向串口。这样你就能用 printf 来打印调试信息了。

验证方法:下载程序后,打开串口助手。如果每隔1秒收到一行“Hello, 自动售货机!”,说明串口通了。如果没收到,检查:1) 串口助手波特率对不对;2) 芯片有没有跑起来(看 LED 闪不闪);3) 接线有没有交叉。

2.4 本章小结

到这,你的开发环境就搭好了。Keil 能编译下载,CubeMX 能生成代码,串口能打印信息。这三样东西,后面每一章都会用到。嗯,我建议你把 CubeMX 生成的工程备份一份,万一改乱了,还能回退。

下一章,咱们开始写真正的售货机逻辑——按键扫描和状态机。那才是核心。