第2章:开发环境搭建——IDE安装、调试器配置与工程模板建立
做嵌入式开发,第一步就是把家伙事儿备齐。我见过不少新手,上来就急着写代码,结果编译报错、下载失败,折腾半天发现是环境没配好。这章咱们就把Keil和IAR的安装、J-Link和ST-Link的配置、还有工程模板的搭建,一次性讲清楚。
2.1 IDE的选择:Keil还是IAR?
说实话,这两款IDE我都用过好多年。Keil在ARM生态里更常见,尤其是ST、NXP这些厂商的芯片,官方例程基本都是Keil工程。IAR的编译器优化更激进,代码密度更高,但上手门槛稍高一点。
我个人习惯:做剃须刀这种消费类产品,我选Keil。为什么?因为ST官方库、HAL库、LL库,默认都是Keil工程。你拿IAR去打开,还得手动转换,麻烦。
核心建议:
- 如果你主要用STM32、GD32、NXP的LPC系列 → 选Keil
- 如果你追求极致代码密度、做低功耗优化 → 选IAR
- 如果你团队里有人用Keil有人用IAR → 统一用Keil,省得互相折腾
2.2 Keil MDK安装与激活
安装Keil其实不难,但有几个坑。我踩过,你注意一下。
- 下载MDK-ARM版本,别下成C51了。C51是给8051用的,ARM芯片用不了。
- 安装路径不要有中文。我见过有人装到“D:\软件\Keil_v5”,结果编译报错找不到头文件。老老实实用英文路径。
- 安装完成后,先打补丁。Keil官方会定期发布更新包,把最新的芯片支持包(Pack)装上。不然你新建工程时,可能找不到你手里的芯片型号。
- 激活:用管理员身份运行Keil,打开License Management,输入你的许可证。如果你用的是评估版,有32KB代码限制——做剃须刀固件够用,但别指望跑RTOS。
注意:Keil的Pack安装器有时候会卡住。我曾经等了一个小时没反应,最后关了重开才搞定。如果你遇到这种情况,别傻等,直接关掉重试。
2.3 调试器配置:J-Link vs ST-Link
调试器是连接电脑和开发板的桥梁。剃须刀项目里,我推荐用ST-Link,因为便宜、稳定、而且ST官方支持最好。J-Link虽然功能更强,但正版太贵,盗版容易出问题。
| 特性 | ST-Link | J-Link |
|---|---|---|
| 价格 | 几十块(甚至开发板自带) | 正版几百到几千,盗版几十 |
| 速度 | 最高4MHz SWD | 最高50MHz SWD |
| 稳定性 | 对STM32非常稳定 | 通用性强,但盗版容易掉线 |
| 推荐场景 | STM32、GD32开发 | 多平台、多芯片调试 |
配置步骤(以ST-Link + Keil为例):
- 把ST-Link插到电脑USB口,驱动会自动安装。如果没装,去ST官网下载ST-Link驱动。
- 打开Keil,点击“Project” → “Options for Target” → “Debug”选项卡。
- 在“Use”下拉框里选择“ST-Link Debugger”。
- 点击“Settings”,确认SWD模式,速度选4MHz(别选太高,容易不稳定)。
- 在“Flash Download”选项卡里,勾选“Reset and Run”——这样下载完程序会自动复位运行,不用手动按复位键。
小技巧:如果你用J-Link,记得把SWD速度降到1MHz以下。我遇到过好几次,剃须刀电机一启动,调试器就掉线了。降速之后稳如老狗。
2.4 工程模板建立——别每次都从头搭
你想想看,每次新建一个项目,都要去复制启动文件、配置时钟、设置中断向量表……烦不烦?我建议你花半小时,做一个通用模板,以后直接复制。
我的模板结构:
Project_Template/
├── Libraries/ # 芯片外设库(HAL/LL/标准库)
├── Startup/ # 启动文件(.s文件)
├── User/ # 用户代码(main.c, stm32f1xx_it.c等)
├── Drivers/ # 自己写的驱动(GPIO、UART、ADC等)
├── Middlewares/ # 中间件(FreeRTOS、FATFS等)
├── Output/ # 编译输出(.hex, .bin, .map)
└── Project.uvprojx # Keil工程文件
建立步骤:
- 新建一个文件夹,比如叫“Template_Keil”。
- 打开Keil,新建工程,选择芯片型号(比如STM32F103C8T6)。
- 添加启动文件、系统文件、外设库文件。
- 配置时钟:用HSE外部晶振,主频跑到72MHz(如果是F103)。
- 配置调试器:选ST-Link,SWD模式,4MHz。
- 写一个空的main函数,里面放个while(1)。
- 编译通过后,把这个文件夹压缩保存。
避坑指南:
- 我曾经把模板里的时钟配置写死了,结果换了个晶振频率的板子,程序跑不起来。后来我改成用宏定义,换板子只改一个值。
- 模板里一定要加断言(assert)。调试阶段断言能帮你快速定位指针越界、参数错误。发布时再关掉。
- 别忘了加看门狗。剃须刀电机堵转时,程序可能卡死。看门狗能自动复位,避免烧电机。
2.5 验证环境是否搭好
环境搭完,得验证一下。写个最简单的LED闪烁程序:
#include "stm32f1xx_hal.h"
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
int main(void)
{
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
while (1)
{
HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_13);
HAL_Delay(500);
}
}
void SystemClock_Config(void)
{
// 配置HSE、PLL,输出72MHz
// 具体代码略,模板里已有
}
static void MX_GPIO_Init(void)
{
__HAL_RCC_GPIOC_CLK_ENABLE();
GPIO_InitTypeDef GPIO_InitStruct = {0};
GPIO_InitStruct.Pin = GPIO_PIN_13;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
}
编译、下载。如果LED以0.5秒间隔闪烁,恭喜你,环境搭好了。
提示:如果LED不亮,先检查硬件——万用表量一下引脚电压。我遇到过好几次,代码没问题,结果是LED焊反了。
2.6 关于IAR的补充说明
虽然我推荐Keil,但如果你非要用IAR,也简单说两句:
- IAR的工程文件是.ewp,工作空间是.eww。
- IAR的编译器优化等级默认是None,记得改成Medium或High。不然代码体积大,剃须刀那点Flash可能装不下。
- IAR的调试器配置在“Project” → “Options” → “Debugger”里。选ST-Link,然后点“Download”选项卡,勾选“Use flash loader(s)”。
嗯,环境搭建这部分就这些。下一章咱们开始讲剃须刀的核心控制逻辑——电机驱动与PWM调速。到时候我会把实际项目中踩过的坑,一个一个说给你听。