零、前言
最近几个月陆陆续续接触到关于先楫半导体的hpm6750的信息。随着先楫半导体的sdk、数据手册等释出,决定入手hpm6750体验一下。本文是上手体验的一点小总结,多数内容来自sdk、手册等等。新手不建议现在入手,在意bug的也不建议现在入手。
一、构建第一个示例
下载sdk后打开目录观察一下主要包含驱动、示例、工具链等。目前看样子主推segger_embedded_studio和rtt studio。使用ide可以方便构建和调试,目前我为了能更好的熟悉sdk决定使用非ide。运行 sdk_env 根目录下 start_cmd.cmd 命令配置开发环境,然后进入目录“hpm_sdk/samples/hello_world”。generate_project 命令是用于生成工程的命令,运行 generate_project -h 看看支持什么操作:
generate_project [-f] [-b board] [-a] [-list] [-h]
-f: force clean already existed build directory
-b board: specify board for project generation
-a: generate projects for all supported boards
-list: list all supported boards
-t type: specify build type
-h: show this text
ECHO 处于关闭状态。
Here're supported build types:
- release
- debug
- flash_xip
- flash_xip_release
- flash_sdram_xip
- flash_sdram_xip_release
- flash_uf2
- flash_uf2_release
- flash_sdram_uf2
- flash_sdram_uf2_release
- sec_core_img
- sec_core_img_release
运行 generate_project -list 查看此示例支持的开发板(目前也就evk与evkmini)
运行 generate_project -f -b hpm6750evkmini -t debug 构建项目,自动生成 hpm6750evkmini_build 目录,我们进入此目录并执行 ninja ,如果运行没错误的话能看到类似信息:
[98/98] Linking C executable output\demo.elf
Memory region Used Size Region Size %age Used
ILM: 0 GB 256 KB 0.00%
DLM: 0 GB 256 KB 0.00%
CORE0_LM_SLV: 67776 B 512 KB 12.93%
CORE1_LM_SLV: 0 GB 512 KB 0.00%
SDRAM: 0 GB 32 MB 0.00%
AXI_SRAM: 35312 B 768 KB 4.49%
AXI_SRAM_NONCACHEABLE: 0 GB 256 KB 0.00%
debug 类型工程对应的 gcc 工具链链接脚本为 ram.ld ,他在“hpm_sdk/soc/HPM6750/toolchains/gcc”目录下:
ENTRY(_start)
STACK_SIZE = DEFINED(_stack_size) ? _stack_size : 0x4000;
HEAP_SIZE = DEFINED(_heap_size) ? heap_size : 0x4000;
MEMORY
{
ILM (wx) : ORIGIN = 0, LENGTH = 256K
DLM (w) : ORIGIN = 0x80000, LENGTH = 256K
/* It's alias address of core0 ILM+DLM, but accessing via system bus /
CORE0_LM_SLV (wx) : ORIGIN = 0x1000000, LENGTH = 512K
/ It's alias address of core1 ILM+DLM, but accessing via system bus */
CORE1_LM_SLV (wx) : ORIGIN = 0x1180000, LENGTH = 512K
SDRAM (wx) : ORIGIN = 0x40000000, LENGTH = 32M
AXI_SRAM (wx) : ORIGIN = 0x1080000, LENGTH = 768K
AXI_SRAM_NONCACHEABLE (wx) : ORIGIN = 0x01140000, LENGTH = 256K
}
.
.
.
如果构建类型是flash???,可以直接使用 program_flash 命令间接调用 openocd 下载固件到板载 qspi flash 上。
二、关于调试和下载算法
hpm6750evkmini 使用的是 ft2232h 配合 openocd 下载和调试程序(hpm6750与rt1052类似,无片内Flash)。这里先看看针对 hpm6750evk 的几个 openocd 配置文件。文件路径“hpm_sdk/boards/openocd”,主配置文件为“hpm6750_all_in_one.cfg”,它其中有一段注释解释了怎么启动单核和双核:
usage:
# connect hpm6750evkmini via ft2232, debugging single core
openocd -c "set HPM_SDK_BASE ; set BOARD hpm6750evkmini; set PROBE ft2232;" -f hpm6750_all_in_one.cfg
# connect hpm6750evkmini via ft2232, debugging dual core
openocd -c "set HPM_SDK_BASE ; set BOARD hpm6750evkmini; set PROBE ft2232; set ENABLE_DUALCORE 1" -f hpm6750_all_in_one.cfg
“hpm6750_all_in_one.cfg”主要包含了以下三个配置文件:
source {HPM_OPENOCD_CONFIG}/probes/{PROBE}.cfg
source {HPM_OPENOCD_CONFIG}/soc/{CORE}.cfg
source {HPM_OPENOCD_CONFIG}/boards/{BOARD}.cfg
其中 source {HPM_OPENOCD_CONFIG}/boards/{BOARD}.cfg 包含了时钟和sdram初始化。
hpm6750 的 openocd 是定制版,其中添加了针对 hpm6750 下载算法,学习过 stm32h750 的应该对下载算法不陌生。主要的几个文件“src/flash/nor/hpm_xpi.c”和“contrib/loaders/flash/hpm_xpi/hpm_xpi_flash.h”。“hpm_xpi_flash.bin”文件来自sdk中的“hpm_sdk/samples/openocd_algo”项目,此项目主要利用 BootROM API 实现对 Qspi Flash 的操作。
通过openocd连接ft2232h:
openocd -c "set HPM_SDK_BASE ${HPM_SDK_BASE}; set BOARD hpm6750evkmini; set PROBE ft2232;" -f hpm6750_all_in_one.cfg
通过gdb将代码加载到目标板ram运行:
riscv32-unknown-elf-gdb.exe
file demo.elf
target remote localhost:3333
load
b main
c
串口输出:
三、使用msys2环境构建openocd
尝试搭建openocd构建环境后续可能用得上,这里记录一下过程。
hpm版openocd源代码
msys2安装包
安装msys2后运行“pacman -Sy”更新镜像列表
安装构建openocd的各类包
pacman -S mingw-w64-x86_64-hidapi
mingw-w64-x86_64-libusb
mingw-w64-x86_64-libftdi
mingw-w64-x86_64-gcc
pacman -S libtool
autoconf
automake
texinfo
pkg-config
make
autogen
unzip
libtool
autoconf
automake
texinfo
git
进入openocd根目录运行命令:
./bootstrap
./configure LDFLAGS="-Wl,-s" --enable-ftdi --enable-dummy --prefix=/openocd_hpm
执行成功会有以下提示:
libjaylink configuration summary:
- Package version ................ 0.2.0
- Library version ................ 1:0:1
- Installation prefix ............ /openocd_hpm
- Building on .................... x86_64-w64-mingw32
- Building for ................... x86_64-w64-mingw32
Enabled transports:
- USB ............................ yes
- TCP ............................ yes
OpenOCD configuration summary
MPSSE mode of FTDI based devices yes
cJTAG OSCAN1 tunneled thru MPSSE yes (auto)
ST-Link Programmer yes (auto)
TI ICDI JTAG Programmer yes (auto)
Keil ULINK JTAG Programmer yes (auto)
Altera USB-Blaster II Compatible yes (auto)
Bitbang mode of FT232R based devices yes (auto)
Versaloon-Link JTAG Programmer yes (auto)
TI XDS110 Debug Probe yes (auto)
CMSIS-DAP v2 Compliant Debugger yes (auto)
OSBDM (JTAG only) Programmer yes (auto)
eStick/opendous JTAG Programmer yes (auto)
Olimex ARM-JTAG-EW Programmer yes (auto)
Raisonance RLink JTAG Programmer yes (auto)
USBProg JTAG Programmer yes (auto)
Andes JTAG Programmer (deprecated) no
CMSIS-DAP Compliant Debugger yes (auto)
Nu-Link Programmer yes (auto)
Cypress KitProg Programmer yes (auto)
Altera USB-Blaster Compatible yes (auto)
ASIX Presto Adapter yes (auto)
OpenJTAG Adapter yes (auto)
Linux GPIO bitbang through libgpiod no
SEGGER J-Link Programmer yes (auto)
Bus Pirate no
Use Capstone disassembly framework no
开始编译:
make -j4
make install
成功之后会在msys2的安装目录下看到openocd_hpm目录,将依赖库(libconfuse-2.dll libftdi1.dll libhidapi-0.dll libusb-1.0.dll)复制到”openocd_hpm/bin”下。
四、前期遇到的各类问题
1、通过telnet连接到openocd端口4444,使用load_image加载程序到ram,提示“couldn’t open demo.elf”。
使用绝对路径解决问题。
reset init
halt
load_image "C:/Users/u/Desktop/sdk_env_v0.10.0/hpm_sdk/samples/hello_world/demo.elf"
resume 0x1000000
2、windows下通过环境变量传递sdk路径给openocd会有反斜杠问题。
替换“hpm6750_all_in_one.cfg”文件相关内容:
#set HPM_OPENOCD_CONFIG ${HPM_SDK_BASE}/boards/openocd
set HPM_OPENOCD_CONFIG C:/Users/u/Desktop/sdk_env_v0.10.0/hpm_sdk/boards/openocd
待续…
原作者:lizimu