官方亮灯例程无法正确使用

2025_03_29
Q: 我这边使用官方的亮灯例程< 12-GPIO输出-使用固件点亮LED灯 >,并未对例程进行修改,但是烧录进开发板之后并没有任何输出显示。
2025_03_30 A: 麻了,例程给我的是错误的,是STM32H743IIH6,而我使用的是STM32H743XIH6,并且我并没有仔细查看开发版引脚区别,导致配置错误。

hb env 报错

2025_04_01
Q: hb env输出报错,error类型未知。 2025_04_02
A: 解析hb env 功能的作用,将配置名单换方式导入,成功解决,可参照: 安装配置hb

hb build : find component xxx failed, please check it in xxx/parts.json

2025_04_03
Q: 报错内容为Exception: find component init_lite failed, please check it in /home/dm/Projects/openharmony_project/test_1/out/preloader/neptune_iotlink_demo/parts.json.,追根溯源是openharmony_project/test_1/build/hb/util/loader/load_ohos_build.py中的compare_subsystem_and_component函数中会将parts.json解析为相应的字典,来和自带的build/subsystem_compoents_whitelist.jsonbuild/compile_standard_whitelist.json内容进行匹配,很显然白名单里没有我们的芯片内容,所以还会和/out/challenger_h743v2/challenger_h743v2/build_configs/parts_info/part_subsystem.json进行匹配,如果找到该组件或其覆盖版本,并且子系统名称匹配或相等,则认为组件有效。但是并没有找到就会报错,我需要明天查看一下part_subsystem.json文件是如何生成的。

2025_04_08
A: 经过测试,应该是在part_subsystem.json中存在product_{product_name}device_{device_name}这两个键的,比如我这里就应该是product_challenger_h743v2device_challenger_h743v2,但是实际上我在生成的part_subsystem.json中找不到,于是和parts.json中的键值对应不上,导致了出现的错误。对于part_subsystem.json我们可以看到在文件./build/hb/util/loader/load_ohos_build.py中搜寻process_parts_info(parts_config_dict, parts_info_output_path, skip_partlist_check)函数,大致扫一下我们可以知道这个函数通过检查parts_config_dict字典中是否存在键parts_info,如果存在则获取对应的值parts_info,该值通常是一个包含零件信息的字典,将这个字典的键值输出到新生成的part_subsystem.json中。继续看下去,可以在get_parts_info函数中看到是如何使用process_parts_info的,我们可以看到在我们根据教程使用,会缺少创建device/board/embfire/challenger_h743v2/ohos.buildvendor/embfire/challenger_h743v2/ohos.build,我们可以按照提供的示例创建类似的文件即可避免错误。

out/preloader/challenger_h743v2/parts.json 7 lines
{
  "parts": [
    "device_challenger_h743v2:device_challenger_h743v2",
    "kernel:liteos_m",
    "product_challenger_h743v2:product_challenger_h743v2"
  ]
}

我们可以在part_subsystem.json中看到只有kernel:liteos_m这个键值对,剩下的两个键值对需要我们创建下述两个文件才能够生成:

vendor/embfire/challenger_h743v2/ohos.build 9 lines
+{
+  "parts": {
+    "product_challenger_h743v2": {
+      "module_list": [
+      ]
+    }
+  },
+  "subsystem": "product_challenger_h743v2"
+}

device/board/embfire/challenger_h743v2/ohos.build 9 lines
+{
+  "parts": {
+    "device_challenger_h743v2": {
+      "module_list": [
+      ]
+    }
+  },
+  "subsystem": "device_challenger_h743v2"
+}

fatal error: target_config.h: No such file or directory

2025_04_11
Q: 经过测试,在进行编译的过程中,出现了位于device/soc/st/stm32h7xx/sdk/Drivers/STM32H7xx_HAL_Driver/Src/的代码找不到 stm32h7xx_hal_conf.htarget_config.h头 文件,寻找了一下,在./device/board/embfire/challenger_h743v2/liteos_m/Inc/stm32h7xx_hal_conf.h./device/soc/st/target_config.h存在对应文件,应该是链接的问题,需要看一下是错误代码连接到什么位置。

2025_04_14
A: 查看一下终端输出的内容中报错内容[OHOS ERROR] ccache arm-none-eabi-gcc -I {path}中存在device/soc/st/BUILD.gn中定义的全局头文件路径,../../../device/soc/st/stm32h7xx/sdk/Drivers/CMSIS/Device/ST/STM32H7xx/Include../../../device/board/embfire/challenger_h743v2/liteos_m/Inc,并没有存在我们stm32h7xx_hal_conf.htarget_config.h的文件路径,但是device/board/embfire/challenger_h743v2/liteos_m/BUILD.gn中明明已经包括了这个模块的路径,但是在上面的编译路径中并没有找到,所以我们需要将这两个文件的路径添加到全局文件路径搜索中。

device/soc/st/BUILD.gn 7 lines
config("public") {
    include_dirs = [
+      "../../../device/board/embfire/challenger_h743v2/liteos_m/inc",  # 添加缺失的路径
+      "../../../device/soc/st/",

    ]
}

undefined reference to `HAL_xxx'

2025_04_14
Q&A: 具体报错情况为链接器ld发现在liteos_m.main.o目标文件中发现如SystemClock_Config函数存在未定义的引用,这个函数属于STM32H7xx的电源管理部分,通常存在于stm32h7xx_hal_pwr_ex.c中,所以我们将stm32h7xx_hal_pwr_ex.c文件路径添加到对应的BUILD.gn中即可。

device/soc/st/BUILD.gn 6 lines
kernel_module(module_name) {
  asmflags = board_asmflags
  sources = [
+   "stm32h7xx/sdk/Drivers/STM32H7xx_HAL_Driver/Src/stm32h7xx_hal_pwr_ex.c",
  ]
}