本帖最后由 HonestQiao 于 2022-12-6 13:22 编辑

对先楫早有耳闻,据说做的挺不错的。这次有机会拿到HPM6750EVKMINI开发板的试用,刚好借此机会好好了解一下。
这次的开发板是HPM6750EVK MINI,相对于以前看到别人玩的,确实挺Mini的:

image.png image.png

但Mini不减功能,接口丰富,而且是Type-C,良心企业!

经过一番了解,下载了官方提供的HPM_SDK,其中有关于Linux环境的说明,参考之后,一番尝试,搞定嘞macOS环境下的VSCode开发环境。
参考的文档为: hpm_sdk/README_zh.md at main · hpmicro/hpm_sdk (github.com)

具体的步骤如下:
1. 下载hpm_sdk
  1. mkdir -p ~/hpm_work
  2. git clone https://github.com/hpmicro/hpm_sdk.git
  3. cd hpm_sdk


2、设置GNURISCV_TOOLCHAIN_PATH
HPM板子的代码,要使用 riscv32-unknown-elf,可以找遍了网上,都没有找到 for macOS的。
riscv-collab/riscv-gnu-toolchain: GNU toolchain for RISC-V, including GCC (github.com) 下载了 riscv-gnu-toolchain 的源码,编译riscv32的,结果失败了。
后来,经过一番了解,原来,那要什么专门for riscv32的版本呀,编译riscv64的版本,只要启用了multilibs,就能够支持riscv32,也就是用riscv64-unknown-elf一样可以编译。
在macOS上,安装了brew的话,使用下面三行代码,轻松搞定
  1. brew tap riscv-software-src/riscv
  2. brew install riscv-tools
  3. brew link --overwrite riscv-gnu-toolchain

安装后,还需要修改一下HPM_SDK中的cmake配置文件,具体如下:
image.png
可以使用下面的命令,轻松搞定:
  1. cd ~/hpm_work/hpm_sdk
  2. sed -i "" "s#riscv32-unknown-elf#riscv64-unknown-elf#g" cmake/toolchain.cmake


3. 编译openocd
先楫使用的openocd是定制的,类似WCH,需要自己编译,步骤如下:
  1. cd ~/hpm_work
  2. git clone https://github.com/hpmicro/riscv-openocd.git
  3. cd riscv-openocd
  4. ./bootstrap
  5. ./configure --prefix=/usr/local/openocd-hpm --disable-werror --disable-internal-jimtcl --disable-internal-libjaylink --enable-ftdi --enable-cmsis-dap-v2 --enable-cmsis-dap CPPFLAGS=-I/usr/local/Cellar/jimtcl/0.81_1/include LDFLAGS=-L/usr/local/Cellar/jimtcl/0.81_1/lib
  6. make -j4
  7. sudo make install


编译的过程中,可能会提示./doc/openocd.texi中@raggedright的错误,按照如下连接修改即可:
https://review.openocd.org/c/openocd/+/2781/2/doc/openocd.texi#b8463
image.png

4. 安装依赖,设置环境
  1. cd ~/hpm_work/hpm_sdk
  2. pip3 install --user -r "$HPM_SDK_BASE/scripts/requirements.txt
  3. brew install ninja
  4. . ./env.sh
  5. export GNURISCV_TOOLCHAIN_PATH=/usr/local


5. 编译测试代码:
  1. cd ~/hpm_work/hpm_sdk
  2. . ./env.sh
  3. export GNURISCV_TOOLCHAIN_PATH=/usr/local

  4. cd samples/hello_world
  5. mkdir build
  6. cd build
  7. cmake -GNinja -DBOARD=hpm6750evkmini -DCMAKE_BUILD_TYPE=flash_xip ..
  8. ninja
具体执行结果如下:
image.png

上述cmake指令中的 CMAKE_BUILD_TYPE=flash_xip 很重要,设置后,编译的代码,可以试用openocd正常下载。
上述配置,是经过官方的大佬指点后,研究官方提供的windows环境的sdk_env后得到的。

6. 调试代码:
  1. cd ~/hpm_work/hpm_sdk
  2. cd samples/hello_world
  3. export OPENOCD_SCRIPTS=${HPM_SDK_BASE}/boards/openocd
  4. export PATH=/usr/local/openocd-hpm/bin:$PATH
  5. openocd -f probes/ft2232.cfg -f soc/hpm6750-single-core.cfg -f boards/hpm6750evk.cfg

执行最后一条指令后,出现如下信息,说明连接成功:
image.png
最后的一条是关键:Listening on port 3333 for gdb connections
如果启动失败,请参考 hpm_sdk/README_zh.md安装相关驱动解决。

然后再开一个shell窗口,执行下面的操作:
  1. cd ~/hpm_word/hpm_sdk/samples/hello_world/
  2. . ./env.sh
  3. export GNURISCV_TOOLCHAIN_PATH=/usr/local
  4. export OPENOCD_SCRIPTS=${HPM_SDK_BASE}/boards/openocd
  5. export PATH=/usr/local/openocd-hpm/bin:$PATH
  6. riscv64-unknown-elf-gdb
  7. (gdb)

通过上面的步骤,启动了gdb调试,然后使用下面的指令状态编译后的固件文件,以及进行调试:【(gdb)为提示符,不用输入】
  1. (gdb) file build/output/demo.elf
  2. (gdb) target remote localhost:3333
  3. (gdb) load
  4. (gdb) b main
  5. (gdb) c
  6. (gdb) c

具体结果如下:
image.png

上述的b main表示在main处打断点,所以第一个c继续运行后,在main后的第一个实际代码board_init()处停止,再次输入c后,继续运行。
运行后,板子上的LED灯将会开始闪烁了。

7. 烧录固件:
使用opencod可以进行调试,同样也可以进行烧录固件。
要烧录,需要先关闭当前运行的opencod,然后使用如下的指令即可:
  1. cd ~/hpm_word/hpm_sdk/samples/hello_world/
  2. . ./env.sh
  3. export GNURISCV_TOOLCHAIN_PATH=/usr/local
  4. export OPENOCD_SCRIPTS=${HPM_SDK_BASE}/boards/openocd
  5. export PATH=/usr/local/openocd-hpm/bin:$PATH
  6. openocd -f probes/ft2232.cfg -f soc/hpm6750-single-core.cfg -f boards/hpm6750evk.cfg -c "program "./build/output/demo.elf" verify reset exit"

具体结果如下:
image.png

烧录完成,按一下板子上的rerst按键,板子里面的固件就会生效了。
完成以上步骤后,命令行的操作就完成了,可以进行vscode环境配置了。


8. vscode环境处理:
vscode环境中,关键就在于tasks.json和launch.json的配置,具体如下:
tasks.json:
  1. {
  2.     // See https://go.microsoft.com/fwlink/?LinkId=733558
  3.     // for the documentation about the tasks.json format
  4.     "version": "2.0.0",
  5.     /*"options": {
  6.         "cwd": "${workspaceFolder}/build"
  7.     },*/
  8.     "options": {
  9.         "env": {
  10.           "GNURISCV_TOOLCHAIN_PATH": "/usr/local",
  11.           "PATH":"/usr/local/openocd-hpm/bin:${env:PATH}"
  12.         }
  13.      },
  14.     "tasks": [
  15.         {
  16.             "label": "_makebuildfolder",
  17.             "type": "shell",
  18.             "command": "mkdir -p ${workspaceFolder}/build",
  19.             "problemMatcher": [],
  20.             "group": "none"
  21.         },
  22.         {
  23.             "label": "env",
  24.             "type": "shell",
  25.             "command": "env",
  26.             "args": [],
  27.             "options": {
  28.                 "cwd": "${workspaceFolder}/build"
  29.             }
  30.         },
  31.         {
  32.             "label": "cmake",
  33.             "type": "shell",
  34.             "command": "cmake",
  35.             "args": [
  36.                 "-GNinja",
  37.                 "-DBOARD=hpm6750evkmini",
  38.                 "-DCMAKE_BUILD_TYPE=flash_xip",
  39.                 ".."
  40.             ],
  41.             "options": {
  42.                 "cwd": "${workspaceFolder}/build"
  43.             },
  44.             "problemMatcher": []
  45.         },
  46.         {
  47.             "label": "clean",
  48.             "type": "shell",
  49.             "command": "ninja",
  50.             "args": [
  51.                 "-t",
  52.                 "clean"
  53.             ],
  54.             "options": {
  55.                 "cwd": "${workspaceFolder}/build"
  56.             },
  57.             "problemMatcher": []
  58.         },
  59.         {
  60.             "label": "reset",
  61.             "type": "shell",
  62.             "command": "rm",
  63.             "args": [
  64.                 "-rf",
  65.                 "./build"
  66.             ],
  67.             "options": {
  68.                 "cwd": "${workspaceFolder}"
  69.             },
  70.             "problemMatcher": []
  71.         },
  72.         {
  73.             "label": "make",
  74.             "type": "shell",
  75.             "command": "ninja",
  76.             "args": [],
  77.             "options": {
  78.                 "cwd": "${workspaceFolder}/build"
  79.             },
  80.             "problemMatcher": []
  81.         },
  82.         {
  83.             "label": "flash",
  84.             "type": "shell",
  85.             "command": "/usr/local/openocd-hpm/bin/openocd",
  86.             "args": [
  87.                 "-f","probes/ft2232.cfg",
  88.                 "-f","soc/hpm6750-single-core.cfg",
  89.                 "-f","boards/hpm6750evkmini.cfg",
  90.                 "-c","program "./build/output/demo.elf" verify reset exit"
  91.             ],
  92.             "options": {
  93.                 "cwd": "${workspaceFolder}"
  94.             },
  95.             "problemMatcher": []
  96.         },
  97.         {
  98.             "label": "openocd",
  99.             "type": "shell",
  100.             "isBackground": true,
  101.             "command": "/usr/local/openocd-hpm/bin/openocd",
  102.             "args": [
  103.                 "-f","probes/ft2232.cfg",
  104.                 "-f","soc/hpm6750-single-core.cfg",
  105.                 "-f","boards/hpm6750evkmini.cfg"
  106.             ],
  107.             "options": {
  108.                 "cwd": "${workspaceFolder}"
  109.             },
  110.             "problemMatcher": []
  111.         },
  112.         {
  113.             "label": "Build",
  114.             "dependsOrder": "sequence",
  115.             "dependsOn": [
  116.                 "_makebuildfolder",
  117.                 "env",
  118.                 "cmake",
  119.                 "make"
  120.             ],
  121.             "problemMatcher": []
  122.         }
  123.     ]
  124. }


launch.json:
  1. {
  2.     // Use IntelliSense to learn about possible attributes.
  3.     // Hover to view descriptions of existing attributes.
  4.     // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
  5.     "version": "0.2.0",
  6.     "configurations": [
  7.         {
  8.             "name": "RISC-V Remote Debug@cppdbg",
  9.             "cwd": "${workspaceFolder}",
  10.             "type": "cppdbg",
  11.             "request": "launch",
  12.             "miDebuggerPath": "riscv64-unknown-elf-gdb",
  13.             "targetArchitecture": "arm",
  14.             "program": "./build/output/demo.elf",
  15.             "preLaunchTask": "Build",
  16.             "setupCommands": [
  17.                 {
  18.                     "description": "Enable pretty-printing for gdb",
  19.                     "text": "-enable-pretty-printing",
  20.                     "ignoreFailures": true
  21.                 },
  22.                 {
  23.                     "description": "装载文件",
  24.                     "text": "file ${workspaceFolder}/build/output/demo.elf",
  25.                 },
  26.                 {
  27.                     "text": "target extended-remote localhost:3333"
  28.                 },
  29.                 {
  30.                     "text": "monitor reset"
  31.                 },
  32.                 {
  33.                     "text": "monitor halt"
  34.                 },
  35.                 {
  36.                     "text": "load"
  37.                 }
  38.             ],
  39.             "launchCompleteCommand": "None",
  40.             "externalConsole": true,
  41.         },
  42.     ]
  43. }



tasks.json中的设置,就相当于是把命令行才操作,搬到了vscode来,使用vscode的菜单或者命令操作了:
image.png

lanuch.json中的设置,是用于调试的,类似刚才我们执行的调试指令,不过加了monitor部分,用vscode可视化调试。

先从上述任务列表中,点击openocd运行连接;
然后,在代码中合适的位置打上断点,启动调试:
image.png
正常启动后,中能在我们预期的位置停下来,等待调试了。

9. 总结
搭建这个环境,还是经过了一波三折的,好在经过官方大佬指点,问题都解决了。
希望后续,能够将macOS环境的说明,也添加到官方指南上去。

下一步,就可以好好开始玩了。