一、开发板简介
1.1 开发板简介
HPM5300 系列 RISC-V CPU 主频高达 480 MHz,内置 288KB SRAM 和 1 MB Flash,并提供 48∼100 脚 LQFP 和 QFN 等封装,为工业自动化,新能源及汽车等应用提供了丰富的算力和高效的控制能力。

1.2 芯片命名规则
下图是命名规则:

下图是 HPM 5300 四款芯片的详细参数:

1.2 开发板外观

二、环境安装
2.1 下载软件列表
安装软件列表:
- Segger Embedded Studio ForRISC-V ( IDE 和编译环境)
- HPM SDK 项目生成工具 (根据芯片生成原始项目)
- HPMicro_Manufacturing_Tool (配置及批量烧写工具)
2.2 下载连接与文档
Segger Embedded Studio ForRISC-V:
HPM SDK 项目生成工具和 HPMicro_Manufacturing_Tool 下载地址:
2.3 安装过程
安装过程没有特别注意事项
三、BOOT 启动选项
3.1 启动概述
根据 HPM5300 用户手册 19.2 启动流程指出:
BootROM 支持如下启动模式:
- 主启动模式 (XPI NOR 启动模式)
- 串行启动模式 (UART, USB-HID)
- 在系统编程模式 (In-System-Programming)

上图中 BOOT_MODE 就是我们两个 BOOT 的 GPIO 引脚电平。
3.2 主启动模式 (XPI NOR 启动模式)
3.2.1 BOOT_MODE 两个引脚的配置
根据 HPM5300 用户手册 20.5 特殊功能引脚 BOOT_MODE 两个引脚的配置指出:
- 当我们的 BOOT0 和 BOOT1 均为 0 的情况下,MCU 在从连接在 XPI0 上的串行 NORFLASH 启动。

3.2.2 XPI0 内存映射地址
根据 HPM5300 用户手册 6.1 系统内存映射 System Memory Map 指出:
XPI0 是我们的串行总线控制器 XPI 存储空间。最终我们的程序也会调到这里 XPI0 中运行。
![]()
3.2.3 XPI NOR 启动流程
根据 HPM5300 用户手册 19.2.2.3 XPI NOR 启动流程指出:
- 当用户选择从 XPI NOR 启动后,设备上电后会按所示流程来执行 XPI NOR 启动。

这个有些复杂,我们暂时不用太关心这张图。
3.3 在系统编程模式 (In-System-Programming)
串行启动模式 (USB-HID) 是我们使用的烧写工具 (HPMicro Programmer) 连接方式,在这里不继续讨论。

3.4 在系统编程模式 (In-System-Programming)

四、如何选择内置 FLASH 启动程序
4.1 内置 FLASH 是怎么连接到 MCU 的
根据 HPM6000 系列 MCU Flash 使用指南(一)------如何使用片内 Flash 手册可知:
- 此类 SIP(System Ina Package) 封装的芯片,使用了 XPI0 的第二组引脚 PX 来连接内部 Flash,这一组引脚只对 SIP 封装芯片才有效。
- 本产品由于使用 XPI0_CA 端口连接了内部 Flash,所以以下 IO 可只以用作 XPI0 功能以外的外设复用功能,例如GPIO,UART 等功能,XPI0 的相关功能在本产品中失效:
根据 HPM5300 用户手册 19.8.2.1 XPI 信息可知:
- 这些引脚默认连接到了 XPI0 功能的 FLASH 中。XPI0 共有两个分组,1 分组连接在芯片外部的 IO 口,我们可以外挂 NOR FLASH 给 XPI0 使用。分组 2 也就是 PX0 系列引脚,连接到MCU内置的 FLASH 中。

4.2 使用内置 FLASH 启动 MCU
我们可知,HPM5361 内置 1MB 的 NOR FLASH 储存并且连接到了 MCU。那么,怎么能在我们内置的 FLASH 中启动程序呢?
根据 HPM5300 用户手册 19.2.2.2 FLASH 连接方式的指定可知:
BootROM 根据以下 OTP 字段来决定相应的 FLASH 连接:
- 根据 XPI_INSTANCE 决定 XPI 的实例
- 根据 XPI_PIN_GROUP 选择默认的 XPI 引脚分组
- 根据 XPI_PORT_SEL 决定 XPI 默认的连接端口
根据 HPM5300 用户手册 19.8.1 的 OTP 映射表可以看到这个 XPI_PORT_SEL 寄存器:
我们将 XPI_PIN_GROUP 选择到第二组即可。

4.3 写入内置 FLASH 的配置信息
根据 HPM5300 用户手册 19.2.2.2 FLASH 的接入方式指出:
- 当 FLASH 配置信息来自 FLASH 时,根据 XPI_DEFAULT_READ 决定使用的 FLASH 读命令,并从 FLASH 的 0x400 地址读取 FLASH 配置信息。
根据 HPM5300 用户手册 19.3.3.1 XPI NOR 配置信息的表格指出:
- 下表中也就是 FLASH 地址中 0x400 开始的地方。
当我们使用 CMake 配置项目,并设置 CMAKE_BUILD_TYPE为 flash_xip 时,生成的 SES(Segger Embedded Studio)工程会使用 flash_xip.icf 链接脚本,以将各个 section 链接至 Flash 中。可以在如下菜单中打开链接脚本。

在 flash_xip.icf 中,可以看到在 XPI0 的基地址偏移 0x400 处定义了存放 NOR_CFG_OPTION 的区域,对应的 section 为 .nor_cfg_option。
在 flash_xip.icf 中定义了 NOR_CFG_OPTION 段的地址:
define region NOR_CFG_OPTION = [ from 0x80000400 size 0xc00 ];
也就是说 NOR_CFG_OPTION 这个段就等价于 0x80000400 这个地址。
在其他文件夹找到下文的代码,我们把原来的:
#if defined(FLASH_XIP) && FLASH_XIP
__attribute__ ((section(".nor_cfg_option"))) const uint32_t option[4] = {0xfcf90001, 0x00000007, 0x0,
0x0};
#endif
修改成:
#if defined(FLASH_XIP) && FLASH_XIP
__attribute__ ((section(".nor_cfg_option"))) const uint32_t option[4] = {0xfcf90002, 0x00000007,
0x1000, 0x0};
#endif
这样 MCU 的 XPI0 就能自动使用内置的 FLASH 中启动程序了。
其原理是Flash 的类型、容量、校验/保护设置等,具体可以看上表即可。
五、配置 DAP 调试
使用 Segger Embedded Studio ForRISC-V IDE 编译代码和调试工程,在这里,我们使用 DAP 调试器配合 openOCD 来进行调试和下载。
来分析一下调试的 GDB 命令:

上箭头中的全文如下:
D:/sdk_env/sdk_env-1.6.0/sdk_env-1.6.0/tools/openocd/openocd.exe -f
$(ProjectDir)/../../../../boards/openocd/probes/ft2232.cfg -f
$(ProjectDir)/../../../../boards/openocd/soc/hpm5300.cfg -f
$(ProjectDir)/../../../../boards/openocd/boards/hpm5300evk.cfg
说明如下:
| 组成部分 | 含义 |
| openocd.exe | 这是可执行程序本身。它负责控制调试器硬件,并将 GDB 调试指令翻译成芯片能懂的信号。 |
| -f .../ft2232.cfg | 指定调试器(接口)。FT2232 是一款非常常见的 USB 转 JTAG/SWD 的接口芯片。这行告诉 OpenOCD 你正在用这种类型的调试器。 |
| -f .../hpm5300.cfg | 指定 SoC(目标芯片)。这里指向的是 先楫半导体 (HPMicro) 的 HPM5300 系列芯片,定义了该芯片的 CPU 内核、内存地址等特征。 |
| -f .../hpm5300evk.cfg | 指定板级配置。EVK 代表评估板(Evaluation Kit)。这个文件定义了特定开发板上的复位引脚、时钟频率等细节。 |
如果我们使用 ft2232.cfg 接口就可以继续,如果使用 dap 就需要将 ft2232.cfg 替换成 cmsis_dap.cfg。
六、点灯
main.c 实现了下面的逻辑:
初始化 (board_init):
- 配置芯片时钟和调试串口,让板子“活”过来。
后台闪灯 (board_timer_create):
- 创建一个 300毫秒 的硬件定时器。它像闹钟一样,每隔 0.3 秒自动去执行一次 board_led_toggle(切换 LED 状态)。这是异步执行的,不影响主循环运行。
串口回显 (while(1)):
- getchar():等待你在电脑端输入一个字符。
- 处理换行:把 Windows 风格的回车 (\r) 换成标准的换行 (\n)。
- printf:把你输入的字符再发回电脑显示。
代码如下:
/*
* Copyright (c) 2021 HPMicro
*
* SPDX-License-Identifier: BSD-3-Clause
*
*/
#include <stdio.h>
#include "board.h"
#include "hpm_debug_console.h"
#define LED_FLASH_PERIOD_IN_MS 300
int main(void)
{
int u;
board_init();
board_init_led_pins();
board_timer_create(LED_FLASH_PERIOD_IN_MS, board_led_toggle);
printf("hello world\n");
while(1)
{
u = getchar();
if (u == '\r') {
u = '\n';
}
printf("%c", u);
}
return 0;
}
下面就是 IO 口的翻转函数了:
void board_led_toggle(void)
{
static uint8_t i;
if (!invert_led_level) {
/* hpm6750 Mini Rev A led configure*/
gpio_write_port(BOARD_G_GPIO_CTRL, BOARD_G_GPIO_INDEX, (7 & ~(1 << i)) << BOARD_G_GPIO_PIN);
} else {
/* hpm6750 Mini Rev B led configure*/
gpio_write_port(BOARD_G_GPIO_CTRL, BOARD_G_GPIO_INDEX, ((1 << i)) << BOARD_G_GPIO_PIN);
}
i++;
i = i % 3;
}

597



被折叠的 条评论
为什么被折叠?



