第一章:MCU开发环境搭建

做嵌入式开发这么多年,我见过太多新手卡在环境搭建这一步。说实话,工具链没配好,后面再努力也是白搭。今天咱们就把Keil和IAR这两个主流IDE的安装、工程模板创建、第一个LED程序,还有调试器配置,一次性讲透。

1.1 开发工具的选择:Keil还是IAR?

很多初学者会纠结这个问题。我的建议很简单——看你用的芯片。如果你用ARM Cortex-M系列,Keil MDK是主流;如果你用STM32,那Keil和IAR都能用,但Keil的生态更成熟。我个人习惯用Keil,因为它的调试界面更直观,而且很多国产MCU厂商直接提供Keil的芯片包。

但IAR也有它的优势。我记得有一次项目需要做代码尺寸优化,IAR的编译器确实比Keil更激进,最终帮我把Flash占用压低了15%。所以,如果你对代码体积有极致要求,IAR值得一试。

对比项 Keil MDK IAR EWARM
芯片支持 ARM Cortex-M全系列 ARM Cortex-M/R/A
编译器 ARMCC v6/v5 IAR C/C++ Compiler
调试器 ULINK, J-Link, ST-Link I-Jet, J-Link, ST-Link
代码优化 中等 优秀
学习曲线 平缓 稍陡

1.2 Keil MDK安装与激活

安装Keil其实没什么难度,但有几个坑我得提前告诉你。

第一步:下载安装包

去Keil官网下载MDK-ARM最新版本。注意,别下成C51了,那是给8051用的。我见过有人装错,折腾了半天才发现。

第二步:安装过程

  • 双击安装包,一路Next
  • 安装路径不要有中文,不要有空格
  • 建议装到C盘默认路径,省得出幺蛾子

第三步:激活License

安装完成后,打开Keil uVision,点击File -> License Management。这里要输入你的License ID Code(LIC)。如果你用的是正版,直接输入即可。如果是评估版,有32K代码限制,做个小项目够用。

注意:我曾经遇到过激活后编译报错"License Check Failed",后来发现是系统时间被改动了。Keil的License会校验系统时间,别手贱去改日期。

1.3 IAR EWARM安装要点

IAR的安装比Keil稍微复杂一点。它的License管理方式不同,有节点锁和浮动License两种。我个人建议用节点锁,省心。

安装步骤:

  1. 下载IAR EWARM安装包(约1.5GB)
  2. 运行安装程序,选择"Install IAR Embedded Workbench"
  3. 选择你要支持的芯片系列(比如ARM Cortex-M4)
  4. 安装完成后,打开IAR,进入Help -> License Manager
  5. 导入License文件(.lic)

嗯,这里要注意:IAR的编译器对C99/C11标准支持得更好。如果你写的是比较新的C语言特性,IAR会更友好。

1.4 工程模板创建:从零开始

很多教程会让你直接复制别人的工程模板。但我不建议这么做。自己动手建一次模板,你才能真正理解工程结构。

以Keil为例,创建一个STM32F103C8T6的工程模板:

  1. 打开Keil,点击Project -> New uVision Project
  2. 选择芯片型号:STM32F103C8
  3. 弹出Manage Run-Time Environment时,先关掉(后面手动添加文件)
  4. 在工程目录下创建文件夹:User, Driver, Startup, Doc
  5. 将启动文件(startup_stm32f103xb.s)放到Startup文件夹
  6. 将系统文件(system_stm32f10x.c/h)放到User文件夹
  7. 添加main.c到User文件夹
小技巧:我习惯在工程根目录下放一个"readme.txt",记录芯片型号、晶振频率、编译选项等关键信息。半年后你回头看这个工程,会感谢自己当初的细心。

1.5 第一个LED闪烁程序

好了,环境搭好了,模板建好了,咱们来写第一个程序。说白了就是点个灯,但这是嵌入式开发的"Hello World"。

先看代码:

#include "stm32f10x.h"

void delay(uint32_t count) {
    for(uint32_t i = 0; i < count; i++) {
        // 空循环,消耗时间
        __NOP();
    }
}

int main(void) {
    // 使能GPIOC时钟
    RCC->APB2ENR |= RCC_APB2ENR_IOPCEN;
    
    // 配置PC13为推挽输出,50MHz
    GPIOC->CRH &= ~(0xF << 20);  // 先清零
    GPIOC->CRH |= (0x3 << 20);   // 设置为推挽输出
    
    while(1) {
        GPIOC->BSRR = GPIO_BSRR_BS13;  // 点亮LED(低电平有效)
        delay(500000);
        GPIOC->BSRR = GPIO_BSRR_BR13;  // 熄灭LED
        delay(500000);
    }
}

这段代码做了三件事:

  • 开启GPIOC的外设时钟
  • 配置PC13引脚为推挽输出模式
  • 在主循环中交替拉高拉低电平,实现闪烁

为什么是PC13?因为很多STM32开发板上的LED都接在这个引脚上,低电平点亮。如果你用的板子不一样,记得查原理图。

核心要点:操作GPIO之前,必须先使能对应的时钟。这是新手最容易忘的。我刚开始学的时候,折腾了一下午灯都不亮,最后发现是忘了开时钟。嗯,从那以后我再也没犯过这个错。

1.6 调试器配置:J-Link与ST-Link

程序写好了,怎么烧进去?怎么调试?这就涉及到调试器了。

市面上最常见的调试器有两种:J-Link和ST-Link。J-Link是SEGGER公司的,功能强大,支持几乎所有ARM芯片。ST-Link是ST官方出的,专门用于STM32,便宜好用。

J-Link配置步骤(Keil环境):

  1. 将J-Link连接到开发板的SWD接口(SWDIO, SWCLK, GND, VCC)
  2. 打开Keil工程,点击Project -> Options for Target
  3. 选择Debug选项卡,在Use下拉框中选择"J-LINK / J-TRACE Cortex"
  4. 点击Settings,确认SWD模式,速度建议选1MHz以下(线长时降速)
  5. 切换到Flash Download选项卡,添加对应的Flash算法

ST-Link配置类似:

  • Debug选项卡选择"ST-Link Debugger"
  • Settings里同样选SWD模式
  • Flash Download里添加STM32F10x Flash算法
避坑指南:我曾经遇到过J-Link连接不上目标板的情况。排查了半天,发现是SWD接口的VCC没接。J-Link需要从目标板取电来检测电平,不接VCC它就不工作。另外,如果线太长(超过20cm),建议把SWD速度降到100kHz以下。

1.7 知识体系总览

说了这么多,咱们用一张图来总结本章的核心内容:

MCU开发环境搭建知识体系 开发环境搭建 IDE选择 安装与配置 工程模板创建 LED闪烁程序 Keil MDK IAR EWARM License激活 芯片包安装 文件夹结构 文件分组 时钟使能 GPIO配置 延时循环 调试器配置 J-Link配置 ST-Link配置 SWD接口接线

这张图把本章的知识点串起来了。从IDE选择开始,到安装配置、工程模板、LED程序,最后到调试器配置,每一步都是环环相扣的。你想想看,如果IDE没装好,后面所有步骤都白费。所以,别嫌麻烦,一步步来。

1.8 常见问题与解决

最后,我整理了几个新手最容易遇到的问题,都是我在项目里踩过的坑:

问题现象 可能原因 解决方法
编译报错"target not created" 编译器路径不对或License失效 检查License状态,重新激活
下载时报"Flash Download failed" Flash算法未添加或芯片型号选错 在Flash Download选项卡添加对应算法
调试时无法连接目标板 SWD接线错误或速度太高 检查接线,降低SWD速度
LED不亮 GPIO时钟未使能或引脚配置错误 检查RCC寄存器,核对引脚号

好了,环境搭建这部分就讲到这里。记住,工具只是手段,理解原理才是关键。下一章咱们会深入GPIO的底层原理,到时候你会发现,今天学的这些基础操作,其实都是在为后面的复杂应用打底。


公众号:蓝海资料掘金营,微信deep3321