第2章:开发环境搭建 — 工欲善其事,必先利其器
好,咱们正式开始动手了。做嵌入式开发,第一件事就是把家伙事儿备齐。你想想看,一个木匠没有好刨子,一个厨师没有好菜刀,那活儿肯定干不利索。咱们搞共享单车锁控系统也一样,开发环境搭不好,后面调试起来能把你逼疯。
这一章,我就带你一步步把 Keil MDK、Arduino IDE、STM32CubeMX 还有调试器全部搞定。嗯,都是我自己踩过坑之后总结出来的经验,你照着来,能省不少时间。
2.1 Keil MDK 安装与配置
Keil MDK 是 ARM 内核单片机开发的老牌工具了。说实话,它的界面确实有点复古,但稳定性和编译效率没得说。我个人习惯用 MDK 来写 STM32 的项目,尤其是做锁控这种对实时性要求高的产品。
核心要点:Keil MDK 分社区版和专业版。社区版有 32KB 代码限制,咱们做锁控系统完全够用。但如果你要搞更复杂的项目,建议上专业版。
安装步骤
- 去 Keil 官网下载 MDK-ARM 安装包(目前最新是 V5.38)。
- 双击安装,一路 Next。注意安装路径不要有中文。
- 安装完成后,打开 Keil uVision5,点击
Pack Installer图标。 - 在 Pack Installer 里搜索你的芯片型号,比如 STM32F103C8T6,点击 Install。
- 等待下载完成。这一步很关键,没有 Pack 你连工程都建不了。
我的小技巧:Pack Installer 下载速度有时候很慢。我遇到过好几次卡在 99% 不动。这时候别傻等,直接关掉重开,它会断点续传。嗯,这招我屡试不爽。
配置要点
装好之后,咱们得配一下编译器。点击 Project → Options for Target,在 Target 标签页里选择正确的芯片型号。然后在 C/C++ 标签页里,把优化等级设为 -O2。为什么?因为 -O0 编译出来的代码太大,锁控系统那点 Flash 空间,你省着点用。
2.2 Arduino IDE 安装与配置
说到 Arduino IDE,可能有些老工程师会撇嘴。但我得说句公道话,做原型验证的时候,Arduino 的效率是真的高。我在做第一版锁控样机的时候,就是用 Arduino 快速搭了一套逻辑,验证了通信协议没问题,才转到 Keil 做正式产品的。
Arduino IDE 的安装就简单多了,跟装个普通软件一样。
安装步骤
- 从 Arduino 官网下载最新版 IDE(目前是 2.x 版本)。
- 安装完成后,打开 IDE,进入
文件 → 首选项。 - 在
附加开发板管理器网址里,填入 STM32 的支持包地址:https://github.com/stm32duino/BoardManagerFiles/raw/main/package_stmicroelectronics_index.json - 然后进入
工具 → 开发板 → 开发板管理器,搜索STM32,安装 STMicroelectronics 的包。 - 安装完成后,在开发板列表里就能看到
Generic STM32F103C series了。
注意:Arduino IDE 的 STM32 支持包比较大,大概 200MB 左右。下载时确保网络稳定。我曾经在客户现场演示时,因为网络不好,包没下全,结果板子死活连不上。那场面,别提多尴尬了。
2.3 STM32CubeMX 初始化工程
STM32CubeMX 是个好东西。说白了,它就是帮你生成初始化代码的工具。你不需要手动去配寄存器,点点鼠标,时钟树、GPIO、外设就全给你配好了。我刚开始用的时候还不太放心,总觉得它生成的代码不够优化。后来用多了才发现,人家生成的代码比我自己手写的还规范。
创建工程步骤
- 打开 STM32CubeMX,点击
New Project。 - 在
Part Number里输入STM32F103C8,选中后双击。 - 进入
Pinout & Configuration界面,配置你需要的引脚。比如锁控系统需要的 GPIO、UART、SPI 等。 - 进入
Clock Configuration,配置时钟树。咱们一般用外部 8MHz 晶振,倍频到 72MHz。 - 进入
Project Manager,设置工程名称和路径。注意Toolchain / IDE要选MDK-ARM V5。 - 点击
GENERATE CODE,等待生成完成。
经验之谈:生成代码后,别急着关 CubeMX。我建议你先把 .ioc 文件保存好。后面如果发现引脚配错了,或者要加个外设,直接改 .ioc 文件再重新生成就行。不用从头再来。
时钟树配置示例
咱们锁控系统对时序要求比较严格,尤其是和 GPS 模块通信的时候。时钟配不对,串口波特率就会偏,数据就收不到。下面是我常用的配置:
HSE: 8MHz
PLL: x9 (8 * 9 = 72MHz)
APB1: 36MHz (最大)
APB2: 72MHz (最大)
SysTick: 1ms 中断
2.4 J-Link / ST-Link 调试器连接
调试器是嵌入式开发的命根子。没有它,你写代码就跟盲人摸象一样。我个人更偏爱 J-Link,速度快,功能强。但 ST-Link 胜在便宜,而且 STM32 官方支持,也够用。
连接方式
| 调试器 | SWDIO | SWCLK | GND | 3.3V |
|---|---|---|---|---|
| J-Link | Pin 7 | Pin 9 | Pin 4 | Pin 1 |
| ST-Link | Pin 2 | Pin 4 | Pin 3 | Pin 1 |
避坑指南:我曾经有一次,板子怎么都连不上调试器。查了半天,发现是 SWD 引脚被复用成 GPIO 了。嗯,CubeMX 默认不会把 SWD 引脚配成普通 GPIO,但如果你手贱改了,那就麻烦了。解决办法:按住复位键,点击下载,再松开复位。这招叫「侵入式下载」,百试百灵。
Keil 中配置调试器
- 点击
Project → Options for Target → Debug。 - 在
Use下拉框里选择J-LINK / J-TRACE Cortex或ST-Link Debugger。 - 点击
Settings,确认Port选的是SW(不是 JTAG)。 - 点击
Flash Download标签,勾选Reset and Run。这样下载完程序后,板子会自动复位运行。
我的习惯:调试的时候,我会在代码里加一个 LED_Toggle() 函数,每 500ms 翻转一次 GPIO。这样只要看到 LED 在闪,就说明程序跑起来了。比看调试窗口直观多了。
2.5 环境验证
所有东西都装好了,咱们得验证一下。写一个最简单的点灯程序,烧进去看看效果。
// main.c
#include "main.h"
int main(void) {
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
while (1) {
HAL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin);
HAL_Delay(500);
}
}
编译通过,下载成功,LED 开始闪烁。嗯,环境搭建完成。如果这一步卡住了,别慌。先检查驱动有没有装好,再检查接线。90% 的问题都出在这两个地方。
好了,环境搭好了,下一章咱们就开始写锁控系统的核心逻辑了。到时候你会看到,前面这些准备工作有多重要。