第1章:开发环境搭建
做嵌入式开发,第一件事就是搭环境。这事儿看着简单,但我在带新人时发现,很多人卡在这一步就浪费了一整天。说白了,工具链没配好,后面全是白搭。
这一章,我带你把 Keil MDK、IAR、GCC 这三套工具链都捋一遍。还有 STM32CubeMX、AT32 IDE 怎么生成工程,J-Link 和 ST-Link 怎么连,串口工具怎么设。嗯,咱们一步步来。
1.1 Keil MDK 安装与配置
Keil MDK 是我用得最多的 IDE,尤其是做 STM32 项目时。它的界面虽然老气,但稳定啊。我在项目中遇到过好几次,用其他 IDE 编译好好的,换到 Keil 就出问题——后来发现是编译器版本不一致。
安装步骤其实很简单:
- 去 Keil 官网下载 MDK-ARM 安装包
- 双击安装,一路 Next
- 安装完成后,打开 Pack Installer
- 搜索你的芯片型号,比如 STM32F103C8T6
- 点击 Install,下载对应的 Device Family Pack
这里有个坑——Pack 版本要匹配。我曾经因为装了最新的 Pack,结果老工程编译报一堆错。后来发现是 HAL 库接口变了。所以,如果你用的是老工程,Pack 版本别追新。
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,效率翻了三倍不止。
生成工程的步骤:
- 打开 CubeMX,点击 New Project
- 搜索芯片型号,比如 STM32F030F4P6
- 配置时钟:HSE 8MHz -> PLL -> 系统时钟 48MHz
- 配置 GPIO:PA0 作为电机 PWM 输出,PB1 作为限位开关输入
- 配置定时器:TIM2 产生 20ms 周期的 PWM
- 点击 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 稍微复杂点,但支持保存会话,下次直接双击打开,省事。
好了,开发环境这块就这些。工具链装好、调试器连上、串口能打印,你就可以开始写代码了。下一章,咱们聊聊窗帘电机的硬件方案设计。