第3章:开发环境搭建——Keil MDK安装与配置、J-Link调试器设置、工程模板建立与版本管理
说实话,做点钞机固件开发,环境搭得好不好,直接决定了后面几个月你是在写代码还是在修电脑。我见过太多新手一上来就急着写程序,结果编译报错、下载失败、调试器连不上,折腾半天连个LED都点不亮。嗯,这一章咱们就把地基打牢。
3.1 Keil MDK安装与配置
Keil MDK,说白了就是ARM内核MCU的标配IDE。点钞机主控芯片大多是Cortex-M系列,用Keil最省心。我个人习惯用MDK 5.38版本,稳定,兼容性好。
3.1.1 安装步骤
- 下载安装包:去ARM官网或者Keil官网下载MDK-ARM。注意区分32位和64位。
- 运行安装程序:一路Next,但安装路径我建议不要有中文和空格。比如
D:\Keil_v5。 - 激活License:安装完后打开Keil,File → License Management。输入你的License ID Code(正版或教育版)。
- 安装器件包:点钞机常用芯片比如STM32F4、GD32F3系列。在Pack Installer里搜索并安装对应的Device Family Pack。
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 驱动安装
- 下载SEGGER J-Link驱动包(建议用最新版,兼容性好)。
- 安装时选择“Install USB Driver for J-Link”。
- 插上J-Link,看设备管理器里是否识别为“J-Link driver”。
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工程,按以下步骤配置:
- 选择芯片型号(比如STM32F407VGT6)。
- 在Manage Run-Time Environment里勾选需要的组件(CMSIS、Device等)。
- 添加源文件分组,对应上面的目录结构。
- 配置编译选项:
- Target:ARM Compiler v6,FPU选Single Precision(点钞机常用浮点运算)。
- Output:勾选Create HEX File,Select Folder for Objects选Output目录。
- C/C++:Define预定义宏,比如
STM32F407xx,优化选-O0(调试阶段)。
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问题"
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代码——从启动流程开始。准备好了吗?