笔者是linux爱好者,所以开发环境以linux为主,对于HPM5301EVKLite也不例外,现在来展示下linux 开发环境下的hpm_sdk的编译、烧录。

调试与烧录
调试器
做固件开发,一个方便的调试器还是很有必要的,且烧录方面比串口烧录要方便得多。HPM5301EVKLite开发板支持标准的jtag,为成本考虑未板载一颗FT2232之类的调试器芯片,这就需要外接一个标准jtag调试器。笔者有一个ft2232芯片做的调试器所以就用它了。当然因为cherrydap开源项目的存在,我们 完全可以另外再买一块HPM5301EVKLite开发板,通过串口烧录cherrydap固件后,HPM5301EVKLite即成 为一个支持daplink协议的调试器,它支持arm swd和jtag。

调试烧录工具openocd的编译
如果只用openocd调试,linux发行版自带的openocd即可使用,但如果需要使用openocd的烧录功能,那么只有HPM官方打过补丁的openocd支持HPM系列SoC的flash烧录。
  1. git clone https://gitee.com/hpmicro/riscv-openocd
  2. cd riscv-openocd
  3. ./bootstrap
  4. ./configure --prefix ~/opt/openocd_hpm
  5. make
  6. make install


hpm_sdk的下载与编译
clone hpm_sdk代码
  1. git clone https://gitee.com/hpmicro/hpm_sdk.git

hpm_sdk工程组织分析
hpm官方sdk使用CMakeLists.txt组织的,理论上linux下是原生支持编译hpm_sdk的。值得一提的是hpm_sdk中toolchain的似乎假设了就那么三种来源,这和笔者习惯不太一样,笔者不喜欢给每个MCU厂家都 下载特别的toolchain,比较偏向于共享toolchain。目前linux开发环境下用于riscv baremetal的toolchain通常有发行版自带riscv64-unknown-elf-gcc或者xpack打包的xpack-riscv-none-elf-gcc,前者 不带libc,需安装或自行编译适用于riscv baremetal的libc,例如picolibc-riscv64-unknown-elf;后者默认带newlibc。那笔者先用xpack的toolchain展示下hpm_sdk的编译过程,riscv64-unknown-elf-gcc配合picolibc-riscv64-unknown-elf编译hpm_sdk以后有机会再发贴说明(注:虽然这两名字上有64位但可编译32位riscv)

给hpm_sdk打上如下补丁:
  1. diff --git a/cmake/application.cmake b/cmake/application.cmake
  2. index 813782bf..86646715 100644
  3. --- a/cmake/application.cmake
  4. +++ b/cmake/application.cmake
  5. @@ -68,7 +68,7 @@ if(NOT RV_ABI)
  6. endif()

  7. if(NOT RV_ARCH)
  8. -    set(RV_ARCH "rv32imac")
  9. +    set(RV_ARCH "rv32imac_zicsr_zifencei")
  10. endif()

  11. # add basic extentions
  12. diff --git a/cmake/toolchain.cmake b/cmake/toolchain.cmake
  13. index ca914b09..89928d1f 100644
  14. --- a/cmake/toolchain.cmake
  15. +++ b/cmake/toolchain.cmake
  16. @@ -85,8 +85,8 @@ elseif("${TOOLCHAIN_VARIANT}" STREQUAL "gcc")
  17.    set(LINKER ld)
  18.    set(BINTOOLS gnu)
  19.    set(C++ g++)
  20. -  set(CROSS_COMPILE_TARGET riscv32-unknown-elf)
  21. -  set(SYSROOT_TARGET       riscv32-unknown-elf)
  22. +  set(CROSS_COMPILE_TARGET riscv-none-elf)
  23. +  set(SYSROOT_TARGET       riscv-none-elf)
  24.    set(TOOLCHAIN_CMAKE gcc.cmake)
  25. elseif("${TOOLCHAIN_VARIANT}" STREQUAL "nds-llvm")
  26.    set(COMPILER clang)

因板子自带了的固件似乎就是hello_world,改动hello_world源码以示区别
  1. diff --git a/samples/hello_world/src/hello_world.c b/samples/hello_world/src/hello_world.c
  2. index 676304c9..d742e7cd 100644
  3. --- a/samples/hello_world/src/hello_world.c
  4. +++ b/samples/hello_world/src/hello_world.c
  5. @@ -19,7 +19,7 @@ int main(void)

  6.      board_timer_create(LED_FLASH_PERIOD_IN_MS, board_led_toggle);

  7. -    printf("hello world\n");
  8. +    printf("hello riscv\n");
  9.      while(1)
  10.      {
  11.          u = getchar();


编译hello_world
  1. export HPM_SDK_BASE=YOUR_PATH_TO_hpm_sdk/
  2. export GNURISCV_TOOLCHAIN_PATH=YOUR_PATH_TO_XPACK_TOOLCHAIN/xpack-riscv-none-elf-gcc-13.2.0-2
  3. cd samples/hello_world
  4. cmake -DCMAKE_BUILD_TYPE=release -DBOARD=hpm5301evklite -B build
  5. cmake --build build -j8
编译结果如图所示


动态加载运行
  1. export OPENOCD_SCRIPTS=YOUR_PATH_TO_hpm_sdk/boards/openocd
  2. ~/opt/openocd_hpm/bin/openocd -f probes/ft2232.cfg -f soc/hpm5300.cfg -f boards/hpm5301evklite.cfg
此时openocd运行结果如图所示
2.jpg

另起一个shell接入板子串口
  1. minicom -c on -w usb0

另起一个shell运行
  1. telnet 127.0.0.1 4444

在telnet界面中
  1. halt
  2. load_image samples/hello_world/build/output/demo.bin 0
  3. resume 0
telnet运行界面如图所示:
3.jpg

此时串口终端minicom显示如图
5.jpg