2. 开发环境搭建:安装Keil MDK、STM32CubeMX、串口驱动,配置第一个工程模板
说实话,很多初学者一上来就急着写代码,结果卡在环境搭建上大半天。我见过太多人——包括我自己刚入行时——装完软件发现编译报错、下载器连不上、串口没反应。嗯,这节课咱们就把这些坑提前填上。
开发环境说白了就三样东西:编译器(Keil MDK)、芯片配置工具(STM32CubeMX)、通信桥梁(串口驱动)。下面我按自己的习惯,一步步带你搭好。
2.1 工具链全景图
先看整体关系,心里有个谱:
2.2 安装 Keil MDK-ARM
Keil 是 ARM 生态里最主流的 IDE,没有之一。我这些年做过的项目,十有八九都用它。
2.2.1 下载与安装步骤
- 去官网下载:搜索 "Keil MDK-ARM Download",找到最新版本。目前稳定版是 MDK v5.38 左右。
- 运行安装包:双击 .exe,一路 Next。注意安装路径不要有中文,我习惯放
C:\Keil_v5。 - 安装器件包:Keil 本身不带芯片支持包。你需要单独安装 STM32F1xx_DFP(F1系列)或对应型号的 Pack。
2.2.2 注册与破解
嗯,这里说点实在的。Keil 是收费软件,但官方提供了 32KB 代码限制的免费版。对于咱们物联网项目,32KB 肯定不够用。你需要购买 License 或者……你懂的。
2.3 安装 STM32CubeMX
CubeMX 是 ST 官方出的图形化配置工具。说白了,你点点鼠标,它就能生成初始化代码。省去你手写寄存器配置的麻烦。
2.3.1 下载与安装
- 去 ST 官网搜索 "STM32CubeMX",下载最新版。
- 安装需要 Java 运行环境(JRE)。如果电脑没有,安装包会提示你下载。
- 安装完成后,打开 CubeMX,它会自动检查并更新固件包。
关键点: CubeMX 生成的代码基于 HAL 库(硬件抽象层)。HAL 库的好处是移植性好,坏处是代码量偏大。不过对于物联网项目,这点开销可以忽略。
2.4 安装串口驱动
串口是嵌入式开发者的「眼睛」。没有它,你连单片机在干什么都不知道。
2.4.1 常见 USB 转串口芯片
| 芯片型号 | 驱动名称 | 常见开发板 |
|---|---|---|
| CH340G | CH340 驱动 | 大部分国产 STM32 最小系统板 |
| CP2102 | CP210x 驱动 | 正点原子、野火部分板子 |
| FT232RL | FTDI 驱动 | 高端调试器、官方开发板 |
| PL2303 | PL2303 驱动 | 老款开发板 |
怎么看你的板子用哪个芯片?看板子上 USB 口附近那个小芯片的丝印。我遇到过好几次,学生拿着板子说串口连不上,结果一看是 CH340 没装驱动。
2.4.2 安装与验证
- 根据芯片型号下载对应驱动。
- 插上开发板,打开设备管理器。如果看到黄色感叹号,说明驱动没装好。
- 右键更新驱动,选择你下载的驱动文件夹。
- 安装成功后,设备管理器会出现 COM 端口,比如 COM3、COM5。
2.5 配置第一个工程模板
好,工具都装齐了。咱们来创建第一个工程。目标是:让 STM32 的 LED 闪烁,并通过串口打印 "Hello World"。
2.5.1 用 CubeMX 生成初始化代码
- 打开 CubeMX,点击 New Project。
- 选择你的芯片型号。比如 STM32F103C8T6(蓝色 pill 板常用)。
- 在 Pinout 界面配置:
- RCC:HSE 选择 Crystal/Ceramic Resonator。
- SYS:Debug 选择 Serial Wire(否则下载一次后芯片就锁死了)。
- USART1:Mode 选 Asynchronous,波特率 115200。
- GPIO:找一个空闲引脚,比如 PC13,设为 Output。
- 点击 Project Manager,设置工程名和路径。Toolchain / IDE 选 MDK-ARM。
- 点击 GENERATE CODE,生成代码。
main.c 中的初始化部分。否则下次重新生成时,你的修改会被覆盖。正确的做法是:在 /* USER CODE BEGIN */ 和 /* USER CODE END */ 之间写你自己的代码。
2.5.2 在 Keil 中编译与下载
- 双击生成的
.uvprojx文件,用 Keil 打开工程。 - 点击 Build 按钮(或按 F7),编译工程。第一次编译会慢一些,因为要编译 HAL 库。
- 连接 ST-Link 或 J-Link 调试器到开发板。
- 点击 Download 按钮(或按 F8),下载固件。
2.5.3 添加用户代码
在 main.c 的 /* USER CODE BEGIN 2 */ 后面,添加串口打印代码:
/* USER CODE BEGIN 2 */
HAL_UART_Transmit(&huart1, (uint8_t *)"Hello World!\r\n", 15, 1000);
/* USER CODE END 2 */
在 /* USER CODE BEGIN WHILE */ 后面,添加 LED 闪烁代码:
/* USER CODE BEGIN WHILE */
while (1)
{
HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_13);
HAL_Delay(500);
/* USER CODE END WHILE */
2.5.4 验证结果
- 打开串口助手,选择对应的 COM 口,波特率 115200。
- 复位开发板,你应该能看到 "Hello World!" 每隔 500ms 打印一次。
- 同时,板子上的 LED 会以 1Hz 的频率闪烁。
模板的意义: 这个工程模板以后会反复使用。每次新项目,我都直接复制这个模板,然后改 CubeMX 配置。省去每次重新搭建环境的麻烦。
2.6 常见问题与解决
| 问题现象 | 可能原因 | 解决办法 |
|---|---|---|
| 编译报错 "Error: L6218E: Undefined symbol" | HAL 库文件未添加到工程 | 检查 CubeMX 生成的 .c 文件是否全部加入 Keil 工程 |
| 下载失败 "Flash Download failed" | 调试器驱动问题或接线错误 | 检查 SWD 接口的 SWCLK、SWDIO、GND 是否接对 |
| 串口输出乱码 | 波特率不匹配或晶振频率设置错误 | 核对 CubeMX 中 HSE 频率与实际板子晶振一致 |
| 芯片锁死,无法再次下载 | Debug 引脚被复用为 GPIO | 按住复位键点击下载,或使用串口 ISP 擦除 |
嗯,环境搭建这部分就到这里。工具链顺了,后面写代码才痛快。记住:模板工程是你的起点,别嫌麻烦,一次配好,后面省心。