第3章:开发环境搭建

好,咱们直接进入正题。这一章我要带你亲手把开发环境搭起来。你想想看,写Bootloader就像盖房子,脚手架都没搭好,怎么干活?

我见过太多新手,代码写得挺溜,结果卡在环境配置上。嗯,咱们今天就把这事一次性搞定。

3.1 Keil MDK安装与配置

Keil MDK,说白了就是ARM芯片的“御用”IDE。我个人习惯用5.38版本,稳定,坑少。

安装步骤:

  1. 去官网下载MDK-ARM安装包。记得选带Cortex-M4支持的版本。
  2. 双击安装,一路Next。但注意——安装路径不要有中文。我吃过这个亏,编译报错查了半天,最后发现是路径里有“项目”两个字。
  3. 安装完成后,打开Keil,点 Pack Installer。搜索你的芯片型号,比如STM32F407,把对应的Device Family Pack装上。
⚠️ 注意: 如果你用的是盗版License,编译超过32KB代码会报错。做Bootloader一般不会超,但万一呢?建议买个正版,或者用社区版。

配置方面,我建议你做两件事:

  • 编码格式设为UTF-8:在Edit → Configuration → Editor → Encoding里改。不然中文注释会乱码。
  • 开启语法高亮:默认就开了,但如果你发现代码全是黑白,去View → Source Browser里检查一下。

3.2 J-Link调试器设置

J-Link是我最信任的调试器,没有之一。我在项目中用过ST-Link、DAP-Link,最后还是回到J-Link。为什么?稳定,速度快,而且支持虚拟串口。

硬件连接:

J-Link引脚 目标板引脚 说明
VTref 3.3V 参考电压,必须接
GND GND 共地,不接没法玩
SWDIO PA13 数据线
SWCLK PA14 时钟线
💡 小技巧: 如果你用的是SWD模式(推荐),只需要4根线。JTAG要5根,而且占引脚多。做Bootloader时,引脚资源很宝贵,能省则省。

驱动安装:

去SEGGER官网下载J-Link驱动。安装后,插上J-Link,设备管理器里应该能看到“J-Link driver”。如果显示黄色感叹号,手动更新驱动,选SEGGER目录下的驱动文件。

我曾经遇到一个坑:J-Link插上后电脑没反应。折腾半天,发现是USB线的问题——那根线只能充电,不能传数据。嗯,换根好点的USB线吧。

3.3 工程模板创建

这一步很关键。一个好的模板,能让你少写一半的重复代码。我个人习惯把模板分成三层:

  • 硬件抽象层(HAL):封装芯片外设操作,比如GPIO、UART、Flash。
  • 中间层:Bootloader的核心逻辑,比如跳转、校验、升级协议。
  • 应用层:用户接口,比如串口命令解析、LED指示。

创建步骤:

  1. 打开Keil,点Project → New μVision Project。选好芯片型号。
  2. 在工程目录下建好文件夹:HALMiddleAppStartup
  3. 把启动文件(startup_stm32f407xx.s)和链接脚本(.ld文件)放到Startup文件夹。
  4. 在Keil里添加这些文件夹到工程组(Group)。
🔑 核心配置:
// 在Options for Target → C/C++里添加:
// 宏定义:USE_STDPERIPH_DRIVER, STM32F40_41xxx
// 头文件路径:./HAL, ./Middle, ./App, ./Startup

这里有个细节:链接脚本要改。默认的脚本把整个Flash都给了应用程序。但Bootloader需要占用前面一部分空间。我一般这样改:

/* 修改链接脚本,为Bootloader预留空间 */
FLASH (rx) : ORIGIN = 0x08000000, LENGTH = 32K  /* Bootloader占32KB */
RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 128K

为什么是32KB?因为我们的Bootloader功能简单,32KB绰绰有余。如果你要加加密、压缩等功能,可以留64KB。

3.4 编译与烧录验证

模板建好了,咱们写个最简单的程序验证一下——点个LED,顺便打印一句话。

int main(void)
{
    HAL_Init();          // 初始化HAL库
    SystemClock_Config(); // 配置系统时钟,168MHz
    UART_Init();         // 初始化串口,115200波特率
    GPIO_Init();         // 初始化LED引脚

    printf("Bootloader Start...\r\n");

    while(1)
    {
        GPIO_Toggle(LED_PIN);
        Delay(500);      // 延时500ms
        printf("Heartbeat...\r\n");
    }
}

编译:点一下Build按钮(或者按F7)。如果没报错,恭喜你,环境没问题。如果报错,99%是头文件路径没配好,或者芯片型号选错了。

烧录:

  1. 点Flash → Download。或者用工具栏上的“Download”按钮。
  2. 如果弹出“J-Link connection”窗口,选SWD模式,速度设成4MHz(别太高,容易不稳定)。
  3. 烧录成功后,按复位键,看LED是不是在闪。用串口助手看有没有打印信息。
⚠️ 常见问题:
  • 烧录失败,提示“No Cortex-M SW Device Found”:检查接线,特别是VTref和GND。我遇到过VTref没接,折腾了半小时。
  • 烧录成功但程序不跑:检查启动文件里的堆栈设置。默认的堆栈大小可能不够,改成0x400试试。
  • 串口打印乱码:波特率不对。确认你的串口助手和代码里设置的是不是一致。

嗯,到这里,你的开发环境就搭好了。模板也有了,验证也通过了。下一章,咱们开始写真正的Bootloader代码——从Flash分区开始。

📌 本章小结:
  • Keil MDK安装时注意路径无中文,Pack要装对。
  • J-Link用SWD模式,4根线搞定。
  • 工程模板分三层:HAL、Middle、App。
  • 链接脚本要改,给Bootloader预留32KB空间。
  • 编译烧录验证,LED闪+串口打印,证明环境OK。

如果你在搭建过程中遇到问题,别急。我当年第一次搭环境,从下午搞到凌晨两点。后来发现只是少装了一个驱动。嗯,这种事,经历一次就记住了。