)
摘要本文围绕 HPMicro HPM6E8Y 自定义开发板的基础开发流程系统整理了一个已在 Segger Embedded StudioSES中成功运行的 LED 闪烁工程从 RAM 调试模式迁移至外部 QSPI NOR Flash 的完整过程。工程初始状态下程序能够在 RAM 模式中正常编译、下载和运行但切换至flash_xip构建类型后先后出现链接脚本参数未定义、SES 工程未生成、Flash 下载阶段卡死等问题。通过检查自定义开发板 YAML 文件的层级结构、清理旧构建目录、补充 OpenOCD 板级 CFG 文件中的 XPI Flash 描述与复位初始化逻辑最终实现了程序的正常烧写、调试和断电后独立启动。本文进一步分析了hpm_led.cfg中flash bank、reset-init、gdb-attach等配置项的作用并说明了 YAML、CFG、链接脚本和 BootROM Flash 配置之间的关系。该过程可作为 HPM6E8Y 自定义开发板从最小 GPIO 验证向定时器、PWM、ADC 及电机控制开发过渡的基础参考。关键词HPM6E8YSegger Embedded StudioOpenOCDFlash XIPQSPI NOR Flash自定义开发板HPM SDK1. 引言在 HPM6E8Y 自定义开发板的早期验证阶段RAM 调试通常是最简单且最直接的方式。程序通过调试器下载到片内 RAM 后即可运行适合验证MCU 与调试器之间的 JTAG 连接时钟初始化GPIO 引脚复用基础代码结构LED 等简单外设功能。然而RAM 中的程序在断电后会丢失无法实现独立启动。因此在完成基础硬件验证后需要将工程迁移到外部 QSPI NOR Flash并使用 XIPExecute In Place方式运行。本次工程的最终目标为保留已经成功运行的 SES LED 闪烁工程将构建类型从ram切换至flash_xip将程序烧写到 16 MiB 外部 QSPI NOR Flash在BOOT00、BOOT10的实际板级配置下实现断电重新上电后 LED 自动闪烁。2. 实验平台与工程基础本次实验使用的主要硬件条件如下项目配置主控 MCUHPMicro HPM6E8YSoC 配置HPM6E80外部 Flash16 MiB QSPI NOR FlashFlash 类型qspi-nor-flash外部 RAM32 MiB SDRAM调试器FT2232调试接口JTAGLED 引脚PA9启动电平BOOT00BOOT102.2 软件环境项目配置HPM SDK Envv1.12.1IDESegger Embedded Studio调试服务OpenOCD构建系统CMake NinjaRAM 构建类型ramFlash 构建类型flash_xip2.3 初始工程状态在迁移前工程已经满足以下条件SES 工程能够正常打开LED_B 对应 PA9程序在 RAM 模式下能够正常运行LED 每 500 ms 翻转一次JTAG 下载和单步调试均正常。因此后续问题可以明确限定在外部 Flash 的链接、烧写和启动链路而不是 GPIO、时钟或主程序逻辑本身。3. RAM 模式与 Flash XIP 模式的区别3.1 RAM 调试模式RAM 模式的基本流程为SES / GDB ↓ OpenOCD ↓ JTAG ↓ 程序直接写入片内 RAM ↓ CPU 从 RAM 执行其特点是下载速度快调试方便不依赖外部 Flash断电后程序丢失不适合作为最终产品运行方式。3.2 Flash XIP 模式程序链接到 0x80000000 ↓ OpenOCD 通过 XPI 控制器访问外部 Flash ↓ 擦除、写入并校验程序 ↓ MCU 上电后由 BootROM 初始化 Flash ↓ CPU 直接从外部 Flash 映射区取指运行与 RAM 模式相比Flash XIP 模式额外依赖外部 Flash 容量配置XPI 控制器配置OpenOCD Flash 驱动板级 CFG 文件BootROM 能识别的 NOR Flash 配置正确的启动模式。4. 从 RAM 工程切换到 Flash XIP 工程4.1 修改YAML配置文件向YAML配置文件添加如下内容board:name:hpm_ledsoc:HPM6E80device:HPM6E80xGNxopenocd-soc:hpm6e80-single-coreopenocd-probe:ft2232on-board-ram:type:sdramsize:32Mwidth:16biton-board-flash:type:qspi-nor-flashsize:16M4.2 YAML 的作用HPM SDK 项目生成工具CMake链接脚本生成板级资源识别OpenOCD 配置文件选择。其中on-board-flash:type:qspi-nor-flashsize:16M用于告诉构建系统该开发板存在外部 QSPI NOR Flash可用容量为 16 MiB链接脚本可以为flash_xip工程分配对应的地址空间。2. OpenOCD CFG 文件配置最终使用的hpm_led.cfg内容如下# Copyright (c) 2024 HPMicro # SPDX-License-Identifier: BSD-3-Clause # HPM6E8Y custom board # External QSPI NOR Flash: # Device: MX25L12833F # Capacity: 16 MiB # XPI controller: XPI0 # XIP base address: 0x80000000 flash bank xpi0 hpm_xpi 0x80000000 0x01000000 1 1 $_TARGET0 0xF3000000 0x7 proc init_clock {} { mww 0xF4000800 0xFFFFFFFF mww 0xF4000810 0xFFFFFFFF mww 0xF4000820 0xFFFFFFFF mww 0xF4000830 0xFFFFFFFF echo clocks has been enabled! } $_TARGET0 configure -event reset-init { init_clock } $_TARGET0 configure -event gdb-attach { reset halt }3. CFG 文件逐项分析3.1flash bank命令核心配置为flash bank xpi0 hpm_xpi 0x80000000 0x01000000 1 1 $_TARGET0 0xF3000000 0x7该命令用于向 OpenOCD 声明一个可编程的外部 Flash Bank。其通用结构可以理解为flash bank 名称 驱动 映射地址 容量 芯片宽度 总线宽度 目标CPU 控制器参数 Flash配置参数各字段含义如下3.1.1xpi0xpi0表示 OpenOCD 内部的 Flash Bank 名称。它只是该 Flash 设备在 OpenOCD 中的逻辑名称不是寄存器名。3.1.2hpm_xpihpm_xpi表示使用 HPMicro 提供的 XPI Flash 驱动。该驱动负责通过 HPM6E8Y 的 XPI 控制器访问外部 QSPI NOR Flash。3.1.30x800000000x80000000表示外部 Flash 的 XIP 映射基地址。在flash_xip工程中程序代码会被链接到该地址附近CPU 可以直接从该映射区域取指执行。3.1.40x010000000x01000000表示 Flash 容量为 16 MiB。3.1.51 11 1这是 OpenOCDflash bank命令中的芯片宽度和总线宽度参数。3.1.6$_TARGET0$_TARGET0表示 HPM6E80 单核 OpenOCD 配置中创建的 CPU 调试目标。3.1.70xF30000000xF3000000用于告诉hpm_xpi驱动当前访问的是 HPM6E8Y 的 XPI0 控制器。3.1.80x70x7该值是传递给 HPM XPI Flash 驱动的 Flash 配置选项。在当前工程中它用于配合 SFDP 方式识别和初始化 Flash并与 BootROM 侧的 NOR Flash 配置保持一致。3.2init_clock函数CFG 中定义了proc init_clock {} { mww 0xF4000800 0xFFFFFFFF mww 0xF4000810 0xFFFFFFFF mww 0xF4000820 0xFFFFFFFF mww 0xF4000830 0xFFFFFFFF echo clocks has been enabled! }其中proc表示定义 Tcl 函数。而mww表示向目标 MCU 地址写入一个 32 位数据可理解为*(volatileuint32_t*)addressvalue;这四条写操作用于在 OpenOCD 复位初始化阶段打开 Flash 下载算法所需的相关时钟。最后echo clocks has been enabled!仅用于在 OpenOCD 日志中输出提示不影响硬件功能。3.3reset-init事件$_TARGET0 configure -event reset-init { init_clock }其含义为当 OpenOCD 执行目标复位初始化时自动调用init_clock。流程如下OpenOCD 复位 MCU ↓ 触发 reset-init ↓ 执行 init_clock ↓ 打开相关时钟 ↓ 准备执行 Flash 擦写算法3.4gdb-attach事件$_TARGET0 configure -event gdb-attach { reset halt }其含义为当 SES 中的 GDB 连接到 OpenOCD 时立即复位并暂停 CPU。流程如下SES 启动调试 ↓ GDB 连接 OpenOCD ↓ 触发 gdb-attach ↓ 执行 reset halt ↓ CPU 复位并停住 ↓ 开始擦除、下载和调试这可以避免 Flash 中旧程序继续运行并干扰调试器接管。4. YAML、CFG、链接脚本与 BootROM 的协同关系整个 Flash XIP 启动流程涉及多个不同层级的文件。4.1 YAML 文件hpm_led.yaml面向项目生成工具CMake构建类型筛选链接脚本生成板载存储容量识别。其作用是告诉构建系统“程序应该如何链接”4.2 CFG 文件hpm_led.cfg面向OpenOCDSESGDB外部 Flash 擦除和下载。其作用是告诉调试器“程序应该如何写入 Flash”4.4 完整链路hpm_led.yaml ↓ 生成 flash_xip 链接布局 ↓ 程序被链接到 0x80000000 ↓ hpm_led.cfg ↓ OpenOCD 通过 XPI0 擦除并写入外部 Flash ↓ MCU 断电重新上电 ↓ BootROM 根据启动模式和 NOR 配置初始化 Flash ↓ CPU 从 0x80000000 对应区域取指 ↓ LED 程序独立运行6. Flash XIP 工程生成与下载6.1 选择构建类型在 HPM SDK 项目生成工具中将构建类型从ram修改为flash_xip编译类型继续保持debug新的工程输出目录应类似D:\HPW\workspace\hpm_led\user_app\hpm_led_flash_xip_debug而原 RAM 工程目录为D:\HPW\workspace\hpm_led\user_app\hpm_led_ram_debug两个目录必须分开保留不能相互覆盖。6.2 进行生成后打开IDE编译后进行下载运行开发板上灯按照500ms间隔闪烁。配置成功。