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 |
1.2 开发板介绍
我们课程使用的是 CMS32 官方评估板。这块板子我用了两年多,稳定性没得说。
板载资源一览:
- 主控:CMS32M5333(64KB Flash / 8KB SRAM)
- LED:2 个用户 LED(PA0、PA1)
- 按键:1 个复位键 + 1 个用户按键(PB0)
- 串口:1 路 USB 转串口(CH340G),直接连到 USART1
- 扩展接口:所有 GPIO 引出,方便外接模块
这里有个细节要注意——板子上的 USB 口既供电又做串口通信,一根线搞定。我在早期项目里经常因为忘记接串口线而抓狂,这块板子就省心多了。
1.3 Keil MDK 安装与配置
Keil MDK 是我们开发 CMS32 的主力 IDE。我建议安装 MDK v5.38 或更新版本,对 Cortex-M0+ 支持更完善。
安装步骤其实不复杂,但有几个坑我得提前告诉你:
- 下载安装包:从 Keil 官网下载 MDK-Arm 安装包
- 安装路径:不要有中文路径!不要有空格!我习惯装到
C:\Keil_v5 - 安装器件包:安装完成后,打开 Pack Installer,搜索并安装
MounRiver::CMS32_DFP器件包 - 注册:如果你有正版 License,直接输入;如果没有,评估版也能用,只是代码限制在 32KB 以内——对我们课程来说完全够用
安装完成后,我们来验证一下环境:
- 打开 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 的步骤:
- 新建一个空工程,选择 CMS32M5333
- 在工程中添加以下分组(Group):
CMSIS、Periph_Driver、User - 将固件库中的对应文件添加到分组中
- 配置头文件路径:
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)
- 板子是否上电
- 复位线是否连接正常
本章知识体系
下面这张图,帮你理清本章的知识脉络:
看到这张图,你应该能感受到本章的逻辑:从芯片认知开始,到开发板熟悉,再到工具链搭建,最后用 LED 程序验证整个链路是否通畅。每一步都是下一步的前提,缺一不可。
好了,第一章的内容就到这里。环境搭好了,LED 亮了,恭喜你——你已经迈出了嵌入式开发的第一步。后面的课程,我们会在这个基础上,一步步深入串口通信和 Bootloader 的世界。