1. 课程导学与开发环境搭建

各位同学,欢迎来到《CMS32 串口通信调试与 Bootloader 实战》的第一课。

说实话,嵌入式开发入门,最怕的不是代码写不对,而是环境搭不起来。我见过太多新手卡在“点不亮 LED”这一步,然后就放弃了。其实说白了,只要把开发环境理顺,后面的事情就水到渠成了。

这一章,我们先把地基打牢。我会带着你从芯片选型、开发板认识,一路走到 Keil MDK 安装、固件库导入,最后亲手点亮第一个 LED。嗯,咱们一步一步来。

1.1 CMS32 系列芯片概述

CMS32 系列,是中微半导体推出的 32 位 ARM Cortex-M0+ 内核微控制器。我最早接触这个系列是在一个工业传感器项目里,当时看中的就是它的低功耗和丰富的外设资源。

这个系列有几个核心特点:

  • 内核:ARM Cortex-M0+,主频最高 48MHz,性价比极高
  • 存储:Flash 从 32KB 到 128KB,SRAM 从 4KB 到 16KB,覆盖大部分应用场景
  • 外设:USART、SPI、I2C、ADC、定时器、PWM 一应俱全
  • 封装:从 TSSOP20 到 LQFP64,灵活适配不同板级空间

我个人习惯把 CMS32 看作“小身材、大能量”的代表。你想想看,一个 TSSOP20 封装的芯片,居然能跑两个串口、一个 SPI、一个 I2C,还能做 PWM 输出——这在几年前是不敢想的。

型号 Flash SRAM USART 封装
CMS32M5333 64KB 8KB 2 LQFP48
CMS32M5510 128KB 16KB 3 LQFP64
CMS32L051 32KB 4KB 1 TSSOP20
选型小贴士:如果你的项目只需要一个串口做调试,CMS32L051 就够用了。但如果要做 Bootloader,我建议至少选 64KB Flash 的型号,因为 Bootloader 本身会占用 8-16KB 空间。

1.2 开发板介绍

我们课程使用的是 CMS32 官方评估板。这块板子我用了两年多,稳定性没得说。

板载资源一览:

  • 主控:CMS32M5333(64KB Flash / 8KB SRAM)
  • LED:2 个用户 LED(PA0、PA1)
  • 按键:1 个复位键 + 1 个用户按键(PB0)
  • 串口:1 路 USB 转串口(CH340G),直接连到 USART1
  • 扩展接口:所有 GPIO 引出,方便外接模块

这里有个细节要注意——板子上的 USB 口既供电又做串口通信,一根线搞定。我在早期项目里经常因为忘记接串口线而抓狂,这块板子就省心多了。

注意:上电前请确认板子上的跳线帽位置正确。特别是 BOOT 跳线,如果设置错误,芯片会进入系统存储器模式,你下载的程序就跑不起来了。我曾经因为这个排查了整整一下午。

1.3 Keil MDK 安装与配置

Keil MDK 是我们开发 CMS32 的主力 IDE。我建议安装 MDK v5.38 或更新版本,对 Cortex-M0+ 支持更完善。

安装步骤其实不复杂,但有几个坑我得提前告诉你:

  1. 下载安装包:从 Keil 官网下载 MDK-Arm 安装包
  2. 安装路径:不要有中文路径!不要有空格!我习惯装到 C:\Keil_v5
  3. 安装器件包:安装完成后,打开 Pack Installer,搜索并安装 MounRiver::CMS32_DFP 器件包
  4. 注册:如果你有正版 License,直接输入;如果没有,评估版也能用,只是代码限制在 32KB 以内——对我们课程来说完全够用
避坑指南:安装 Pack 时,记得勾选所有依赖包。我遇到过有人只装了 CMS32_DFP,结果编译时报错说找不到 CMSIS Core,就是因为没装 CMSIS 包。

安装完成后,我们来验证一下环境:

  • 打开 Keil MDK,点击 Project → New μVision Project
  • 选择芯片型号:MounRiver → CMS32M5333
  • 如果能正常弹出 Manage Run-Time Environment 窗口,说明器件包安装成功

1.4 CMS32 固件库导入

CMS32 官方提供了完整的固件库,封装了寄存器操作。我个人建议新手先用固件库,等熟悉了再去看寄存器。

固件库的结构是这样的:

CMS32_StdPeriph_Lib/
├── Libraries/
│   ├── CMSIS/
│   │   ├── Include/          # 内核头文件
│   │   └── Source/           # 启动文件
│   └── CMS32M5xx_StdPeriph_Driver/
│       ├── inc/              # 外设头文件
│       └── src/              # 外设源文件
├── Project/
│   └── Template/             # 工程模板
└── User/
    └── main.c                # 用户主函数

导入到 Keil 的步骤:

  1. 新建一个空工程,选择 CMS32M5333
  2. 在工程中添加以下分组(Group):CMSIS、Periph_Driver、User
  3. 将固件库中的对应文件添加到分组中
  4. 配置头文件路径:Options for Target → C/C++ → Include Paths
我的习惯:我会把固件库复制一份到工程目录下,而不是直接引用原始路径。这样工程移植到别的电脑时,不会因为路径问题报错。

1.5 第一个 LED 闪烁程序

好了,环境搭好了,我们来写第一个程序。点亮 LED,是嵌入式界的“Hello World”。

先看代码:

#include "CMS32M5xx.h"

void Delay(uint32_t count) {
    while(count--) {
        __NOP();
    }
}

int main(void) {
    // 使能 GPIOA 时钟
    RCC_EnableAPB2PeriphClock(RCC_APB2_PERIPH_GPIOA, ENABLE);
    
    // 配置 PA0 为推挽输出,50MHz
    GPIO_InitTypeDef GPIO_InitStruct;
    GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0;
    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOA, &GPIO_InitStruct);
    
    while(1) {
        GPIO_SetBits(GPIOA, GPIO_Pin_0);   // LED 亮
        Delay(500000);
        GPIO_ResetBits(GPIOA, GPIO_Pin_0); // LED 灭
        Delay(500000);
    }
}

代码逻辑很简单:

  • 使能 GPIOA 时钟——这是 Cortex-M 的特点,外设用之前必须先开时钟
  • 配置 PA0 为推挽输出——LED 正极接 PA0,负极通过电阻接地
  • 主循环里交替拉高、拉低 PA0,中间加延时

编译通过后,点击 Download 按钮,程序就会烧录到芯片里。如果一切正常,你会看到板子上的 LED 以大约 1 秒的频率闪烁。

常见问题:如果下载时报错 Flash Download failed - Target DLL has been cancelled,请检查:
  • 调试器是否选择正确(CMS32 用 CMS-DAP 或 J-Link)
  • 板子是否上电
  • 复位线是否连接正常
我遇到过最离谱的一次,是下载线接触不良,换了根线就好了。

本章知识体系

下面这张图,帮你理清本章的知识脉络:

第一章知识体系图 第一章:课程导学与开发环境搭建 开发环境搭建 CMS32芯片概述 开发板介绍 Keil MDK安装 固件库导入 LED闪烁程序 核心目标 • 掌握CMS32芯片选型要点 • 独立搭建Keil开发环境 • 成功点亮第一个LED 基础 → 环境 → 实践,三步走通嵌入式开发第一步

看到这张图,你应该能感受到本章的逻辑:从芯片认知开始,到开发板熟悉,再到工具链搭建,最后用 LED 程序验证整个链路是否通畅。每一步都是下一步的前提,缺一不可。

好了,第一章的内容就到这里。环境搭好了,LED 亮了,恭喜你——你已经迈出了嵌入式开发的第一步。后面的课程,我们会在这个基础上,一步步深入串口通信和 Bootloader 的世界。