4、开发环境搭建:Keil/IAR/VS Code + GCC工具链配置、调试器(J-Link/ST-Link)使用、版本控制(Git)入门

好,咱们进入第四讲。说实话,搭建开发环境这件事,看着简单,但坑是真不少。我见过太多新手卡在这一步,工具链没配好,后面写再多代码也跑不起来。今天我就把常用的几种方案掰开揉碎了讲清楚。

4.1 三大IDE的选择:Keil、IAR、VS Code

先说说这三者的定位。你想想看,选工具就像选螺丝刀,没有最好的,只有最顺手的。

4.1.1 Keil MDK

Keil在ARM Cortex-M系列里是绝对的王者。我最早做智能电表项目时,用的就是Keil。它的优点是开箱即用,对STM32、NXP这些主流芯片支持极好。缺点嘛,收费贵,而且界面有点老气。

适用场景: 公司团队协作、产品级开发、需要官方技术支持的项目。

4.1.2 IAR Embedded Workbench

IAR的编译器优化能力很强,生成的代码体积小、效率高。我在做低功耗电表时,用IAR编译的固件比Keil小了将近15%。不过它的操作逻辑和Keil不太一样,刚上手会有点别扭。

我的建议: 如果你对代码体积有极致要求,比如Flash只有64KB,那IAR是首选。

4.1.3 VS Code + GCC

这是目前最流行的组合,免费、轻量、插件丰富。我最近两年基本都在用这套方案。VS Code本身只是个编辑器,配上Cortex-Debug、C/C++扩展、Makefile插件,就能变成一个强大的嵌入式IDE。

注意: VS Code方案需要自己配置编译链和调试器,对新手不太友好。但一旦配好,用起来是真香。

4.2 GCC工具链配置(以ARM GCC为例)

GCC工具链,说白了就是一套编译、链接、生成二进制文件的工具。我习惯用ARM官方的gcc-arm-none-eabi,稳定可靠。

4.2.1 下载与安装

  1. 去ARM官网下载gcc-arm-none-eabi最新版(Windows选.exe,Linux选.tar.bz2)
  2. 安装到无中文路径的目录,比如C:\ARM_GCC
  3. C:\ARM_GCC\bin添加到系统环境变量PATH中

验证是否安装成功,打开命令行输入:

arm-none-eabi-gcc --version

如果能看到版本号,说明配好了。我曾经遇到过一个问题:装完重启电脑后还是提示找不到命令。后来发现是环境变量没生效,手动刷新一下就好了。

4.2.2 编写Makefile

VS Code方案的核心是Makefile。下面是一个最简单的模板:

# 编译器
CC = arm-none-eabi-gcc
# 链接器
LD = arm-none-eabi-ld
# 目标文件名
TARGET = main
# 源文件
SRCS = main.c startup.c
# 编译选项
CFLAGS = -mcpu=cortex-m4 -mthumb -O2 -Wall
# 链接脚本
LDFLAGS = -T stm32f4.ld

all: $(TARGET).bin

$(TARGET).elf: $(SRCS)
    $(CC) $(CFLAGS) $(SRCS) $(LDFLAGS) -o $@

$(TARGET).bin: $(TARGET).elf
    arm-none-eabi-objcopy -O binary $< $@

clean:
    rm -f *.o *.elf *.bin

避坑指南: 我曾经在Makefile里忘了加-mthumb选项,结果编译出来的代码在Cortex-M4上跑不起来。记住,ARM Cortex-M系列只能用Thumb指令集。

4.3 调试器使用:J-Link与ST-Link

调试器是嵌入式开发的「眼睛」。没有它,你只能靠printf猜问题。

4.3.1 J-Link

J-Link是SEGGER公司的产品,速度快、功能强。我手头有个J-Link EDU Mini,才200多块钱,但调试STM32F4完全够用。

常用操作:

  • 连接目标板: SWD接口只需要4根线(SWDIO、SWCLK、GND、VCC)
  • 下载固件: 用J-Flash工具,选择对应芯片型号,加载.hex或.bin文件
  • 在线调试: 在IDE里配置J-Link作为调试器,设置断点、单步执行

注意: J-Link的盗版很多,我建议买正版。盗版容易出现连接不稳定、固件升级后变砖的问题。我在项目交付前一周遇到过盗版J-Link突然罢工,差点耽误工期。

4.3.2 ST-Link

ST-Link是ST官方调试器,买STM32开发板基本都送。它的优点是便宜、兼容性好,但速度比J-Link慢一些。

在VS Code里配置ST-Link调试:

{
    "version": "0.2.0",
    "configurations": [
        {
            "name": "ST-Link Debug",
            "type": "cortex-debug",
            "request": "launch",
            "servertype": "stlink",
            "device": "STM32F407VG",
            "interface": "swd",
            "executable": "./build/main.elf"
        }
    ]
}

我的经验: ST-Link的V2版本比V1稳定很多。如果你还在用V1,建议升级到V2,连接成功率会高不少。

4.4 版本控制入门:Git

Git这东西,我刚开始做嵌入式时觉得没必要。直到有一次改了一整天代码,发现改坏了想回退,结果没有版本记录...从那以后,我每个项目都必用Git。

4.4.1 基本概念

  • 仓库(Repository): 存放代码的地方
  • 提交(Commit): 保存当前代码的快照
  • 分支(Branch): 独立开发线,互不干扰
  • 远程仓库(Remote): 比如GitHub、GitLab上的仓库

4.4.2 常用命令

# 初始化仓库
git init

# 添加文件到暂存区
git add main.c

# 提交代码
git commit -m "初始化项目,添加主程序"

# 查看状态
git status

# 查看提交历史
git log --oneline

# 创建并切换到新分支
git checkout -b feature/add-uart

# 合并分支
git merge feature/add-uart

避坑指南: 我曾经在提交时忘记写.gitignore文件,结果把编译生成的.o文件和.bin文件都提交上去了。仓库变得又大又乱。建议一开始就加上:

# .gitignore
build/
*.o
*.elf
*.bin
*.hex

4.4.3 团队协作流程

做智能电表这种产品,通常不是一个人开发。我建议用以下流程:

  1. 每个人从main分支创建自己的功能分支
  2. 开发完成后,提交Pull Request(PR)
  3. 代码审查通过后,合并到main分支
  4. 定期从main分支拉取最新代码,避免冲突

记住: 永远不要在main分支上直接修改代码。我见过有人直接在main上改,结果改出bug后整个团队都受影响。

4.5 环境验证:跑一个LED闪烁程序

理论说再多,不如实际跑一遍。下面是一个STM32F4的LED闪烁程序,用来验证你的环境是否搭建成功。

#include "stm32f4xx.h"

void delay(void) {
    for(uint32_t i = 0; i < 500000; i++);
}

int main(void) {
    // 使能GPIOA时钟
    RCC->AHB1ENR |= RCC_AHB1ENR_GPIOAEN;
    // 配置PA5为输出模式
    GPIOA->MODER |= GPIO_MODER_MODER5_0;

    while(1) {
        GPIOA->BSRR = GPIO_BSRR_BS5;  // 点亮LED
        delay();
        GPIOA->BSRR = GPIO_BSRR_BR5;  // 熄灭LED
        delay();
    }
}

编译、下载、运行。如果LED开始闪烁,恭喜你,环境搭建成功了!

最后说一句: 环境搭建是嵌入式开发的第一道坎。别怕麻烦,一次配好,后面能省很多时间。我当年为了配GCC工具链,折腾了整整一个周末。但配好之后,开发效率直接翻倍。

下一讲,我们会开始写真正的电表程序。到时候这些工具都会派上用场。