1. Harmony 3平台全景与开发环境搭建
Microchip 的 32 位产品线覆盖 SAM 系列 ARM Cortex-M 单片机、PIC32 系列 MIPS 单片机,以及 SAMA5/SAM9 等 Cortex-A 微处理器。这些器件在寄存器层面差异很大,如果每个项目都从寄存器写起,代码复用率极低。Harmony 3 就是为解决这一问题而生的统一软件框架:它把外设驱动、中间件协议栈、RTOS、图形库、文件系统等以"模块"形式组织起来,通过图形化的配置工具生成初始化代码,让开发者把精力放在应用逻辑上,而不是重复搭建底层。
Harmony 3 在开发生态中的位置
理解 Harmony 3 的定位,关键是分清它和 MPLAB X IDE、编译器、器件包之间的关系。MPLAB X IDE 是宿主开发环境,负责工程管理、编辑、编译调度和调试;XC32 编译器负责把 C 代码翻译成目标机器码;器件包(Device Pack,DFP)提供具体芯片的头文件、链接脚本和启动代码;而 Harmony 3 提供的是"可配置的软件组件库"。四者缺一不可,但职责边界清晰。
Harmony 3 内部又分为三层。最底层是 CSP(Core Support Package),直接封装外设寄存器,提供 PLIB(Peripheral Library)接口,例如 PLIB_GPIO_PinWrite() 这类函数。中间层是 驱动与中间件,包括 USART/I2C/SPI 驱动、TCP/IP 协议栈、USB 协议栈、File System、FreeRTOS 等。最上层是 应用代码,由开发者编写。配置工具根据图形界面的选择,自动生成 plib_*.c/h、drv_*.c/h、system_config 等文件,把三层粘合起来。
安装顺序与关键选择
环境搭建有一条隐含的依赖链:先装 IDE,再装编译器,然后装器件包,最后装 Harmony 3 内容包。顺序颠倒会导致 MCC 找不到编译器或器件定义。以 Windows 平台为例,推荐流程如下。
第一步,从 Microchip 官网下载 MPLAB X IDE 安装包。当前主流版本为 v6.x,安装时勾选"安装 USB 驱动"和"关联 .X 工程文件"。安装路径建议保持默认,避免中文路径和空格,否则后续编译器调用可能失败。
第二步,安装 XC32 编译器。XC32 有免费版和 PRO 版,免费版在 -O0 到 -O2 优化级别下功能完整,仅代码密度和部分高级优化受限,学习阶段完全够用。安装完成后,在 MPLAB X 的 Tools → Options → Embedded → Build Tools 中确认 XC32 已被自动识别;若未识别,手动添加其 bin 目录。
第三步,安装 Device Pack。在 MPLAB X 中打开 Tools → Packs,在 Device Packs 标签页搜索目标芯片型号,例如 SAM D21 或 PIC32MX,点击 Install。器件包体积较大,建议只装当前项目用到的系列。
第四步,安装 Harmony 3 Content Manager。它有两种形态:一是作为 MPLAB X 的插件,二是独立的 Content Manager 工具。推荐在 MPLAB X 中通过 Tools → Plugins → Available Plugins 安装 "Harmony 3 Content Manager"。安装后,在 Tools → Embedded → Harmony 3 Content Manager 中可浏览和下载各组件包,如 csp、core、bsp、net、usb 等。
创建第一个 Harmony 3 工程
下面以 SAM D21 Xplained Pro 开发板、目标芯片 ATSAMD21J18A 为例,走通一个"LED 闪烁"工程。这个例子虽小,但覆盖了从工程创建到下载运行的完整链路。
在 MPLAB X 中选择 File → New Project,类别选 Microchip Embedded,工程类型选 32-bit MPLAB Harmony 3 Project。下一步选择 Harmony 3 框架路径,即 Content Manager 下载组件所在的目录。接着选择目标器件 ATSAMD21J18A,工具链选 XC32,最后指定工程名和保存路径。
工程创建后会自动打开 MCC 配置界面。在 Project Graph 中,从左侧组件库拖入所需模块。对于 LED 闪烁,需要三个组件:Core(系统时钟与中断)、Ports(GPIO 引脚控制)、System(系统服务)。拖入后,在 Pin Configuration 视图中找到开发板上 LED 对应的引脚。SAM D21 Xplained Pro 的黄色 LED 连接在 PA17 上,将其功能设为 GPIO Output,并命名为 LED0。
在 Clock Configuration 中确认系统时钟源。默认使用内部 8 MHz RC 振荡器经 PLL 倍频到 48 MHz,作为 CPU 主频。若使用外部晶振,需在 SYSCTRL 中使能 XOSC 并等待稳定标志。学习阶段保持默认即可。
点击 Generate Code,MCC 会在工程中生成 config/default/ 目录,包含 initialization.c、pin_manager.c、plib_port.c 等文件。此时打开 app.c,在 APP_Tasks() 函数中写入闪烁逻辑:
void APP_Tasks(void)
{
static uint32_t ledState = 0;
static uint32_t tickCount = 0;
if (++tickCount >= 500) {
tickCount = 0;
ledState = !ledState;
if (ledState) {
LED0_Set(); /* PA17 输出高电平,点亮 LED */
} else {
LED0_Clear(); /* PA17 输出低电平,熄灭 LED */
}
}
}
这里 LED0_Set() 和 LED0_Clear() 是 MCC 根据引脚名自动生成的宏,底层调用 PLIB_PORT_PinWrite()。主循环中 APP_Tasks() 被反复调用,tickCount 每轮加一,累计到 500 次翻转一次 LED 状态。若主循环单次执行约 1 ms,则闪烁周期约为 1 秒。实际周期取决于主循环耗时,精确计时应改用 SysTick 或 Timer 中断。
编译、下载与结果判断
点击工具栏的 Clean and Build 按钮,MPLAB X 调用 XC32 编译整个工程。编译成功后,Output 窗口会显示类似 BUILD SUCCESSFUL (total time: 3s) 的信息,并在 dist/default/production/ 下生成 .hex 和 .elf 文件。若出现 undefined reference 错误,通常是 MCC 未生成代码或组件未正确添加;若出现 cannot find device header,则是器件包未安装或型号选错。
将开发板通过 USB 连接到 PC,MPLAB X 会自动识别板载调试器。点击 Make and Program Device,IDE 先编译,再通过调试器把程序烧录到芯片 Flash,最后复位运行。观察开发板上的黄色 LED,若以约 1 秒周期稳定闪烁,说明工程创建、配置、编译、下载全链路打通。
如果 LED 不亮,按以下顺序排查:用万用表测量 PA17 电压是否在 0 V 与 3.3 V 之间跳变;检查 Pin Configuration 中 PA17 是否确实被设为输出;确认 APP_Tasks() 是否在 main() 的 while 循环中被调用;检查开发板供电跳线是否处于正确位置。这套排查思路同样适用于后续更复杂的外设调试。