第1章:开发环境搭建

做嵌入式开发,第一步就是搭环境。这事儿看着简单,但我在带团队时发现,很多人卡就卡在环境配置上。今天咱们就把Keil、IAR、STM32CubeIDE这三个主流IDE,还有调试器、版本管理这些事儿,一次性说清楚。

1.1 IDE的选择与配置

先说IDE。我个人习惯是:项目初期用STM32CubeIDE做快速原型验证,量产阶段切到Keil或IAR。为什么?因为CubeIDE免费,但编译优化和调试体验,说实话,跟商业版还是有差距。

Keil MDK配置要点

Keil是老牌工具了。我建议你装5.38以上版本,对Cortex-M4/M7支持更好。安装时注意:

  • 勾选「C51」和「ARM」两个编译器套件
  • Device Database一定要更新到最新
  • Pack Installer里把STM32F4/F7/H7系列都装上

嗯,这里有个坑。我曾经在项目中期发现Keil编译报错,查了半天,原来是Pack版本跟芯片不匹配。所以建议你装完立刻用Pack Installer更新所有包。

IAR Embedded Workbench配置

IAR的编译器优化做得确实好。同样的代码,IAR能比Keil多优化10%-15%的代码尺寸。配置时注意:

  • License选「Full」模式,别选「Evaluation」
  • Toolchain选ARM 8.50以上版本
  • Project -> Options -> C/C++ Compiler -> Optimizations 里,我一般选「High - Balanced」
小技巧:IAR的代码压缩率比Keil高,但调试信息不如Keil丰富。如果你在调试阶段,建议先用Keil,最后切IAR做release版本。

STM32CubeIDE配置

这个IDE是ST官方出的,免费且集成CubeMX。配置很简单:

  • 从ST官网下载最新版,目前是1.15.0
  • 安装时选「STM32CubeIDE + CubeMX」完整包
  • Workspace路径别用中文,别问我为什么知道

说实话,CubeIDE的代码生成功能确实方便。但要注意,它生成的HAL库代码有时会带一些冗余初始化。我一般会手动删掉没用的外设配置,能省下不少Flash空间。

1.2 编译器优化选项

编译器优化,说白了就是让代码跑得更快或者更小。但优化不是免费的,它可能引入bug。我见过有人开了-O3优化,结果程序跑飞了,查了三天才发现是优化把某个volatile变量给优化掉了。

优化级别 说明 适用场景
-O0 不优化,调试最方便 开发调试阶段
-O1 基本优化,代码尺寸略减 功能验证阶段
-O2 较高优化,性能提升明显 性能敏感场景
-Os 侧重代码尺寸优化 Flash空间紧张时
-O3 激进优化,可能有风险 慎用,需充分测试

我个人建议:血糖仪这种医疗设备,用-Os就够了。为什么?因为血糖仪的算法不算复杂,但Flash空间往往很紧张。我曾经在一个项目里,用-Os比-O2省了8KB的Flash,刚好够塞进一个OTA升级模块。

警告:千万不要在release版本里用-O0。我见过有人把-O0的固件直接量产了,结果设备响应慢得像蜗牛。血糖仪测一次要等5秒,患者不投诉才怪。

1.3 调试器使用

调试器是嵌入式开发的「眼睛」。J-Link和ST-Link我都用过,说说区别。

J-Link

J-Link是SEGGER家的,稳定性和速度都没得说。配置时注意:

  • 驱动装J-Link Software Pack,别用Windows自动更新的
  • SWD模式比JTAG模式少用两根线,我一般用SWD
  • 速度选4MHz以上,不然调试时卡顿明显

我记得有一次调试一个时序敏感的外设,J-Link的实时数据跟踪(RTT)功能帮了大忙。它能边跑边输出日志,不影响程序执行时序。这个功能在Keil和IAR里都支持。

ST-Link

ST-Link是ST自家的调试器,便宜但功能够用。配置要点:

  • ST-Link固件要更新到最新,V2.J37以上
  • 在CubeIDE里选「ST-Link (OpenOCD)」作为调试器
  • 如果遇到连接失败,先检查驱动,再检查接线
提示:ST-Link的SWO引脚可以输出调试信息,但很多开发板没引出这个引脚。如果你需要SWO功能,记得自己飞一根线。

1.4 版本管理(Git)

Git这东西,说实话,很多嵌入式工程师不重视。但我告诉你,没有Git的项目,迟早要出问题。我曾经接手过一个项目,代码存在U盘里,版本号叫「最终版v3_真的最终版_别改了」。你想想看,这能靠谱吗?

血糖仪项目建议这样用Git:

  • 主分支(main)只放经过评审和测试的代码
  • 开发分支(develop)放日常开发代码
  • 功能分支(feature/xxx)开发新功能
  • 修复分支(hotfix/xxx)修紧急bug

具体操作上,我建议:

# 初始化仓库
git init
git add .
git commit -m "初始提交:STM32CubeMX生成的工程框架"

# 创建开发分支
git checkout -b develop

# 开发新功能
git checkout -b feature/adc-calibration
# ... 写代码 ...
git add .
git commit -m "完成ADC校准功能,误差小于1%"
git checkout develop
git merge feature/adc-calibration

# 发布版本
git checkout main
git merge develop
git tag v1.0.0

嗯,这里要注意。Git的.gitignore文件一定要配好。我见过有人把编译生成的.o文件和.bin文件都提交到仓库里,结果仓库越来越大,克隆一次要等半天。血糖仪项目的.gitignore至少应该忽略:

  • build/ 目录
  • *.o, *.d, *.hex, *.bin 等编译产物
  • IDE的临时文件(如Keil的*.uvguix.*)
  • CubeMX生成的临时文件
核心要点:开发环境搭建不是一次性的工作。随着项目推进,你可能需要调整编译器选项、更新调试器固件、优化Git分支策略。保持环境整洁,就是保持代码质量的第一步。

好了,这一章的内容就这些。下一章咱们聊聊血糖仪的系统架构设计,那才是真正有意思的部分。