第1章:开发环境搭建

做嵌入式开发,第一件事就是搭环境。这事儿看着简单,但我在带新人时发现,很多人卡在这一步就浪费了一整天。说白了,工具链没配好,后面全是白搭。

这一章,我带你把 Keil MDK、IAR、GCC 这三套工具链都捋一遍。还有 STM32CubeMX、AT32 IDE 怎么生成工程,J-Link 和 ST-Link 怎么连,串口工具怎么设。嗯,咱们一步步来。

1.1 Keil MDK 安装与配置

Keil MDK 是我用得最多的 IDE,尤其是做 STM32 项目时。它的界面虽然老气,但稳定啊。我在项目中遇到过好几次,用其他 IDE 编译好好的,换到 Keil 就出问题——后来发现是编译器版本不一致。

我的建议:Keil MDK 版本选 5.38 或以上,别用太老的。5.36 之前对 ARM Compiler 6 支持不太好。

安装步骤其实很简单:

  1. 去 Keil 官网下载 MDK-ARM 安装包
  2. 双击安装,一路 Next
  3. 安装完成后,打开 Pack Installer
  4. 搜索你的芯片型号,比如 STM32F103C8T6
  5. 点击 Install,下载对应的 Device Family Pack

这里有个坑——Pack 版本要匹配。我曾经因为装了最新的 Pack,结果老工程编译报一堆错。后来发现是 HAL 库接口变了。所以,如果你用的是老工程,Pack 版本别追新。

注意:Keil 的 License 管理有点烦。如果你用的是评估版,代码限制 32KB。做窗帘电机这种小项目够用,但要是做复杂点的,建议买个授权。

1.2 IAR 安装与配置

IAR 的编译器优化做得比 Keil 好,代码密度小。我有个项目,用 Keil 编译出来 28KB,换 IAR 直接降到 22KB。你想想看,对于 Flash 只有 64KB 的芯片,这省下来的空间多宝贵。

安装 IAR 要注意几点:

  • 版本选 8.50 以上,对 Cortex-M 系列支持更全
  • 安装路径不要有中文,否则编译会莫名其妙报错
  • 装完后记得重启电脑,让环境变量生效

配置工程时,我习惯这样做:

// IAR 工程配置要点
1. Project -> Options -> General Options
   - Target: 选你的芯片型号
   - Endian mode: Little endian

2. C/C++ Compiler -> Optimizations
   - 调试阶段选 None
   - 发布阶段选 High (Balanced)

3. Linker -> Output
   - 勾选 Generate additional output
   - 选 intel-extended 格式,方便烧录

说实话,IAR 的界面比 Keil 现代一点,但快捷键不太一样。我刚从 Keil 转 IAR 时,按 Ctrl+F5 想编译,结果它给我打开了调试……嗯,习惯就好。

1.3 GCC 工具链搭建

GCC 是免费的,这点对低成本方案太重要了。做窗帘电机这种产品,成本控制是命门。用 GCC 可以省掉 IDE 的授权费,而且跨平台,Windows、Linux、macOS 都能用。

我推荐用 ARM GCC 官方工具链:

# Windows 下安装
1. 下载 gcc-arm-none-eabi-xxx-win32.exe
2. 安装到 C:\ARM_GCC
3. 添加环境变量:
   C:\ARM_GCC\bin 到 PATH

# 验证安装
arm-none-eabi-gcc --version
# 输出类似:
# arm-none-eabi-gcc (GNU Arm Embedded Toolchain) 10.3-2021.10

个人经验:GCC 编译时,记得加 -Os 优化选项。我做过对比,不加优化编译出来 30KB,加了 -Os 只有 24KB。对于窗帘电机这种对成本敏感的产品,Flash 省一点是一点。

用 GCC 还有个好处——可以写 Makefile 自动化编译。我习惯把编译、烧录、测试写成一个脚本,一键执行。这在批量调试时特别爽。

1.4 STM32CubeMX 工程生成

STM32CubeMX 是个好东西。它帮你生成初始化代码,省去手动配置寄存器的麻烦。我刚开始做 STM32 时,都是对着参考手册一个个寄存器写,后来用了 CubeMX,效率翻了三倍不止。

生成工程的步骤:

  1. 打开 CubeMX,点击 New Project
  2. 搜索芯片型号,比如 STM32F030F4P6
  3. 配置时钟:HSE 8MHz -> PLL -> 系统时钟 48MHz
  4. 配置 GPIO:PA0 作为电机 PWM 输出,PB1 作为限位开关输入
  5. 配置定时器:TIM2 产生 20ms 周期的 PWM
  6. 点击 Project -> Generate Code

这里有个技巧——生成代码前,先检查 Pinout 有没有冲突。我遇到过一回,PA9 和 PA10 同时被 USART1 和 TIM1 占用,编译没问题,但调试时串口死活不工作。后来查了半天,才发现是引脚冲突。

避坑指南:CubeMX 生成的代码默认用了 HAL 库。HAL 库封装得比较厚,中断响应会慢一些。如果你对实时性要求高,可以考虑用 LL 库。我一般这样选:

  • 普通功能(GPIO、定时器)用 HAL
  • 对时间敏感的功能(PWM 中断、ADC 采样)用 LL

1.5 AT32 IDE 工程生成

AT32 是雅特力的芯片,性价比很高。做低成本窗帘电机,AT32F403 是个好选择,价格比 STM32F103 便宜 30% 左右。

AT32 IDE 是基于 Eclipse 的,用起来和 STM32CubeIDE 差不多。生成工程的方法:

1. 打开 AT32 IDE,选择 File -> New -> AT32 Project
2. 选择芯片型号:AT32F403AVGT7
3. 选择工程模板:选 Bare Metal(裸机)
4. 配置时钟:
   - 外部晶振 8MHz
   - PLL 倍频到 240MHz
5. 添加外设驱动:
   - 勾选 TMR(定时器)
   - 勾选 GPIO
   - 勾选 USART

说实话,AT32 的生态不如 STM32 成熟。我在项目中遇到过库函数有 bug 的情况——某个定时器的捕获模式,文档说支持,实际跑起来就是不对。后来我直接读寄存器操作才搞定。所以,用 AT32 时,关键功能最好自己验证一遍

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

调试器是嵌入式开发的「眼睛」。没有它,你只能靠猜。我刚开始做项目时,喜欢用串口打印调试,后来发现效率太低。用调试器单步执行,变量值一目了然。

连接方式很简单:

调试器 SWD 接口 接线方式
J-Link SWDIO, SWCLK, GND, VCC J-Link 的 1 脚接 VCC,7 脚接 SWDIO,9 脚接 SWCLK,4 脚接 GND
ST-Link SWDIO, SWCLK, GND, VCC ST-Link 的 1 脚接 VCC,2 脚接 SWDIO,3 脚接 SWCLK,4 脚接 GND

重要提醒:接线时一定要确认电压匹配。J-Link 有 3.3V 和 5V 两种模式,如果你的芯片是 3.3V 供电,J-Link 也要设成 3.3V。我曾经因为电压不匹配,烧了一块板子的 STM32——嗯,那感觉,心疼啊。

连接成功后,在 IDE 里配置调试器:

// Keil 配置
Project -> Options -> Debug
- Use: 选 J-Link / J-Trace Cortex
- 点击 Settings
- Port: 选 SW
- Max Clock: 选 4MHz(稳定)

// IAR 配置
Project -> Options -> Debugger
- Setup -> Driver: 选 J-Link/J-Trace
- 点击 Download -> 勾选 Use flash loader

1.7 串口调试工具设置

串口是嵌入式开发最常用的调试手段。虽然调试器功能强大,但串口打印信息更直观。我习惯在关键位置加打印,比如电机启动、停止、故障状态。

常用的串口工具有两个:

  • Putty:轻量级,免费,够用
  • SecureCRT:功能强,支持脚本,但收费

设置参数:

参数 推荐值 说明
波特率 115200 窗帘电机数据量不大,115200 够用
数据位 8 标准设置
停止位 1 够用,不用 2 位
校验位 None 省事,不校验
流控制 None 窗帘电机不需要硬件流控

我的习惯:在串口打印时,加个时间戳。比如:

printf("[%lu] Motor start, speed=%d\n", HAL_GetTick(), speed);

这样出问题时,能知道是哪个时间点发生的。我在排查一个电机抖动问题时,就是靠时间戳发现是定时器中断优先级设低了。

Putty 的设置很简单:打开软件,选 Serial,填上 COM 口和波特率,点 Open 就行。SecureCRT 稍微复杂点,但支持保存会话,下次直接双击打开,省事。

好了,开发环境这块就这些。工具链装好、调试器连上、串口能打印,你就可以开始写代码了。下一章,咱们聊聊窗帘电机的硬件方案设计。