本文介绍HPM SDK下载安装,和如何不用SEGGER Embedded Studio for RISC-V来开发HPM MCU。
下载与安装
截止至2024年8月6日,HPM SDK提供到1.6版本,在GitHub和gitee上提供,可根据自身网络环境选择下载,推荐下载release版本而不是主线最新版本。
HPM SDK分为SDK本体和SDK环境。两者均需要下载(不过貌似1.6 release版本的环境里面有SDK本体)。
下载命令(需要提前安装git):
1 2 3 4 5 6 7 8 9 10
| # 在GitHub下载 git clone https://github.com/hpmicro/hpm_sdk -b v1.6.0 --depth=1 git clone https://github.com/hpmicro/sdk_env -b v1.6.0 --depth=1
# 在gitee镜像下载 git clone https://gitee.com/hpmicro/hpm_sdk -b v1.6.0 --depth=1 git clone https://gitee.com/hpmicro/sdk_env -b v1.6.0 --depth=1
# 要是报什么乱七八糟的错误可以试试这个命令 git config --global core.longpaths true
|
注意安装目录不能有中文!!!!!!不然会导致后面工程没法正常生成(写到后面发现的,所以前面有的图片带中文路径,但是不影响,因为用的都是相对路径,就懒得改了)。
clone完后进入sdk_env文件夹,检查里面有没有hpm_sdk文件夹,以及里面有没有类似下文图片的内容。
如果没有文件夹,或者里面没东西,那么把上面clone下来的hpm_sdk文件夹复制到sdk_env文件夹里面。至此,HPM SDK下载和安装完成。
基础概念(个人见解)
sdk_env文件夹里面有个start_gui.exe文件,可以打开GUI的工程生成器

点左上角Language可以换中文

可以看到,工程生成器有以下几个配置路径:
- 开发板路径
这个SDK里面的开发板指的是板级硬件,包含了初始化代码,引脚描述,外设使用情况,及引脚复用。
sdk自带了官方出的几款开发板的配置,在拥有了自己设计的硬件后,也可以在里面添加自己的开发板。
- 应用路径
应用路径就是实例代码和工程模板。
- 输出路径
输出路径是最终生成编译脚本和放置编译临时文件的位置,一般默认跟随应用路径即可。
开发使用(个人见解)
创建自己的开发板
从现有配置创建新配置
进入sdk_env/hpm_sdk/boards文件夹,可以看到很多官方出的板子,选择一个和自己的方案最相近的,复制一份作为我们自己的开发板配置。
这里以hpm6750evk2为例,复制hpm6750evk2文件夹到相同目录并重命名为hpm6750evk2_test文件夹,作为我们的开发板(名字可以用任意英文,命名规则跟c语言变量差不多)

进入hpm6750evk2_test文件夹,将hpm6750evk2.yaml的文件名修改为hpm6750evk2_test.yaml,来保证工程生成器能正确识别开发板配置。(文件夹里面的yaml文件必须和文件夹同名才能被识别成有效开发板)

修改配置来适配实际硬件
打开上述的hpm6750evk2_test.yaml文件,可以看到:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
|
board: name: hpm6750evk2 soc: HPM6750 device: HPM6750xVMx openocd-soc: hpm6750-dual-core openocd-probe: cmsis_dap on-board-ram: type: sdram size: 32M width: 32bit on-board-flash: type: qspi-nor-flash size: 16M feature: - board_audio_in - board_audio_out - board_audio_in_vad - board_audio_codec - board_uart_software_rx_idle_pin - board_gpt_pin - board_motor_control - board_pwm_rgb_led - board_puart_pin - board_enet_pps_pin - board_sdcard - board_sdram - board_enet_phy - board_enet_dual_phy - board_dual_usb - board_power_button
|
其中:
- name 是配置名,可以根据需求自由修改;
- soc 是芯片系列,根据硬件决定;
- device 是具体芯片型号,根据硬件决定;
- openocd-soc 是调试器配置,一般默认即可;
- openocd-probe 是调试器配置,根据硬件决定;
- on-board-ram 是板上外置RAM,根据硬件决定写不写,及怎么写,可以参考其他官方的板子;
- on-board-flash 是板上外置Flash,根据硬件决定写不写,可以参考其他官方的板子,一般需要,因为HPM很多型号没有内置Flash;
- feature 是支持的功能,根据硬件决定。
这里面比较重要的是openocd-probe,因为这决定了工程生成器生成的工程里面的OpenOCD调试器默认配置脚本,写错了会导致连不上板子,此例采用cmsis_dap调试器。自带的调试器配置可以在/sdk_env/hpm_sdk/boards/openocd/probes里面看到

yaml文件修改完成后,接下来修改pinmux.h board.h pinmux.c board.c四个代码,其中pinmux.c pinmux.h两个可以用 https://tools.hpmicro.com/ 提供的引脚配置工具生成,board.h board.c需要手动修改,这就是编程问题了。
文件夹下面的其他东西,比如README,doc都是给人看的,不是必需项。CMakeLists.txt 是CMake生成脚本,必须保留。
复制工程到SDK外部和生成工程
HPM工程生成器默认生成工程会生成到SDK内部,这可能导致意外的修改导致SDK损坏,所以可以通过复制工程到SDK外部来解决。
在你喜欢的地方新建一个文件夹作为你的工程目录,进入/sdk_env/hpm_sdk/samples里面选择一个你需要的示例工程,复制到前面你新建的文件夹里面,这里以hello_world为例。

然后打开工程生成器,勾选使用自定义应用路径,然后在用户应用里面选择你刚才新建的文件夹的路径,然后就会在下面的用户应用里面看到你复制过去的示例工程。


构建类型按需求选就行,这里略过。然后在SDK开发板选项里面选择你上面新建的自定义板子:

然后检查生成路径是不是你刚才新建的文件夹。

如果都没毛病,点击下面的生成按钮,然后等待跑完。

下面的日志框里面没有红字或者黄字就是生成成功。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| [11:45:50] ************************* Execute Start! ************************* [11:45:50] -- Application: C:/Users/****/Desktop/hp/my_project/hello_world -- Board: hpm6750evkmini from C:/Users/****/Desktop/hp/sdk_env/hpm_sdk/boards [11:45:50] -- Found toolchain: gnu (C:/Users/****/Desktop/hp/sdk_env/toolchains/rv32imac_zicsr_zifencei_multilib_b_ext-win) [11:45:50] -- hpm_sdk: 1.6.0 (C:/Users/****/Desktop/hp/sdk_env/hpm_sdk) [11:45:51] -- The C compiler identification is GNU 13.2.0 [11:45:51] -- The CXX compiler identification is GNU 13.2.0 [11:45:51] -- The ASM compiler identification is GNU [11:45:51] -- Found assembler: C:/Users/****/Desktop/hp/sdk_env/toolchains/rv32imac_zicsr_zifencei_multilib_b_ext-win/bin/riscv32-unknown-elf-gcc.exe [11:45:51] -- GNU ld linker script: C:/Users/****/Desktop/hp/sdk_env/hpm_sdk/soc/HPM6700/HPM6750/toolchains/gcc/flash_sdram_xip.ld [11:45:52] -- IAR linker script: C:/Users/****/Desktop/hp/sdk_env/hpm_sdk/soc/HPM6700/HPM6750/toolchains/iar/flash_sdram_xip.icf -- IAR device name: HPM6750xVMx [11:45:52] -- IAR Embedded Workbench Project: C:/Users/****/Desktop/hp/my_project/hello_world/hpm6750evkmini_flash_sdram_xip_debug/iar_embedded_workbench\hello_world.ewp [11:45:52] -- Segger linker script: C:/Users/****/Desktop/hp/sdk_env/hpm_sdk/soc/HPM6700/HPM6750/toolchains/segger/flash_sdram_xip.icf -- Segger device name: HPM6750xVMx [11:45:53] -- Segger openocd board config: $(ProjectDir)/../../../../sdk_env/hpm_sdk/boards/openocd/boards/hpm6750evkmini.cfg [11:45:53] -- Segger Embedded Studio Project: C:/Users/****/Desktop/hp/my_project/hello_world/hpm6750evkmini_flash_sdram_xip_debug/segger_embedded_studio/hello_world.emProject [11:45:53] -- Configuring done [11:45:53] -- Generating done -- Build files have been written to: C:/Users/****/Desktop/hp/my_project/hello_world/hpm6750evkmini_flash_sdram_xip_debug [11:45:53] Project IDE Path: C:/Users/****/Desktop/hp/my_project/hello_world/hpm6750evkmini_flash_sdram_xip_debug/segger_embedded_studio/hello_world.emProject [11:45:53] ************************* Execute End! *************************
|
配置VSCode
生成完成后,进入刚才新建的的工程文件夹,进入刚才从sdk里面复制过来的示例文件夹,就会看到生成的东西。

在里面新建一个文件夹叫.vscode,进入。
在里面新建一个文件,叫c_cpp_properties.json,内容为:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| { "configurations": [ { "name": "hpm", "includePath": [], "defines": [], "compilerPath": "D:\\mcu_other\\sdk_env\\toolchains\\rv32imac_zicsr_zifencei_multilib_b_ext-win\\bin\\riscv32-unknown-elf-gcc.exe", "cStandard": "gnu11", "cppStandard": "gnu++14", "intelliSenseMode": "gcc-x64", "compileCommands": "./hpm6750evk2_test_flash_sdram_xip_debug/compile_commands.json" } ], "version": 4 }
|
其中:
- name 是配置名,按个人喜好改
- compilerPath 是编译器地址,在
/sdk_env/toolchains/rv32imac_zicsr_zifencei_multilib_b_ext-win/bin/riscv32-unknown-elf-gcc.exe,但是最好写绝对地址,除非你懂什么环境变量之类的高级玩法。
- compileCommands 是编译指令,里面的东西可以给VSCode配置自动补全啥的,在刚才生成完的工程目录里面的SDK配置文件夹里面,我这里是
hpm6750evk2_test_flash_sdram_xip_debug,这个文件夹根据你选择的不同配置名字也不一样,每次生成需要自己看看确认。
其他的可以不改或根据自己的知识进行修改。
现在回到上一级文件夹,应该是这样的:

用VSCode打开这个文件夹,如果前面配置的都正确,那么现在已经可以正常使用VSCode的跳转和自动补全功能了。如果不是,可以检查c_cpp_properties.json,在打开工程文件夹的情况下编辑c_cpp_properties.json,会有黄线提示问题的,根据提示修改就行了。
SDK本地化
切换到工程生成器,确认所有配置和前文所述一致.

SDK本地化会固化板子配置,以后无法通过修改上文的SDK开发板来修改配置,但是会创建和SDK独立的源码组,不会改坏SDK。
点击下面的应用SDK本地化,看到以下信息就说明成功了。

编译
打开前面sdk_env里面的start_cmd.cmd,用命令进入前面的工程SDK配置文件夹:

在里面执行ninja指令即可编译。

编译成功会显示占用。
下载
连接好硬件和电脑,切换到工程生成器。
点击左下角烧写Flash,probe选择你接板子的调试器,soc选择和你用的型号芯片一样的就行,board也选择和你用的型号芯片一样的就行,点确定。

文件路径选择刚才编译文件夹里面out文件夹里面的elf文件就行,然后点烧写就烧进去了。

PS:下面显示的命令可以复制出来以后独立用,不用每次都打开这个GUI。