1. 引言:为什么需要走出 STM32 的舒适圈?
在嵌入式开发或者说MCU开发的江湖里,STM32 毫无疑问是当今的"武林盟主"。它的资料众多,生态极其成熟,从零开始学习非常简单,以至于很多工程师或者学生(包括博主自己)在很长一段时间里都觉得:"学会 STM32 就够了,其他 ARM Cortex-M 单片机不都大同小异吗?"然而,当我们把目光投向更广阔的工业控制、汽车电子或者低功耗物联网领域时,Microchip(微芯)的 SAM 系列 MCU 却是一个无法忽视的存在。
为什么要花时间从零开始学习 SAM D21? 不仅仅是为了多掌握一款芯片,更是为了掌握一种全新的开发思维。如果说 STM32 代表了"标准库/HAL库"的经典开发模式,那么 Microchip 的 SAM 系列配合 Harmony v3 框架**,**则代表了"图形化配置与组件化开发"的另一种极致。借助MCC,你仅需要进行图形化配置,配置好后便可一键生成所有代码和完整工程。
2. 深度对比:SAM D21 vs STM32 架构解析
对于习惯了 STM32 及其开发环境的开发者来说,初使用SAM D21进行开发时可能会觉得"水土不服"。为帮助大家快速建立概念,整理了这两者在核心架构设计上的主要差异。
| 特性维度 | STM32 (主流 Cortex-M) | Microchip SAM D21 | 差异深度解析 |
|---|---|---|---|
| 时钟系统 | RCC 树状结构 时钟源相对固定,通常是系统时钟分频给外设(APB1/APB2)。 | GCLK (Generic Clock Controller) 极度灵活。每个外设都可以独立选择时钟发生器。 | SAM 的杀手锏。比如你可以让 CPU 跑在 48MHz,但让 ADC 独自跑在 1MHz 的超低功耗时钟下,互不干扰。这在低功耗设计中优势巨大。 |
| 通信接口 | 独立外设 UART1, SPI1, I2C1 是独立的硬件模块,引脚复用(AF)有限制。 | SERCOM (Serial Communication) 全能复用模块。一个 SERCOM 模块可以通过软件配置成 UART、SPI 或 I2C。 | PCB 布线的福音。引脚映射极其自由,不再受限于"UART1 只能在 PA9/PA10"这种死规定。 |
| 事件联动 | EXTI / DMA 触发 外设间联动主要靠中断或 DMA 链表。 | EVSYS (Event System) 硬件级联动 。外设 A 的信号直接触发外设 B,完全不经过 CPU。 | 比如定时器溢出直接触发 ADC 采样,CPU 可以完全休眠,响应速度是零延迟且确定性的。 |
| 开发思维 | 库函数导向 主要调用 HAL_xxx_Init() 等 API。 |
框架导向 (Harmony) 强依赖 MCC 图形化配置,代码生成逻辑更严密。 | SAM D21 的开发更像是在"搭积木",底层驱动(PLIB)非常薄且高效。 |
3. 搭建 MPLAB 开发环境
Microchip(微芯)的 SAM 系列以及很多其自家 MCU 使用的开发环境是MPLAB X IDE。从 Keil MDK 或 IAR 迁移到 MPLAB X IDE,是很多人的劝退点。这里的环境搭建不仅仅是装个软件那么简单,你首先需要去理解 Microchip 工具链的模块化设计。
3.1 核心工具链三件套
不同于 Keil 这种"一站式"软件,Microchip 的开发环境由三个独立部分组成,必须分别安装:
IDE (集成开发环境): MPLAB X IDE
基于 NetBeans 开发,跨平台(Windows/Linux/Mac)。界面风格虽然偏旧,但代码提示、调试功能非常强大。在官网上即可一站式下载安装。
Compiler (编译器): MPLAB XC32
基于 GCC 优化的编译器。对于 SAM D21 这种 32 位 MCU,必须安装 XC32(XC8 是给 8 位机的,XC16 是给 16 位机的)。注意:安装IDE时会自动提示安装编译器,记得选择安装,IDE 会自动识别。
Configurator (配置工具): MCC (MPLAB Code Configurator)
这是灵魂所在! 它相当于 STM32CubeMX,在旧版本的MPLAB X IDE中它是以IDE 插件 的形式存在的。安装方法 :打开 MPLAB X IDE -> Tools -> Plugins -> Available Plugins -> 搜索安装 MPLAB Code Configurator。新版MPLAB X IDE(v6及以上)将MCC集成到了其中无需单独下载安装。
3.2 什么是 Harmony v3?
初学者常听到"Harmony v3",容易把它和鸿蒙系统搞混(博主最开始以为这两个有什么联系)。在 Microchip 的语境下,Harmony v3 是一个庞大的嵌入式软件开发框架。它不是一个软件,而是一堆库文件(Libraries)。它包含了:
BSP (Board Support Package):最底层的寄存器定义和驱动(类似 CMSIS)。
Core:RTOS 适配层、系统服务(时钟、中断)。
Middleware:USB 协议栈、TCP/IP 协议栈、文件系统等。
当你第一次在 IDE 中启动 MCC 时,它会提示你下载 Harmony框架 / Content Manager。把 csp、dev_packs 和 mhc 这几个基础包下载到本地(通常默认放在 C:\microchip\harmony\v3 目录下)。利用其,你不需要手写底层配置代码,而是通过这个图形界面:
-
选择和配置 MCU 型号及引脚。
-
"拖拽式"添加软件组件(如 UART 驱动、FreeRTOS、TCP/IP 栈等)。
-
可视化配置组件参数(如波特率、堆栈大小、IP地址等)。
-
自动解析依赖关系:当你添加一个依赖其他组件的模块时,它会自动帮你添加所有必要的底层模块。
-
一键生成初始化代码和项目框架,生成的代码结构清晰、注释完整。
4. 实战演练:从零点亮 Curiosity Nano
在MPLAB X IDE、MPLAB XC32、MCC都下载安装好后便可来体验完整的 MPLAB 开发流程了!下面通过一个最经典的"点灯"项目来介绍通用开发流程。
4.1 硬件准备
本次使用的是 SAM D21 Curiosity Nano 评估板。该板自带板载调试器(nEDBG),插上 USB 就能仿真和打印串口,不需要额外的调试器。MPLAB X IDE版本为v6.25,xc32版本为v5.00。
4.2 创建工程
-
打开 MPLAB X IDE,点击
File->New Project。 -
在 Category 中选择
Microchip Embedded/Microchip嵌入式,在 Projects 中选择独立项目*。*

- 选择器件,选择目标芯片型号
ATSAMD21G17D。

- 选择编译器

- 选择项目名称和文件夹后结束创建工程。

4.3 MCC 图形化配置 (The Magic Moment)
通常在创建工程结束后会自动初始化工程并打开MCC,如果没打开则点击 IDE 顶部工具栏那个蓝色的盾牌图标(MCC)。

第一步:Project Graph(项目视图)
这是 MCC 的核心视图。你会看到几个默认的方块(组件):
-
System:负责系统初始化。
-
**NVMCTRL:**非易失性存储控制器,管理MCU内部Flash存储器。
-
**EVSYS:**事件系统,实现外设间硬件级直接通信。
-
**Device Family Pack (DFP):**芯片的"软件定义文件",包含具体MCU型号的寄存器定义、内存映射、中断向量表等。
-
**CMSIS Pack:**ARM Cortex-M内核的标准软件接口。
第二步:引脚配置
点击 Plugins -> Pin Configuration
选择引脚配置工具后,将显示以下三个窗口,可用于配置应用程序的所有引脚功能。Pin Settings 、Pin Table、Pin Diagram。要打开 LED,SAM D21 Curiosity Nano 板的原理图(PCB 上 LED 下方的丝印)将引脚 PB10 定义为连接板载 LED 的引脚。在下图中,PB10 被配置为带有功能列下拉菜单的 GPIO 输出。此外,还为该引脚提供了自定义的 LED 名称,用于命名由配置工具生成的函数或宏。

在为 PB10 更新引脚属性后的引脚设置中,可以在Pin Table窗口中看到自定义名称。高亮显示的框表示这些引脚被定义为用作 GPIO。

Pin Diagram窗口将显示封装方向的修改,以帮助进行布局类型的决策。

在引脚设置窗口中定义了 LED 引脚后,通过点击Project Resources-Generate来生成项目。

下图展示了生成的projects,可查看由 MPLAB Harmony v3 配置器生成的新文件。查看 plib_port.h 文件,确定点亮 LED 所需的内容已生成。双击 plib_port.h 文件以在工作区中打开它。

最后一步,在 main 中调用 LED_Toggle 函数,实现LED点亮。

通过USB线连接SAM D21 Curiosity Nano 板后MPLAB会自动识别(因其内部具备SAM板的串口驱动,无需额外下载配置),编译并下载项目可查看到LED常亮。

5.开发流程对比:STM32CubeMX vs MPLAB MCC
| 步骤 | STM32CubeMX + Keil | MPLAB X IDE + MCC | 体验差异 |
|---|---|---|---|
| 配置入口 | 独立软件 CubeMX | IDE 内嵌插件 MCC | MPLAB 无需切换软件,修改配置后直接点击 Generate,无缝衔接。 |
| 代码生成 | 生成 main.c 及 HAL 库文件 | 生成 plib_xxx.c 及初始化代码 | MCC 生成的代码更加模块化,底层驱动(PLIB)通常比 HAL 库更精简、执行效率更高。 |
| API 调用 | HAL_GPIO_TogglePin(GPIOA, PIN) |
LED_Toggle() |
Microchip 的 API 命名通常更直观,基于你自定义的名称。 |
从 STM32 迁移到 SAM D21,最大的挑战不在于 C 语言本身,而在于开发环境的适应 和对"配置+框架"思维的接受。
-
STM32 像是一个装备齐全的工具箱,给你提供了所有标准工具(HAL库)。
-
SAM D21 + Harmony 更像是一套乐高积木,通过 MCC Project Graph,你可以清晰地看到时钟是如何流向外设的,DMA 是如何挂载到 SPI 上的。这种可视化的逻辑连接,一旦习惯了,会让你对系统的理解更加深刻!