3. 处理器架构与选型

做嵌入式开发,第一件事就是把家伙事儿备齐。我见过不少新手,代码写得挺溜,结果卡在环境搭建上,一卡就是半天。说白了,工具链不顺手,后面全是坑。

这一章,咱们就把 Keil MDK 从安装到调试走一遍。我会把项目中踩过的雷、绕过的弯,都给你指出来。

3.1 Keil MDK 的安装与激活

Keil MDK 是 ARM 内核 MCU 开发的主流 IDE。我个人习惯用 MDK-ARM 版本,支持从 Cortex-M0 到 M7 的全系列。

3.1.1 版本选择

版本 适用场景 编译器 代码大小限制
MDK-Lite (免费) 学习、小项目 AC5 / AC6 32KB
MDK-Plus (付费) 中型商业项目 AC5 / AC6 无限制
MDK-Professional 大型多核、安全认证 AC5 / AC6 + ARM Compiler 6 无限制

我建议初学者先用 Lite 版,够用。等做到量产项目了,再考虑付费版。嗯,这里要注意:Lite 版虽然免费,但 32KB 的限制对 RTOS 项目来说有点紧,编译一次就要算着代码量。

3.1.2 安装步骤

  1. 下载安装包:去 Keil 官网下载 MDK-ARM 最新版。别去第三方网站下,容易带毒。
  2. 运行安装程序:一路 Next,但安装路径不要有中文和空格。我习惯放在 C:\Keil_v5。
  3. 安装器件包 (Pack):安装完成后,打开 Pack Installer,选择你的芯片型号。比如 STM32F103 系列,勾上 Keil::STM32F1xx_DFP。
  4. 激活 License:如果是正版,用 License Management 导入证书。Lite 版会自动激活。
我曾经遇到过:装完 Keil 后死活找不到芯片。折腾了半天,发现是 Pack 没装。Pack Installer 里搜不到?那就手动下载 .pack 文件,双击安装。

3.2 工程配置:从零开始建一个 RTOS 项目

环境装好了,咱们建个工程试试。以 STM32F407 + FreeRTOS 为例,我带你走一遍。

3.2.1 新建工程

  1. 打开 Keil,点 Project - New uVision Project。
  2. 选芯片型号:比如 STM32F407ZGTx。
  3. 弹窗问你要不要添加启动代码,选 是。Keil 会自动帮你加好 startup_stm32f407xx.s。

3.2.2 配置 Target 选项

右键工程名,选 Options for Target。这里有几个关键项:

  • Target 标签页:Xtal 填你的晶振频率,比如 8MHz。我习惯把 Use MicroLIB 勾上,能省不少 RAM。
  • Output 标签页:勾上 Create HEX File,烧录用。
  • C/C++ 标签页:Define 里加上 USE_STDPERIPH_DRIVER, STM32F40_41xxx。优化等级选 -O2,调试时选 -O0。
  • Debug 标签页:选调试器,咱们后面细说。
小技巧:优化等级别一上来就开 -O3。我有个项目,开 O3 后 RTOS 调度器跑飞了,查了两天才发现是编译器把某个变量优化掉了。加个 volatile 搞定。

3.2.3 添加源文件

工程建好了,得把代码加进去。我习惯这样组织目录:

Project/
├── User/           # 主函数、中断
├── BSP/            # 板级支持包
├── FreeRTOS/       # RTOS 源码
│   ├── Source/
│   └── Portable/
├── Drivers/        # 官方库或 HAL
└── Startup/        # 启动文件

在 Keil 里,右键工程名,Add Group 创建文件夹,然后 Add Existing Files 把 .c 和 .h 加进去。注意:FreeRTOS 的 port.c 要根据芯片选,比如 STM32F4 用 portable/GCC/ARM_CM4F。

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

代码写好了,怎么烧进去、怎么调?这就得靠调试器了。我主要用两种:J-Link 和 ST-Link。

3.3.1 调试器对比

特性 J-Link (SEGGER) ST-Link (ST)
速度 最高 50 MHz (SWD) 最高 4 MHz (SWD)
价格 教育版 ~400元,专业版 ~3000元 板载免费,独立版 ~50元
软件支持 Keil, IAR, Ozone, 命令行 Keil, IAR, STM32CubeIDE
虚拟串口 部分型号支持 全系列支持
适用场景 高性能调试、量产烧录 学习、原型验证

我个人习惯:学习阶段用 ST-Link,够用还便宜。做产品了,换 J-Link,速度快、功能强,尤其是调试 RTOS 任务栈溢出时,J-Link 的硬件断点比 ST-Link 多得多。

3.3.2 配置 J-Link

  1. 在 Options for Target - Debug 里选 J-LINK / J-TRACE Cortex。
  2. 点 Settings,确认 Port 选 SW (SWD 模式),Max Clock 我一般设 10MHz,稳定。
  3. Flash Download 标签页里,点 Add,选你的芯片型号对应的 Flash 算法。比如 STM32F407 选 STM32F4xx Flash。
关键点:如果下载时报错 Flash Timeout,多半是复位电路有问题,或者 SWD 线太长。我遇到过用 20cm 杜邦线,死活连不上,换成 10cm 屏蔽线就好了。

3.3.3 配置 ST-Link

  1. 在 Options for Target - Debug 里选 ST-Link Debugger。
  2. 点 Settings,Port 选 SW,Max Clock 默认 4MHz 就行。
  3. 同样在 Flash Download 里添加 Flash 算法。

ST-Link 有个好处:自带虚拟串口。调试时不用额外接 USB 转串口模块。你想想看,省一个 USB 口,桌面清爽不少。

3.4 调试实战:第一个断点

配置好了,咱们试试能不能跑起来。按 Ctrl+F5 下载,然后 F5 全速运行。如果一切正常,LED 应该闪起来了。

想设断点?在代码行号左边点一下,出现红色圆点就行。我习惯在 main() 函数第一行设一个,看看程序有没有跑进来。

调试时,Watch 窗口可以看变量值,Call Stack 看函数调用栈。RTOS 调试时,我经常用 RTOS Threads 窗口(Keil 自带),能看到每个任务的状态、栈使用率。

我曾经遇到过:设了断点,但程序不停。检查发现是优化等级太高,代码被重排了。把优化降到 -O0,断点就正常了。调试时别开高优化,这是铁律。

3.5 知识体系总览

下面这张图,把本章的核心逻辑串起来了。你一看就明白:环境搭建不是孤立的事,它连着芯片、调试器、工程配置和调试手段。

嵌入式开发环境搭建知识体系 嵌入式开发环境搭建知识体系 Keil MDK 核心 安装与激活 版本选择:Lite / Plus / Pro Pack 安装:芯片支持包 License 激活 工程配置 Target 选项:晶振、MicroLIB C/C++ 编译选项:Define、优化 源文件组织:Group 管理 调试器配置 J-Link:高速、硬件断点 ST-Link:虚拟串口、低成本 Flash 算法配置 调试实战 断点设置 · Watch 变量 · RTOS 任务调试

从图里能看出来,Keil MDK 是枢纽,连接着安装、配置和调试三大块。每一块都有细节,但核心就一句话:让代码能编译、能下载、能调试。

环境搭好了,后面写 RTOS 驱动、调任务调度,才有底气。你想想看,如果连灯都点不亮,还谈什么嵌入式开发?