第二章 开发环境搭建:Keil/IAR/ESP-IDF环境配置、调试器使用与Git入门
说实话,做嵌入式开发这么多年,我见过太多人卡在环境搭建这一步。工具链没配好,后面全是坑。这一章,咱们就把这些基础打扎实。
2.1 Keil MDK 环境配置
Keil 这玩意儿,在 ARM 内核的单片机开发里,算是老大哥了。点钞机的主控芯片,很多用的就是 STM32 系列,Keil 自然跑不掉。
安装步骤其实不复杂:
- 去官网下载 MDK-ARM 安装包。注意版本,我建议用 5.38 或更新的,别用太老的。
- 安装路径别带中文。我见过有人装到「桌面」或者「程序文件」里,结果编译报错,查了半天。
- 装完后,记得安装对应芯片的 Pack 包。比如 STM32F4 系列,就去 Pack Installer 里搜。
工程配置要点:
- 选择正确的芯片型号。点钞机常用 STM32F407 或 F429,别选错了。
- 配置时钟源。外部晶振频率要写对,不然串口波特率全乱套。
- Debug 选项里,选 J-Link 或 ST-Link,后面会细说。
嗯,这里要注意:Keil 的编译速度有时候很慢。我一般会把「Browse Information」关掉,能快不少。
2.2 IAR Embedded Workbench 环境配置
IAR 的编译器优化做得比 Keil 好,代码密度更高。点钞机这种对实时性要求高的设备,我有时候会切到 IAR 来编译。
安装流程:
- 下载 IAR for ARM 版本。注意,IAR 分很多种,别下成 for MSP430 的了。
- 安装时选择完整版,别省那点空间。我吃过亏,少装了组件,结果调试时发现没有仿真功能。
- 破解或激活。这个就不多说了,大家懂的都懂。
工程配置差异:
- IAR 的工程文件是 .ewp 和 .eww,和 Keil 的 .uvprojx 不通用。
- 链接脚本(.icf 文件)要自己配。点钞机的 Flash 和 RAM 分配,我一般会留 20% 的余量。
- 优化等级我通常选 High,但调试时选 None,不然变量值看不到。
2.3 ESP-IDF 环境配置
现在很多点钞机开始用 ESP32 做 Wi-Fi 联网和远程维护。ESP-IDF 是乐鑫官方的开发框架,说实话,比 Keil 和 IAR 复杂一些。
安装方式有两种:
- 离线安装器。下载 esp-idf-tools-setup 包,一键安装。适合新手。
- 手动安装。用 git clone 拉取源码,然后运行 install.sh。我习惯这种方式,因为可以控制版本。
环境变量配置:
# 在终端里执行
export IDF_PATH=~/esp/esp-idf
export PATH=$PATH:$IDF_PATH/tools
# 或者用 idf.py 命令
idf.py set-target esp32
idf.py menuconfig
为什么推荐用命令行?因为点钞机的固件升级脚本,最后也要写成自动化脚本。你想想看,总不能每次都手动点 Keil 的编译按钮吧?
常见问题:
- Python 版本要 3.8 以上。我遇到过有人用 Python 2.7,结果编译报错。
- git 要提前装好。ESP-IDF 依赖子模块,git 拉不下来就全白搭。
- 第一次编译会很慢,因为要下载工具链。喝杯咖啡等吧。
2.4 调试器使用:J-Link 与 ST-Link
调试器就是嵌入式工程师的听诊器。没有它,你根本不知道芯片内部在干什么。
J-Link 使用要点:
- 驱动安装。去 Segger 官网下载 J-Link 驱动,别用盗版,容易掉固件。
- 连接方式。SWD 模式只需要 4 根线:SWDIO、SWCLK、GND、VCC(可选)。
- 速度设置。我一般设 4MHz,太高了容易不稳定。点钞机主板上走线长,信号容易衰减。
ST-Link 使用要点:
- ST-Link 是 ST 官方调试器,便宜但功能少一点。
- 在 Keil 里选 Debug -> ST-Link Debugger,然后 Settings 里确认连接。
- 固件升级。ST-Link 的固件偶尔需要更新,用 ST-Link Utility 工具就行。
调试器对比:
| 特性 | J-Link | ST-Link |
|---|---|---|
| 速度 | 快(最高 50MHz) | 中等(最高 4MHz) |
| 价格 | 贵(几百到上千) | 便宜(几十块) |
| 兼容性 | 支持多种芯片 | 仅限 ST 芯片 |
| 调试功能 | 丰富(RTT、Event Viewer) | 基础 |
我个人建议,公司项目用 J-Link,个人学习用 ST-Link。点钞机量产后的现场维护,我一般用 J-Link 的 RTT 功能,可以实时看日志,不用接串口线。
2.5 版本控制 Git 入门
Git 这东西,说实话,我刚开始做嵌入式时觉得没必要。一个人写代码,要什么版本控制?直到有一次,我改了一个驱动,结果点钞机计数全乱了,想回退却找不到原版……
基本操作:
# 初始化仓库
git init
# 添加文件
git add main.c
git add . # 添加所有文件
# 提交
git commit -m "初始化点钞机主程序"
# 查看状态
git status
# 查看历史
git log --oneline
分支管理:
- master 分支:放稳定版本。点钞机出货的固件,必须从 master 分支编译。
- develop 分支:日常开发用。新功能在这里测试。
- feature 分支:每个新功能单独开一个分支。比如「feature/纸币识别算法优化」。
.gitignore 文件:
# 忽略编译中间文件
*.o
*.hex
*.bin
*.map
# 忽略 IDE 配置文件
*.uvguix.*
*.eww
Debug/
Release/
# 忽略个人设置
*.user
*.settings
远程仓库:
- 公司一般用 GitLab 或 Gitee。个人项目用 GitHub。
- 推送命令:git push origin master
- 拉取命令:git pull origin master
你想想看,点钞机的固件可能有几十个版本,每个版本对应不同的纸币识别算法。没有 Git,你怎么管理?我曾经见过有人用「最终版 v3.2 再也不改版」这种文件名,结果第二天又改了一版……
2.6 环境验证与常见问题
环境搭好了,怎么验证?我一般写个最简单的 LED 闪烁程序。
// 点钞机主控板 LED 测试
#include "stm32f4xx.h"
void delay(volatile uint32_t count) {
while(count--);
}
int main(void) {
RCC->AHB1ENR |= RCC_AHB1ENR_GPIODEN; // 使能 GPIOD 时钟
GPIOD->MODER |= GPIO_MODER_MODER12_0; // PD12 设为输出
while(1) {
GPIOD->ODR ^= GPIO_ODR_OD12; // 翻转 LED
delay(500000);
}
}
如果 LED 能闪烁,说明 Keil 环境、编译器、调试器、芯片都正常。如果不行,按这个顺序排查:
- 检查调试器连接。灯亮了吗?驱动装了吗?
- 检查工程配置。芯片型号对吗?时钟配了吗?
- 检查代码。有没有语法错误?延时够长吗?
好了,这一章的内容就这些。环境搭好了,后面咱们才能开始写真正的点钞机固件。下一章,我会讲点钞机的硬件架构和主控芯片选型,到时候咱们再细聊。