第二章 开发环境搭建:Keil/IAR/ESP-IDF环境配置、调试器使用与Git入门

说实话,做嵌入式开发这么多年,我见过太多人卡在环境搭建这一步。工具链没配好,后面全是坑。这一章,咱们就把这些基础打扎实。

2.1 Keil MDK 环境配置

Keil 这玩意儿,在 ARM 内核的单片机开发里,算是老大哥了。点钞机的主控芯片,很多用的就是 STM32 系列,Keil 自然跑不掉。

安装步骤其实不复杂:

  • 去官网下载 MDK-ARM 安装包。注意版本,我建议用 5.38 或更新的,别用太老的。
  • 安装路径别带中文。我见过有人装到「桌面」或者「程序文件」里,结果编译报错,查了半天。
  • 装完后,记得安装对应芯片的 Pack 包。比如 STM32F4 系列,就去 Pack Installer 里搜。
我的小习惯: 我会把工程目录和 Keil 安装目录分开。工程放 D 盘,Keil 放 C 盘默认路径。这样重装系统时,工程不会丢。

工程配置要点:

  • 选择正确的芯片型号。点钞机常用 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,不然变量值看不到。
我曾经踩过的坑: IAR 的浮点运算库默认是软件模拟的。点钞机要处理大量纸币图像数据,浮点运算很多。记得在工程选项里开启硬件浮点单元(FPU),不然速度慢得你想哭。

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-LinkST-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
我的习惯: 每次提交前,我会用 git diff 看看改了哪些内容。别一股脑全提交。提交信息要写清楚,比如「修复了纸币计数时传感器抖动导致的误判」。这样三个月后回头看,还能知道当时改了啥。

远程仓库:

  • 公司一般用 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 环境、编译器、调试器、芯片都正常。如果不行,按这个顺序排查:

  1. 检查调试器连接。灯亮了吗?驱动装了吗?
  2. 检查工程配置。芯片型号对吗?时钟配了吗?
  3. 检查代码。有没有语法错误?延时够长吗?
我曾经遇到的情况: 有一次点钞机主板上的 LED 死活不亮。查了半天,发现是板子上的复位电路有问题,芯片一直处于复位状态。用示波器一看,NRST 引脚电压只有 1.2V。所以,环境没问题时,也要怀疑硬件本身。

好了,这一章的内容就这些。环境搭好了,后面咱们才能开始写真正的点钞机固件。下一章,我会讲点钞机的硬件架构和主控芯片选型,到时候咱们再细聊。