第3章:开发环境搭建——Keil MDK安装与配置、J-Link调试器设置、工程模板建立与版本管理

说实话,做点钞机固件开发,环境搭得好不好,直接决定了后面几个月你是在写代码还是在修电脑。我见过太多新手一上来就急着写程序,结果编译报错、下载失败、调试器连不上,折腾半天连个LED都点不亮。嗯,这一章咱们就把地基打牢。

3.1 Keil MDK安装与配置

Keil MDK,说白了就是ARM内核MCU的标配IDE。点钞机主控芯片大多是Cortex-M系列,用Keil最省心。我个人习惯用MDK 5.38版本,稳定,兼容性好。

3.1.1 安装步骤

  1. 下载安装包:去ARM官网或者Keil官网下载MDK-ARM。注意区分32位和64位。
  2. 运行安装程序:一路Next,但安装路径我建议不要有中文和空格。比如 D:\Keil_v5
  3. 激活License:安装完后打开Keil,File → License Management。输入你的License ID Code(正版或教育版)。
  4. 安装器件包:点钞机常用芯片比如STM32F4、GD32F3系列。在Pack Installer里搜索并安装对应的Device Family Pack。
⚠ 注意: 我曾经遇到过安装完Keil后找不到芯片的情况,折腾了半天才发现是Pack没装。Pack Installer一定要联网安装,别偷懒用离线包,版本容易对不上。

3.1.2 编译器配置

Keil默认用的是ARMCC v5,但ARMCC v6(基于LLVM)优化更好。我个人建议用v6,代码密度能小10%左右,对点钞机这种Flash有限的场景很实用。

// 在工程选项里设置:
// Target → ARM Compiler → Use default compiler version (选择v6.x)
// C/C++ → Optimization → Level 2 (-O2)
// 记得勾选 "One ELF Section per Function"

为什么要勾这个?你想想看,点钞机固件里有很多功能模块,如果不分开编译,链接器会把没用到的函数也塞进去,白白浪费Flash空间。我踩过这个坑,后来改过来,固件体积直接少了30%。

3.2 J-Link调试器设置

J-Link是我最信任的调试器,没有之一。点钞机开发中,调试器就是你的眼睛。没有它,你根本不知道程序跑到哪里卡住了。

3.2.1 驱动安装

  1. 下载SEGGER J-Link驱动包(建议用最新版,兼容性好)。
  2. 安装时选择“Install USB Driver for J-Link”。
  3. 插上J-Link,看设备管理器里是否识别为“J-Link driver”。
💡 小技巧: 如果设备管理器里显示黄色感叹号,别慌。手动更新驱动,路径选J-Link安装目录下的 Drivers 文件夹。我每次重装系统后都会遇到这个问题,已经习惯了。

3.2.2 Keil中配置J-Link

打开工程,点击魔术棒图标 → Debug → 选择“J-Link / J-Trace Cortex”。然后点Settings:

参数 推荐值 说明
Port SW SWD模式,只需要两根线,点钞机板子空间小,省引脚
Max Clock 4 MHz 太高容易不稳定,太低下载慢。4MHz是黄金平衡点
Reset SYSRESETREQ 系统复位,比硬件复位更可靠

核心经验: 我曾经在调试一款点钞机时,J-Link死活连不上芯片。查了半天,发现是SWDIO引脚上拉电阻没焊。点钞机主控板设计时,SWDIO和SWCLK一定要加10k上拉电阻到3.3V,否则调试器经常掉线。

3.2.3 常见问题排查

  • 连接失败:检查接线,SWDIO、SWCLK、GND三根线必须接。VCC可以不接,但接了能自动识别目标电压。
  • 下载后不运行:检查复位电路,点钞机常用RC复位,电容值别太大,100nF就够了。
  • 调试时断点失效:优化等级开太高了。调试时建议用-O0,发布时再改回-O2。

3.3 工程模板建立与版本管理

做点钞机固件,不是写一个文件就完事的。你需要管理启动代码、外设驱动、算法库、应用层……没有模板,每次新建工程都从零开始,累死人。我建议花半天时间,建一个通用模板,后面所有项目都基于它改。

3.3.1 工程目录结构

我个人习惯这样组织:

Project_Template/
├── Libraries/          # 芯片固件库(HAL/LL库)
├── Drivers/            # 外设驱动(GPIO、UART、SPI等)
├── Middleware/         # 中间件(FATFS、FreeRTOS等)
├── Application/        # 应用层代码(点钞逻辑、传感器处理)
├── Startup/            # 启动文件(.s文件)
├── Doc/                # 文档
├── Output/             # 编译输出(.hex、.bin)
└── User/               # 用户代码(main.c、中断处理)

为什么这么分?你想想看,点钞机项目迭代很快,今天用STM32F4,明天可能换GD32F3。只要把Libraries和Drivers换掉,Application层基本不用动。这就是模块化的好处。

3.3.2 Keil工程配置模板

新建一个Keil工程,按以下步骤配置:

  1. 选择芯片型号(比如STM32F407VGT6)。
  2. 在Manage Run-Time Environment里勾选需要的组件(CMSIS、Device等)。
  3. 添加源文件分组,对应上面的目录结构。
  4. 配置编译选项:
    • Target:ARM Compiler v6,FPU选Single Precision(点钞机常用浮点运算)。
    • Output:勾选Create HEX File,Select Folder for Objects选Output目录。
    • C/C++:Define预定义宏,比如 STM32F407xx,优化选-O0(调试阶段)。
💡 我的习惯: 配置好后,把整个工程文件夹复制一份,改名为“Template_Backup”。以后每次新建项目,直接复制这个备份,改芯片型号和宏定义就行。省时省力,还不会漏配置。

3.3.3 版本管理——Git入门

没有版本管理的固件开发,就像没有刹车的车。你改了一堆代码,发现点钞机不数钱了,想回退?对不起,没门。我强烈建议用Git,哪怕你一个人开发。

基本操作流程:

# 在工程根目录初始化
git init

# 创建.gitignore文件,忽略Output目录和临时文件
echo "Output/" >> .gitignore
echo "*.o" >> .gitignore
echo "*.d" >> .gitignore

# 添加所有文件并提交
git add .
git commit -m "Initial commit: 点钞机工程模板 v1.0"

# 每次修改后
git add .
git commit -m "修复了XXX问题"
⚠ 避坑指南: 我曾经犯过一个错误——把Keil的临时文件(.crf、.dep等)也提交到了Git仓库。结果每次编译后都有几百个文件变更,根本看不出改了啥。记住,只提交源码和配置文件,编译产物一律忽略。

3.3.4 分支管理策略

点钞机项目通常有多个版本并行开发。我建议这样分:

  • master:稳定发布版,只合入经过测试的代码。
  • develop:日常开发分支,所有新功能先合到这里。
  • feature/xxx:功能分支,比如 feature/uv-sensor
  • hotfix/xxx:紧急修复分支,比如 hotfix/motor-stall

举个例子:你正在开发点钞机的紫外检测功能,就在 feature/uv-sensor 分支上改。改好了,合并到 develop 测试。测试通过,再合并到 master 发布。这样即使新功能出了问题,也不会影响已经在产线上跑的老版本。

3.4 本章小结

环境搭建这事儿,说白了就是磨刀不误砍柴工。Keil装好、J-Link配通、模板建好、Git管好,后面30章的内容你才能顺畅地学下去。我见过太多人卡在第一步,结果课程学了一半就放弃了。嗯,希望你不是那样的人。

下一章,咱们开始写真正的点钞机Bootloader代码——从启动流程开始。准备好了吗?