3. 开发环境搭建:Keil MDK安装与配置、CMS32设备支持包安装、第一个LED点灯工程验证

说实话,搞嵌入式开发,环境搭不好,后面全是坑。我见过太多新手卡在编译报错上,结果发现是工具链没配对。这一章,咱们就把CMS32的开发环境从头捋一遍。

3.1 开发环境全景图

先看整体结构。CMS32的开发环境分三层:

CMS32 开发环境三层架构 应用层:用户代码 + CMSIS + 外设驱动 Keil MDK IDE + ARM Compiler 6 中间层:CMS32 设备支持包 (DFP) 启动文件 · 链接脚本 · SVD · Flash算法 底层:调试器 + 硬件 J-Link / CMSIS-DAP → CMS32 目标板 三层缺一不可,否则编译或调试会报错

说白了,Keil MDK是IDE和编译器,DFP是芯片的“身份证”,调试器是连接电脑和板子的桥梁。这三样配齐了,才能开始写代码。

3.2 Keil MDK 安装与配置

3.2.1 版本选择

我个人习惯用 MDK v5.38 或更新版本。为什么?因为ARM Compiler 6对Cortex-M0+的支持更完善,编译出来的代码也更小。

版本编译器推荐场景
MDK v5.36AC5 + AC6兼容旧项目
MDK v5.38AC6 默认新项目首选
MDK v5.40+AC6 only最新特性,但需注意DFP兼容性
小提示: 如果你手头有旧项目用了AC5,建议保留MDK v5.36。但新项目直接上v5.38,省心。

3.2.2 安装步骤

  1. 下载安装包:从ARM官网或Keil官网获取MDK v5.38安装程序。
  2. 运行安装:一路Next,注意安装路径不要有中文和空格。我习惯装到 C:\Keil_v5。
  3. 激活License:安装完成后打开Keil MDK,File → License Management,输入你的License ID Code。
  4. 安装ARM Compiler:如果安装包没带AC6,需要单独下载ARM Compiler 6并配置路径。
注意: 安装路径有中文会导致某些插件无法加载。我曾经帮一个同事排查了半天,最后发现是“D:\开发工具\Keil”这个路径惹的祸。

3.3 CMS32 设备支持包安装

设备支持包(DFP)是Keil认识CMS32芯片的关键。没有它,你连芯片型号都选不到。

3.3.1 获取DFP

有两种方式:

  • 在线安装:Keil MDK内,点击 Pack Installer → 搜索 "CMS32" → 点击 Install。
  • 离线安装:从芯片厂商官网下载 .pack 文件,双击安装。

我个人推荐离线安装。为什么?因为在线安装经常因为网络问题失败,尤其是公司内网环境。我遇到过好几次下载到一半断掉,然后Pack Installer卡死的情况。

3.3.2 验证安装

安装完成后,打开Keil MDK,新建一个工程,在Device选择界面应该能看到CMS32系列芯片。比如:

CMS32L051
CMS32M53x
CMS32F030
...

如果看不到,说明DFP没装成功。检查一下Pack Installer里是否显示已安装,或者重新安装一次。

关键点: DFP不仅包含芯片定义,还包含启动文件、链接脚本、SVD调试描述文件和Flash编程算法。这些文件在后续开发中都会用到。

3.4 第一个LED点灯工程验证

环境搭好了,咱们来点个灯。这是嵌入式界的“Hello World”,也是验证开发环境是否正常的黄金标准。

3.4.1 新建工程

  1. 打开Keil MDK,Project → New μVision Project。
  2. 选择芯片型号:CMS32L051(或其他你手头有的型号)。
  3. 在弹出的Manage Run-Time Environment窗口中,勾选 CMSIS::CORE 和 Device::Startup。
  4. 点击OK,工程创建完成。

3.4.2 编写代码

新建一个 main.c 文件,写入以下代码:

#include "CMS32L051.h"

void delay(volatile uint32_t count) {
    while(count--);
}

int main(void) {
    // 使能GPIOB时钟
    RCC->AHBENR |= RCC_AHBENR_GPIOBEN;
    
    // 配置PB0为推挽输出
    GPIOB->MODER &= ~GPIO_MODER_MODER0_Msk;
    GPIOB->MODER |= (1 << GPIO_MODER_MODER0_Pos);
    GPIOB->OTYPER &= ~GPIO_OTYPER_OT0;
    
    while(1) {
        GPIOB->BSRR = GPIO_BSRR_BS0;   // 点亮LED
        delay(500000);
        GPIOB->BSRR = GPIO_BSRR_BR0;   // 熄灭LED
        delay(500000);
    }
}
注意: 不同CMS32型号的GPIO寄存器地址可能不同。务必参考对应型号的数据手册。我刚开始用CMS32L051时,就因为看错了寄存器偏移量,折腾了半小时。

3.4.3 配置调试器

点击 Project → Options for Target → Debug 选项卡:

  • 选择调试器:J-Link / CMSIS-DAP / ST-Link(根据你的硬件)。
  • 点击 Settings,确认SWD接口能识别到芯片ID。
  • 在 Flash Download 选项卡中,添加对应的Flash算法文件(DFP已自动包含)。

3.4.4 编译与下载

  1. 按 F7 编译工程。如果零错误零警告,恭喜你,环境没问题。
  2. 连接开发板,按 F8 下载程序。
  3. 如果一切正常,板子上的LED应该开始闪烁。
常见问题:
  • 编译报错 "device not found" → DFP没装好,重新安装。
  • 下载报错 "Flash Download failed" → 检查Flash算法是否选对,或者板子供电不足。
  • LED不亮 → 检查GPIO引脚是否正确,或者LED是否焊反了(别笑,我犯过这错)。

3.5 工程结构说明

一个标准的CMS32工程,文件结构应该是这样的:

文件/文件夹说明
main.c用户主程序
startup_CMS32L051.s启动文件(汇编)
system_CMS32L051.c系统时钟初始化
CMS32L051.h外设寄存器定义
CMS32L051.ld链接脚本(分散加载文件)

这些文件大部分由DFP自动提供,你只需要关注 main.c 即可。但了解它们的用途,对后续调试会有帮助。

3.6 避坑指南

最后,分享几个我踩过的坑:

  • 路径问题:工程路径不要有中文、空格、特殊字符。我习惯用 D:\Projects\CMS32\LED_Blink 这种纯英文路径。
  • 编译器版本:DFP可能对编译器版本有要求。如果编译报一些奇怪的语法错误,检查一下是不是用了太老的编译器。
  • 调试器驱动:J-Link需要安装驱动,否则Keil识别不到。去SEGGER官网下载最新驱动。
  • 板子供电:有些开发板需要外部供电,单靠调试器的3.3V可能带不动。如果下载后没反应,先检查电源。

嗯,到这里,开发环境就搭好了。LED能闪起来,说明Keil MDK、DFP、调试器、硬件链路全部打通。后面咱们就可以正式开始Bootloader的开发了。