第2章:开发环境搭建 — 工欲善其事,必先利其器

好,咱们正式开始动手了。做嵌入式开发,第一件事就是把家伙事儿备齐。你想想看,一个木匠没有好刨子,一个厨师没有好菜刀,那活儿肯定干不利索。咱们搞共享单车锁控系统也一样,开发环境搭不好,后面调试起来能把你逼疯。

这一章,我就带你一步步把 Keil MDK、Arduino IDE、STM32CubeMX 还有调试器全部搞定。嗯,都是我自己踩过坑之后总结出来的经验,你照着来,能省不少时间。

2.1 Keil MDK 安装与配置

Keil MDK 是 ARM 内核单片机开发的老牌工具了。说实话,它的界面确实有点复古,但稳定性和编译效率没得说。我个人习惯用 MDK 来写 STM32 的项目,尤其是做锁控这种对实时性要求高的产品。

核心要点:Keil MDK 分社区版和专业版。社区版有 32KB 代码限制,咱们做锁控系统完全够用。但如果你要搞更复杂的项目,建议上专业版。

安装步骤

  1. 去 Keil 官网下载 MDK-ARM 安装包(目前最新是 V5.38)。
  2. 双击安装,一路 Next。注意安装路径不要有中文。
  3. 安装完成后,打开 Keil uVision5,点击 Pack Installer 图标。
  4. 在 Pack Installer 里搜索你的芯片型号,比如 STM32F103C8T6,点击 Install。
  5. 等待下载完成。这一步很关键,没有 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 的安装就简单多了,跟装个普通软件一样。

安装步骤

  1. 从 Arduino 官网下载最新版 IDE(目前是 2.x 版本)。
  2. 安装完成后,打开 IDE,进入 文件 → 首选项
  3. 附加开发板管理器网址 里,填入 STM32 的支持包地址:https://github.com/stm32duino/BoardManagerFiles/raw/main/package_stmicroelectronics_index.json
  4. 然后进入 工具 → 开发板 → 开发板管理器,搜索 STM32,安装 STMicroelectronics 的包。
  5. 安装完成后,在开发板列表里就能看到 Generic STM32F103C series 了。

注意:Arduino IDE 的 STM32 支持包比较大,大概 200MB 左右。下载时确保网络稳定。我曾经在客户现场演示时,因为网络不好,包没下全,结果板子死活连不上。那场面,别提多尴尬了。

2.3 STM32CubeMX 初始化工程

STM32CubeMX 是个好东西。说白了,它就是帮你生成初始化代码的工具。你不需要手动去配寄存器,点点鼠标,时钟树、GPIO、外设就全给你配好了。我刚开始用的时候还不太放心,总觉得它生成的代码不够优化。后来用多了才发现,人家生成的代码比我自己手写的还规范。

创建工程步骤

  1. 打开 STM32CubeMX,点击 New Project
  2. Part Number 里输入 STM32F103C8,选中后双击。
  3. 进入 Pinout & Configuration 界面,配置你需要的引脚。比如锁控系统需要的 GPIO、UART、SPI 等。
  4. 进入 Clock Configuration,配置时钟树。咱们一般用外部 8MHz 晶振,倍频到 72MHz。
  5. 进入 Project Manager,设置工程名称和路径。注意 Toolchain / IDE 要选 MDK-ARM V5
  6. 点击 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 中配置调试器

  1. 点击 Project → Options for Target → Debug
  2. Use 下拉框里选择 J-LINK / J-TRACE CortexST-Link Debugger
  3. 点击 Settings,确认 Port 选的是 SW(不是 JTAG)。
  4. 点击 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% 的问题都出在这两个地方。

好了,环境搭好了,下一章咱们就开始写锁控系统的核心逻辑了。到时候你会看到,前面这些准备工作有多重要。