2、开发环境搭建:Keil MDK / IAR 安装与配置、STM32CubeMX 初始化工程、J-Link / ST-Link 调试器连接

好,咱们直接进入正题。做嵌入式开发,第一件事就是把家伙事儿备齐。环境搭不好,后面全是坑。我见过太多新手卡在第一步,连个灯都点不亮,其实不是代码问题,是环境没配明白。

这一章,我带你走一遍完整的流程。从IDE安装,到CubeMX生成工程,再到调试器连上板子。每一步我都会说说我自己的习惯,还有踩过的坑。

2.1 选择你的武器:Keil MDK 还是 IAR?

说实话,这两款IDE我都用了很多年。没有绝对的好坏,看你的项目需求和个人习惯。

  • Keil MDK:ARM官方亲儿子,生态最全。我最早做STM32F1系列时,用的就是Keil。它的编译器是ARMCC,优化效果不错。缺点嘛,工程文件管理有点乱,而且收费不便宜。
  • IAR Embedded Workbench:编译效率高,代码密度小。我有个项目对Flash空间卡得很死,换IAR编译后,直接省了15%的空间。但它的界面风格比较老派,新手可能不太适应。
我的建议:如果你刚入门,或者公司团队都用Keil,那就选Keil。如果你追求极致性能,或者做量产项目,IAR值得一试。我个人现在两个都装,哪个顺手用哪个。

2.2 Keil MDK 安装与配置

安装过程其实很简单,但有几个关键点要注意。

2.2.1 安装步骤

  1. 去ARM官网下载MDK-ARM安装包。注意版本,我建议用5.38或更新的版本,对Cortex-M4/M7支持更好。
  2. 双击安装,一路Next。但安装路径不要有中文!我见过有人装在“D:\开发工具\Keil_v5”,结果编译报错,折腾半天才发现是路径问题。
  3. 安装完成后,打开Keil,点击 Pack Installer。这里要安装你芯片对应的Device Family Pack。比如STM32F4系列,就搜“STM32F4xx_DFP”。
注意:Pack版本要和你的芯片匹配。我曾经用F4的Pack去编译F1的工程,结果一堆未定义错误。嗯,别犯这种低级错误。

2.2.2 配置技巧

装好后,我习惯先做几件事:

  • 设置编码为UTF-8:在 Edit -> Configuration -> Editor -> Encoding 里选UTF-8。不然中文注释会乱码。
  • 开启语法高亮和自动补全:默认是开的,但如果你发现没有,去 Configuration -> Text Completion 里勾上。
  • 配置Flash下载算法:在工程选项的 Debug -> Settings -> Flash Download 里,添加你芯片对应的算法文件。比如STM32F407,就选 STM32F4xx Flash

2.3 IAR 安装与配置

IAR的安装和Keil类似,但有几个地方不一样。

2.3.1 安装步骤

  1. 下载IAR for ARM安装包。注意区分版本,EWARM是标准版,EWARM-BL是精简版。我建议用标准版。
  2. 安装时,会提示选择编译器版本。我一般选最新版,除非项目有特殊要求。
  3. 安装完成后,同样需要安装芯片支持包。IAR叫“Device Support”,在 Tools -> Device Support 里下载。
关键点:IAR的工程文件是.ewp格式,和Keil的.uvprojx不通用。如果你从Keil迁移过来,需要重新建工程。我当年从Keil转IAR时,花了一整天移植代码,想想都头大。

2.3.2 配置技巧

  • 优化等级设置:在 Project -> Options -> C/C++ Compiler -> Optimizations 里。调试阶段用 NoneLow,发布阶段用 High
  • 链接器配置:IAR的链接器脚本是.icf文件。如果你需要自定义内存布局,可以修改这个文件。我有个项目需要把关键数据放在SRAM的特定地址,就是通过改.icf实现的。

2.4 STM32CubeMX 初始化工程

说实话,现在做STM32开发,不用CubeMX简直是自讨苦吃。它能帮你生成初始化代码,省去大量重复劳动。

2.4.1 创建工程

  1. 打开CubeMX,点击 New Project
  2. Part Number 里搜索你的芯片型号,比如STM32F103C8T6。双击选中。
  3. 进入图形化配置界面。这里你可以配置时钟、外设、引脚等。

2.4.2 关键配置

  • 时钟配置:在 Clock Configuration 标签页里,设置HSE、PLL等。我一般直接选最大主频,比如72MHz或168MHz。但要注意,有些芯片超频会不稳定。
  • 外设配置:比如你要用USART1,就在 Pinout & Configuration 里找到USART1,勾选 Asynchronous。然后设置波特率、数据位等。
  • 生成代码:点击 Project -> Generate Code。选择你的IDE类型(Keil或IAR),然后设置工程名和路径。
我的习惯:生成代码后,我会先编译一次,确保没有错误。然后再开始写自己的业务逻辑。这样能避免CubeMX生成的代码和你的代码冲突。

2.5 J-Link / ST-Link 调试器连接

调试器是嵌入式开发的“眼睛”。没有它,你只能靠猜。我刚开始做开发时,全靠串口打印调试,效率极低。后来用了调试器,才发现世界原来这么美好。

2.5.1 硬件连接

不管是J-Link还是ST-Link,连接方式都差不多:

  • SWD接口:只需要4根线:SWDIO、SWCLK、GND、VCC(可选)。我一般只用前3根,VCC从板子上取。
  • JTAG接口:需要5根线:TMS、TCK、TDI、TDO、nTRST。但SWD更常用,因为省引脚。
注意:连接时,一定要确认板子的电压和调试器匹配。比如STM32F4是3.3V,J-Link默认也是3.3V。但有些调试器支持1.8V到5V自适应。我有个同事用5V的调试器去连3.3V的板子,结果烧了芯片。嗯,血的教训。

2.5.2 软件配置

在IDE里配置调试器:

  • Keil:在 Project -> Options for Target -> Debug 里,选择 J-Link / J-Trace CortexST-Link Debugger。然后点击 Settings,确认SWD模式,速度我一般选1MHz或4MHz。
  • IAR:在 Project -> Options -> Debugger 里,选择 J-Link/J-TraceST-Link。然后在 Download 标签页里,勾选 Use flash loader(s)

2.5.3 常见问题

问题 原因 解决方法
连接不上调试器 驱动没装好,或接线错误 重装驱动,检查SWD线序
下载失败 Flash算法不对,或芯片被锁 重新选择Flash算法,或使用解锁工具
调试时跑飞 堆栈溢出,或中断配置错误 检查堆栈大小,确认中断向量表
避坑指南:我曾经遇到一个奇怪的问题,J-Link能识别芯片,但就是下载不了程序。折腾了两天,最后发现是板子上的复位电路有问题,导致调试器无法正确复位芯片。所以,如果连接没问题,先检查硬件电路。

2.6 总结

环境搭建这一步,说白了就是“磨刀不误砍柴工”。花点时间把Keil或IAR装好,把CubeMX工程配好,把调试器连好。后面写代码、调bug,都会顺畅很多。

我个人建议,初学者先用Keil + ST-Link的组合,因为资料多,遇到问题好查。等熟练了,再尝试IAR + J-Link,体验一下不同的工具链。

好,这一章就到这里。下一章,我们开始真正写代码,点亮第一颗LED灯。