3. 开发环境搭建与第一个工程

在开始 SAM 工业控制产品开发之前,先把工具链搭起来,是后续所有工作的前提。本节以 SAM 系列(如 SAM D5x/E5x、SAM RH71 等 Cortex-M 器件)为例,完整走一遍从安装 MPLAB X IDE、配置 Harmony 3、连接编译器与调试器,到新建工程、点亮 LED、串口打印,并理解工程目录结构与构建配置的全过程。文中出现的器件型号、引脚号、时钟频率、波特率等均为教学示例,实际使用时请以所选 SAM 器件的数据手册和开发板原理图为准。

一、工具链组成与安装顺序

Microchip 的 SAM 开发工具链由四部分组成:MPLAB X IDE(集成开发环境,基于 NetBeans)、XC32 编译器(针对 32 位 ARM Cortex-M 的 GCC 工具链)、Harmony 3(外设库与中间件框架,通过 MCC 内容管理器配置)、以及调试器/编程器(PICkit 4、Atmel-ICE、J-Link 等)。安装顺序建议为:先装 MPLAB X IDE,再装 XC32 编译器,最后在 IDE 内通过 Tools → Embedded → MPLAB Harmony 3 Content Manager 安装 Harmony 3 包。Harmony 3 采用“内容包 + 代码生成”的方式,安装后会在本地形成 csp、core、bsp 等仓库目录,供 MCC 在新建工程时引用。

调试器方面,PICkit 4 通过 ICSP 接口连接 SAM 的 SWDIO/SWCLK;Atmel-ICE 支持 SWD 与 JTAG,常用于 SAM 系列;J-Link 在 SEGGER 驱动下也可被 MPLAB X 识别。三者都需在 IDE 的 Project Properties → Conf: [default] → Hardware Tool 中选择对应型号,并确认目标板供电与参考电压(VREF)匹配,否则会出现“Target device not found”或“Device ID 读取失败”。

SAM 开发工具链与调试器连接拓扑 主机(PC) MPLAB X IDE XC32 编译器 Harmony 3 + MCC 调试器 / 编程器 PICkit 4(ICSP/SWD) Atmel-ICE(SWD/JTAG) J-Link(SWD) SAM 目标板 SWDIO / SWCLK / GND VREF / RESET LED / UART 外设 USB SWD/JTAG 构建与运行数据流 源码 .c/.h main.c / app.c XC32 编译 .elf / .hex 调试器烧录 Program / Debug SAM 运行 LED / UART 输出 观察点:LED 闪烁周期、串口打印字符、IDE 输出窗口的构建日志与调试断点

二、新建 SAM 工程与 Harmony 3 配置

在 MPLAB X IDE 中执行 File → New Project,选择 “32-bit MPLAB Harmony 3 Project”,然后指定 Harmony 3 内容包的本地路径(例如 C:\harmony3)。接着选择目标器件,例如 ATSAME54P20A,工具会自动生成一个包含 firmware、src、config 等目录的工程骨架。此时工程还没有外设初始化代码,需要打开 MCC(Tools → Embedded → MPLAB Harmony 3 Configurator)进行图形化配置。

在 MCC 中,先配置时钟:以 SAME54 为例,假设外部晶振为 12 MHz,通过 DFLL 倍频到 120 MHz 作为主时钟,再分频给外设。然后配置 GPIO:把连接 LED 的引脚(示例为 PA14)设为输出,初始电平为低;把 UART 的 TX/RX 引脚(示例为 PB24/PB25)设为 SERCOM 功能。最后配置 SERCOM 为 UART 模式,波特率设为 115200,数据位 8,无校验,1 位停止位。点击 “Generate Code” 后,MCC 会在 config/default 下生成 initialization.c、pin_manager.c、peripheral 等文件,并在 src 下生成 main.c 的框架。

三、GPIO 点灯与串口打印

生成的 main.c 中,SYS_Initialize() 会依次调用时钟、引脚、外设初始化。我们只需在 while(1) 循环里加入 LED 翻转和串口打印。示例代码如下(引脚与延时均为教学示例):

#include "definitions.h"

int main(void)
{
    SYS_Initialize(NULL);

    while (1)
    {
        LED_Toggle();                 // PA14 翻转
        SYSTICK_DelayMs(500);         // 500 ms 延时
        printf("SAM GPIO blink, tick=%lu\r\n", (unsigned long)SYSTICK_GetTick());
    }
}

其中 LED_Toggle() 是 MCC 为 PA14 生成的宏或函数,SYSTICK_DelayMs() 基于 SysTick 实现毫秒延时,printf 需要重定向到 UART。重定向方法是在工程中实现 _mon_putc() 或 _write(),把字符写入 SERCOM 的发送寄存器。若使用 Harmony 3 的 stdio 服务,也可在 MCC 中勾选 “STDIO Redirect to UART”,自动生成重定向代码。

烧录后观察现象:LED 以约 1 Hz 频率闪烁(亮 500 ms、灭 500 ms),串口助手在 115200 波特率下应看到类似 SAM GPIO blink, tick=500 的循环输出。如果 LED 不亮,先检查引脚方向是否设为输出、驱动能力是否足够;如果串口无输出,先确认 TX/RX 是否接反、波特率是否一致、SERCOM 时钟是否使能。

四、工程目录结构与构建配置

Harmony 3 工程的典型目录结构如下:src 存放用户代码(main.c、app.c);config/default 存放 MCC 生成的初始化代码与配置头文件;firmware 存放 Harmony 3 的库文件(csp、core、bsp 等);nbproject 存放 MPLAB X 的工程配置。构建配置在 Project Properties 中管理,关键项包括:编译器优化等级(-O1 或 -Os)、是否启用 -Wall、链接脚本(.ld)选择、堆栈大小、以及调试器型号。对于工业控制产品,建议在开发阶段使用 -O1 并开启警告,发布阶段再切换到 -Os 以减小代码体积。

首次连接调试器时,若 IDE 提示 “Unable to connect”,可先执行一次 “Hold in Reset” 再释放,或检查目标板是否被低功耗模式关闭了 SWD 引脚。Atmel-ICE 与 J-Link 在 SAM 上通常比 PICkit 4 更稳定,建议优先使用。
Harmony 3 的 MCC 生成代码会覆盖 config 目录下的文件,用户逻辑应写在 src 下的独立文件中,避免在生成文件里直接修改,否则重新生成时会丢失。