2、开发环境搭建:Keil MDK安装与配置、STM32CubeMX生成初始化代码、串口驱动安装与调试
好,咱们正式开始动手了。这一章我带你搭好开发环境。说实话,环境搭建这事儿,看着简单,但坑不少。我见过太多新手卡在这一步,一卡就是半天。咱们稳一点,一步步来。
2.1 Keil MDK 安装与配置
Keil MDK,说白了就是我们写代码、编译、下载的“大本营”。我个人习惯用 MDK 5.38 版本,太新的版本有时候对老芯片支持不好,太旧的又缺功能。
2.1.1 安装步骤
- 下载安装包:去 Keil 官网下 MDK-ARM。注意别下成 C51 版本,那是给 51 单片机用的。
- 运行安装:一路 Next 就行。安装路径我建议别带中文,也别有空格。比如
D:\Keil_v5,干净利落。 - 激活 License:安装完会弹出一个 License Management 窗口。你需要一个 License ID Code(正版或教育版)。填进去,点 Add LIC。嗯,这里要注意,如果提示“Invalid License”,多半是版本不对应。
- 安装芯片包:Keil 本身不带芯片支持包。你得去 Pack Installer 里装。比如咱们用 STM32F103,就搜“STM32F1”,点 Install。我曾经有一次忘了装包,编译时一堆“device not found”错误,折腾了半天才发现。
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”。这样下载完程序自动复位运行,省得你每次手动按复位键。
2.2 STM32CubeMX 生成初始化代码
STM32CubeMX 是个图形化工具。你点点鼠标,它就能帮你生成初始化代码。说白了,就是帮你把那些繁琐的时钟配置、GPIO 设置、外设初始化全干了。你想想看,要是手写这些寄存器,得翻多少页数据手册?
2.2.1 新建工程
- 打开 CubeMX,点“New Project”。
- 在 Board Selector 里搜“STM32F103C8”,选好后双击。
- 系统会问你要不要初始化所有外设。点“Yes”,省事。
2.2.2 配置时钟
时钟是芯片的心脏。配错了,整个系统跑不起来。我建议你直接用 CubeMX 的 Clock Configuration 页面:
- HCLK 填 72 MHz(F103 的最高主频)。
- 点回车,软件会自动帮你算好 PLL 分频系数。
- 如果出现红色警告,说明时钟树有冲突。别慌,看看提示,一般是某个分频器值不对。
2.2.3 配置串口
咱们后面调试要用串口打印信息。配置很简单:
- Pinout & Configuration 页面,点 USART1。
- Mode 选 Asynchronous(异步模式)。
- Baud Rate 填 115200。这个速度够快,也稳定。
- 其他参数默认: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,等几秒。代码就生成了。
2.3 串口驱动安装与调试
串口是嵌入式开发者的“眼睛”。没有它,你根本不知道芯片内部在干什么。我刚开始学的时候,全靠串口打印来调试。
2.3.1 安装串口驱动
咱们用的 ST-Link 调试器自带虚拟串口。插上 USB 后,电脑会识别到一个新的 COM 口。如果没识别,多半是驱动没装:
- 去 ST 官网搜“ST-Link driver”,下载安装。
- 或者用驱动精灵之类的工具自动安装。
- 装好后,在设备管理器里能看到“STMicroelectronics STLink Virtual COM Port”。记下 COM 号,比如 COM3。
2.3.2 串口调试助手
推荐用 SSCOM 或者 Putty。我个人习惯用 SSCOM,界面简单:
- 打开 SSCOM,选对 COM 口(比如 COM3)。
- 波特率设 115200,数据位 8,停止位 1,无校验。
- 点“打开串口”。
如果一切正常,你会在接收区看到芯片发来的数据。如果没反应,别急,先检查接线: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 来打印调试信息了。
2.4 本章小结
到这,你的开发环境就搭好了。Keil 能编译下载,CubeMX 能生成代码,串口能打印信息。这三样东西,后面每一章都会用到。嗯,我建议你把 CubeMX 生成的工程备份一份,万一改乱了,还能回退。
下一章,咱们开始写真正的售货机逻辑——按键扫描和状态机。那才是核心。