3. 开发环境搭建:Keil/IAR/Arduino IDE 的安装与配置

工欲善其事,必先利其器。做嵌入式开发,第一道坎就是搭环境。

我记得刚入行那会儿,光装个 Keil 就折腾了一下午,License 死活激活不了。后来才发现是杀毒软件把注册机给吞了。嗯,这种坑我踩过不少,今天帮你一次性捋清楚。

3.1 三大 IDE 怎么选?

先别急着下载。你得想清楚自己用哪款芯片。我列个表,你一看就明白:

IDE 适用芯片 特点 我的建议
Keil MDK ARM Cortex-M 系列(STM32、NXP、GD32 等) 行业标准,调试功能强,库支持完善 做产品首选,稳定
IAR EWARM ARM、AVR、RISC-V 等 编译优化极好,代码密度小 对性能有要求时用
Arduino IDE AVR(Uno、Nano)、ESP32、STM32(需插件) 上手快,生态丰富,适合快速验证 学习 PWM 原理时最友好
我的习惯: 学新东西先用 Arduino IDE 验证思路,产品阶段再切到 Keil 或 IAR。这样既快又稳。

3.2 Keil MDK 安装与配置

Keil 是 ARM 开发的事实标准。我个人习惯用 MDK v5.38 以后的版本,对 Cortex-M33 支持更好。

3.2.1 下载与安装

  1. 去 Keil 官网下载 MDK-ARM 安装包(约 1.2GB)。
  2. 双击安装,一路 Next。注意安装路径不要有中文。
  3. 安装完成后,打开 Keil uVision5。
  4. 点击 File → License Management,输入你的 License。
我曾经踩过的坑: 装完 Keil 发现编译报错 "Target not created"。查了半天,原来是没装芯片包。你得去 Pack Installer 里把对应型号的 Device Family Pack 勾上,比如 STM32F1 系列就搜 "STM32F1"。

3.2.2 第一个 Keil 工程:点亮 LED

我们以 STM32F103C8T6 为例。说白了,就是让 GPIO 输出高电平。

// main.c
#include "stm32f10x.h"

void delay(void) {
    for (uint32_t i = 0; i < 500000; i++);
}

int main(void) {
    // 使能 GPIOC 时钟
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);

    // 配置 PC13 为推挽输出
    GPIO_InitTypeDef GPIO_InitStructure;
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOC, &GPIO_InitStructure);

    while (1) {
        GPIO_SetBits(GPIOC, GPIO_Pin_13);   // 亮
        delay();
        GPIO_ResetBits(GPIOC, GPIO_Pin_13); // 灭
        delay();
    }
}

你想想看,这段代码其实就做了三件事:开时钟、配引脚、循环翻转。PWM 的原理也是基于这种 GPIO 翻转,只不过频率更高、占空比可调。

3.3 IAR EWARM 安装与配置

IAR 的编译器优化确实比 Keil 好。我在做电机控制项目时,同样的代码 IAR 编译出来能小 15% 左右,这对 Flash 紧张的芯片很关键。

3.3.1 安装步骤

  1. 从 IAR 官网下载 EWARM 安装包(建议 v8.50 以上)。
  2. 运行安装程序,选择 "Install IAR Embedded Workbench"。
  3. 安装完成后,用 License Manager 激活。
  4. 创建工程时,选择对应的芯片型号,比如 STM32F103ZE。
关键区别: IAR 的工程文件是 .eww(工作空间)和 .ewp(工程)。Keil 是 .uvprojx。别搞混了。

3.3.2 IAR 工程示例

同样的 LED 闪烁,IAR 的代码几乎一样,但要注意头文件路径配置:

// main.c
#include "stm32f10x.h"

int main(void) {
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);

    GPIO_InitTypeDef GPIO_InitStructure;
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOC, &GPIO_InitStructure);

    while (1) {
        GPIOC->BSRR = GPIO_Pin_13;   // 置位
        for (volatile uint32_t i = 0; i < 500000; i++);
        GPIOC->BRR  = GPIO_Pin_13;   // 复位
        for (volatile uint32_t i = 0; i < 500000; i++);
    }
}
注意: IAR 默认不开启微库(MicroLIB),如果你要用 printf 打印调试信息,记得在工程选项的 General Options → Library Configuration 里选 "Full" 或自己实现 fputc。

3.4 Arduino IDE 安装与配置

如果你只是想快速上手 PWM,Arduino IDE 是最省事的。我教学生时,第一节课就用 Arduino 让他们看到 LED 呼吸效果,5 分钟搞定,成就感拉满。

3.4.1 安装步骤

  1. 访问 arduino.cc,下载 Arduino IDE(推荐 v2.x 版本,界面更现代)。
  2. 安装后打开,进入 工具 → 开发板 → 开发板管理器。
  3. 搜索你的板子型号,比如 "Arduino Uno" 或 "ESP32",点击安装。
  4. 选择正确的端口(Windows 下是 COMx,Linux 下是 /dev/ttyUSB0)。
我曾经遇到的坑: 插上板子后电脑没识别。大概率是没装驱动。Arduino Uno 用的是 CH340 或 FT232 芯片,去官网下对应驱动装上就好了。

3.4.2 第一个 Arduino 工程:LED 闪烁

Arduino 的代码风格非常简洁。你看:

// 定义 LED 引脚
const int ledPin = 13;

void setup() {
    pinMode(ledPin, OUTPUT);  // 设置为输出
}

void loop() {
    digitalWrite(ledPin, HIGH);  // 亮
    delay(1000);                 // 等 1 秒
    digitalWrite(ledPin, LOW);   // 灭
    delay(1000);                 // 等 1 秒
}

这段代码背后,Arduino 帮你做了时钟配置、GPIO 初始化。你只需要关心逻辑。但说实话,如果你想深入理解 PWM,迟早得回到寄存器层面。

3.5 三种 IDE 的工程结构对比

我画了一张图,帮你理清它们的关系:

三种 IDE 工程结构对比 Keil MDK .uvprojx 工程文件 Startup_xx.s 启动文件 main.c 用户代码 STM32 HAL/LL 库 .hex 输出文件 调试器:J-Link / ST-Link IAR EWARM .eww / .ewp 工程 cstartup.s 启动文件 main.c 用户代码 IAR 标准外设库 .out / .hex 输出 调试器:J-Link / I-jet Arduino IDE .ino 草图文件 自动生成 main 函数 setup() + loop() Wiring 框架封装 .hex 通过 bootloader 烧录 烧录方式:USB 串口

从这张图你能看出来:Keil 和 IAR 的工程结构很相似,都需要手动管理启动文件和库。Arduino 则帮你封装了底层,上手快但灵活性受限。

3.6 第一个 LED 工程:验证环境

不管用哪个 IDE,最终目标都一样:让 LED 亮起来。我建议你按这个步骤验证:

  1. 硬件连接: LED 正极接 GPIO,负极串一个 220Ω 电阻到 GND。
  2. 编译下载: 确保 0 错误 0 警告。
  3. 观察现象: LED 以 1Hz 频率闪烁,说明环境搭建成功。
为什么先做 LED 闪烁? 因为这是最基础的 GPIO 输出。PWM 的本质就是高速翻转 GPIO,只不过占空比和频率受定时器控制。LED 闪烁跑通了,后面学 PWM 就只剩配置定时器这一步。

好了,环境搭好了,LED 也亮了。接下来你就可以放心地进入 PWM 的世界了。