草庐IT

移植openharmony到STM32H743IIT6【记录帖】

黄昏前徘徊 2023-07-19 原文

记录一下移植openharmony到STM32H743IIT6的过程

一、用STM32CubeMX生成一个makefile的工程

选择第一个创建工程

选择对应的芯片,这里我用的是stm32h743的野火的开发板

移植现象以点亮led为例,选择点亮led的引脚为输出模式,其他默认

这一步看个人习惯吧,默认不管也可以

选择工具链为makefile,如果对时钟有需求可以在Clock Configuration选项修改,我这里直接默认生成了

二、搭建系统环境

要用虚拟机ubuntu编译,具体配置命令可以参考华为官方教程: https://device.harmonyos.com/cn/docs/documentation/guide/quickstart-lite-package-environment-0000001105407498.
(20.04版本有很多bug,安装工具时会提示各种依赖,就很烦,而且我个人也解决不了,所以就改用的18版本)
18版本下载地址
因为鸿蒙源码比较大,安装ubuntu时虚拟硬盘最好搞大点,我这里直接给了100G
如果安装的过程中提示没有某个工具,那就按照ubuntu的提示安装就好了,类似:

安装hb需要python3.8以上版本,我的3.6会提示这个错误:

安装python3.8:

sudo apt install python3.8

python3.8 --version #检验是否安装成功

python3.8 -m pip install --user ohos-build #把上面的python3改成python3.8

实际上最主要的目的就是安装hb,安装好后执行hb -h命令,如出现以下信息则安装成功:

20版本的话会提示各种依赖的问题,如果解决不了就换18版本吧。除了会提示工具缺少需要安装外,应该就没有其他问题了

三、用vscode连接虚拟机

为了方便代码编写,直接在主机端用vscode连接虚拟机,怎么连接的可以参考:
vscode使用ssh连接远程Ubuntu服务器

四、下载openharmony3.0源码

可以按官方的教程用git下载,也可以直接从镜像站点下载,看个人喜好了。
我是从镜像站点下载的。
1、官方教程git下载
2、镜像站点下载

下好源码后通过共享文件放到ubuntu里面,或者你直接在ubuntu里面下也行。
注意先别解压
将源码压缩包复制到新建的openharmony目录下后再解压

cp code-v3.0-LTS.tar.gz ~/openharmony

tar -zxvf code-v3.0-LTS.tar.gz #在~/openharmony目录下解压

这里推荐用FileZilla软件:下载地址

连接后就可以在Windows和ubuntu之间方便快捷的传输文件了

再用vscode连接虚拟机后,就可以打开源码目录了:

子目录代表的含义:

五、移植准备

注:参考了华为官方文档内容,如果对细节部分更感兴趣可以直接去看官方文档:https://device.harmonyos.com/cn/docs/documentation/guide/porting-chip-prepare-knows-0000001064030766

目录规范

HarmonyOS整体工程较为复杂,我们只是简单的移植,不涉及复杂的特性增强,只需要重点关注如下目录即可:

目录名称描述
/build/liteHarmonyOS基础编译构建框架
/kernel/liteos_m基础内核,其中芯片架构相关实现在arch目录下
/device板级相关实现,各个三方厂商按照HarmonyOS规范适配实现
/vendor产品级相关实现,主要由华为或者产品厂商贡献

其中我们要配置的就是device和vendor目录
目录结构和具体描述如下:

├── device                                              --- 单板样例
│   └── xxx                                             --- <单板厂商名>
│       └── xxx                                         --- <单板名>,里面包含liteos-m内核的,并且能够运行的demo
│           ├── BUILD.gn                                --- 定义单板的编译配置文件
│           ├── board                                   --- 板子特定的实现(可选,如果本单板直接提供产品级demo,则相关应用层实现放在此目录)
│           ├── liteos_m                                --- 根据BUILD.gn文件中的kernel_type,使用liteos_m内核
│           │   └── config.gni                          --- 编译选项
│           ├── libraries                               --- 板级SDK
│           │   └── include                             --- SDK提供对外头文件
│           │   └── ...                                 --- binary or source
│           ├── main.c                                  --- main函数入口(如果产品级存在相同定义,则使用产品级配置)
│           ├── target_config.h                         --- 板级内核配置
│           ├── project                                 --- 单板级工程配置文件(如果产品级存在相同定义,则使用产品级配置)
│           └── adapter                                 --- 单板适配上层应用组件的适配层接口,根据能力可选
│               └── hals
│                   ├── communication
│                   │  └── wifi_lite
│                   │      ├── ...
│                   └── iot_hardware
│                       ├── upgrade
│                       ├── utils
│                       └── wifiiot_lite
├── vendor                                              --- 提供端到端的HarmonyOS特性产品样例
│   └── huawei                                          --- 厂商名字
│       └── wifiiot                                     --- wifiiot表示特性产品
│           ├── app
│           │   └── main.c                              --- 产品的main函数入口
│           ├── project                                 --- 工程配置文件
│           ├── BUILD.gn                                --- 工程编译入口
│           └── config.json                             --- 定义产品的编译配置文件,配置产品所使用的组件等。
└── out                                                 --- 编译过程中的输出目录
    ├── ...                                             --- 单板/产品编译产生的bin等
    

根据上述目录规范要求规范文件夹:

device/厂商名称/单板名
vendor/厂商名称/单板名

把第一步stm32cubemx生成的工程文件全部放到 /device/st/stm32h743_harmony 里,顺便把vendor的目录也创建好

板级 device 配置

编译工具链和编译选项配置

在代码根目录 /device/st/stm32h743_harmony 里新建 liteos_m 文件夹并添加 config.gni文件:

# Kernel type, e.g. "linux", "liteos_a", "liteos_m".( 开发板使用的内核类型)
kernel_type = "liteos_m" 

# Kernel version.(开发使用的内核版本)
kernel_version = "3.0.0"

# Board CPU type, e.g. "cortex-a7", "riscv32".(开发板CPU类型)
board_cpu = "cortex-m7"

# Board arch, e.g.  "armv7-a", "rv32imac".(开发芯片arch)
board_arch = ""

# Toolchain name used for system compiling.
# E.g. gcc-arm-none-eabi, arm-linux-harmonyeabi-gcc, ohos-clang,  riscv32-unknown-elf.
# Note: The default toolchain is "ohos-clang". It's not mandatory if you use the default toochain.
#(开发板自定义的编译工具链名称)
board_toolchain = "arm-none-eabi-gcc"

# The toolchain path instatlled, it's not mandatory if you have added toolchian path to your ~/.bashrc.
#(编译工具链路径)
board_toolchain_path = ""

# Compiler prefix.(编译工具链前缀)
board_toolchain_prefix = "arm-none-eabi-"

# Compiler type, "gcc" or "clang".(编译工具链类型)
board_toolchain_type = "gcc"

# Board related common compile flags.(开发板配置的c文件编译选项)
board_cflags = [
  "-mcpu=cortex-m7",
  "-mfpu=fpv5-d16",
  "-mfloat-abi=soft",
  "-mthumb",
  "-Og",
  "-Wall",
  "-fdata-sections",
  "-ffunction-sections",
  "-DUSE_HAL_DRIVER", #看情况修改 (Makefile里C_DEFS的配置)
  "-DSTM32H743xx", #看情况修改
]

#(开发板配置的cpp文件编译选项)
board_cxx_flags = board_cflags

#(开发板配置的链接选项)
board_ld_flags = []

# Board related headfiles search path.(头文件路径)
board_include_dirs = [
  "//kernel/liteos_m/kernel/arch/arm/cortex-m7/gcc",
  "//device/st/stm32h743",
  "//device/st/stm32h743/Core/Inc",
  "//device/st/stm32h743/Drivers/CMSIS/Include",
  "//device/st/stm32h743/Drivers/CMSIS/Device/ST/STM32H7xx/Include",
  "//device/st/stm32h743/Drivers/STM32H7xx_HAL_Driver/Inc",
    "//device/hisilicon/hispark_pegasus/hi3861_adapter/kal/cmsis",
]

# Board adapter dir for OHOS components.
board_adapter_dir = ""

# Sysroot path.
board_configed_sysroot = ""

# Board storage type, it used for file system generation.
storage_type = ""

编译脚本配置

新增的开发板,对应目录下需要新增BUILD.gn文件作为开发板编译的总入口
首先是根目录下的BUILD.gn:

import("//build/lite/config/component/lite_component.gni")

group("stm32h743_harmony") {
}

build_ext_component("stm32h743_harmony_ninjia") {
  exec_path = rebase_path(".", root_build_dir)
  outdir = rebase_path("$root_out_dir")

  if (board_toolchain_path != "") {
    toolchain_path = rebase_path("$board_toolchain_path")
    command = "./build.sh ${outdir} ${toolchain_path}"
  } else {
    command = "./build.sh ${outdir}"
  }
  deps = [ "//build/lite:ohos" ]
}

static_library("startup_stm32h743xx") {
  sources = [ "startup_stm32h743xx.s" ]

  include_dirs = [ "." ]

  deps = [  
    "//device/st/stm32h743_harmony/Core:core",
    "//device/st/stm32h743_harmony/Drivers/STM32H7xx_HAL_Driver:STM32H7xx_HAL_Driver",
  ]
}

group直接写文件夹名
build_ext_component自定义,但是要与Makefile文件里有效代码第一行TARGET一致
sources 为stm32cubemx生成的.s文件的名称
deps 为下级gn文件列表

接着是Drivers\STM32H7xx_HAL_Driver下的BUILD.gn:

static_library("STM32H7xx_HAL_Driver") {
  sources = [
    "Src/stm32h7xx_hal_cortex.c",
    "Src/stm32h7xx_hal_dma_ex.c",
    "Src/stm32h7xx_hal_dma.c",
    "Src/stm32h7xx_hal_exti.c",
    "Src/stm32h7xx_hal_flash.c",
    "Src/stm32h7xx_hal_flash_ex.c",
    "Src/stm32h7xx_hal_gpio.c",
    "Src/stm32h7xx_hal_hsem.c",
    "Src/stm32h7xx_hal_i2c_ex.c",
    "Src/stm32h7xx_hal_i2c.c",
    "Src/stm32h7xx_hal_mdma.c",
    "Src/stm32h7xx_hal_pwr_ex.c",
    "Src/stm32h7xx_hal_pwr.c",
    "Src/stm32h7xx_hal_rcc_ex.c",
    "Src/stm32h7xx_hal_rcc.c",
    "Src/stm32h7xx_hal_tim_ex.c",
    "Src/stm32h7xx_hal_tim.c",
    "Src/stm32h7xx_hal.c",
  ]

  include_dirs = [
    "Inc",
    "Inc/Legacy",
    "../CMSIS/Include",
    "../CMSIS/Device/ST/STM32H7xx/Include",
    "../../Core/Inc",
  ]

}

sources 为此目录下的.c文件
include_dirs为头文件路径

最后是 \Core 下的BUILD.gn:

static_library("core") {
  sources = [
    "Src/main.c",
    "Src/gpio.c",
    "Src/stm32h7xx_hal_msp.c",
    "Src/stm32h7xx_it.c",
    "Src/system_stm32h7xx.c",  
  ]

  include_dirs = [
    "Inc",
    "../",
    "../Drivers/STM32H7xx_HAL_Driver/Inc",
    "../Drivers/STM32H7xx_HAL_Driver/Inc/Legacy",
    "../Drivers/CMSIS/Include",
    "../Drivers/CMSIS/Device/ST/STM32H7xx/Include",
    "//kernel/liteos_m/kernel/include",
    "//kernel/liteos_m/utils",
    "//kernel/liteos_m/kal/cmsis",
    "//kernel/liteos_m/kernel/arch/include",
  ]
}

同理,sources 为此目录下的.c文件
include_dirs为头文件路径
总共3个gn

Makefile配置

##########################################################################################################################
# File automatically-generated by tool: [projectgenerator] version: [3.15.2] date: [Thu Jan 20 16:37:40 CST 2022] 
##########################################################################################################################

# ------------------------------------------------
# Generic Makefile (based on gcc)
#
# ChangeLog :
#	2017-02-10 - Several enhancements + project update mode
#   2015-07-22 - first version
# ------------------------------------------------

######################################
# target
######################################
TARGET = stm32h743_harmony_ninjia  #改成与同级目录下的BUILD.gn里的build_ext_component一致


######################################
# building variables
######################################
# debug build?
DEBUG = 1
# optimization
OPT = -Og


#######################################
# paths
#######################################
# Build path
BUILD_DIR = build

######################################
# source
######################################
# C sources
C_SOURCES =  \
Core/Src/main.c \
Core/Src/stm32h7xx_it.c \
Core/Src/stm32h7xx_hal_msp.c \
Core/Src/system_stm32h7xx.c \
Core/Src/gpio.c \
Drivers/STM32H7xx_HAL_Driver/Src/stm32h7xx_hal_cortex.c \
Drivers/STM32H7xx_HAL_Driver/Src/stm32h7xx_hal_tim.c \
Drivers/STM32H7xx_HAL_Driver/Src/stm32h7xx_hal_tim_ex.c \
Drivers/STM32H7xx_HAL_Driver/Src/stm32h7xx_hal_rcc.c \
Drivers/STM32H7xx_HAL_Driver/Src/stm32h7xx_hal_rcc_ex.c \
Drivers/STM32H7xx_HAL_Driver/Src/stm32h7xx_hal_flash.c \
Drivers/STM32H7xx_HAL_Driver/Src/stm32h7xx_hal_flash_ex.c \
Drivers/STM32H7xx_HAL_Driver/Src/stm32h7xx_hal_gpio.c \
Drivers/STM32H7xx_HAL_Driver/Src/stm32h7xx_hal_hsem.c \
Drivers/STM32H7xx_HAL_Driver/Src/stm32h7xx_hal_dma.c \
Drivers/STM32H7xx_HAL_Driver/Src/stm32h7xx_hal_dma_ex.c \
Drivers/STM32H7xx_HAL_Driver/Src/stm32h7xx_hal_mdma.c \
Drivers/STM32H7xx_HAL_Driver/Src/stm32h7xx_hal_pwr.c \
Drivers/STM32H7xx_HAL_Driver/Src/stm32h7xx_hal_pwr_ex.c \
Drivers/STM32H7xx_HAL_Driver/Src/stm32h7xx_hal.c \
Drivers/STM32H7xx_HAL_Driver/Src/stm32h7xx_hal_i2c.c \
Drivers/STM32H7xx_HAL_Driver/Src/stm32h7xx_hal_i2c_ex.c \
Drivers/STM32H7xx_HAL_Driver/Src/stm32h7xx_hal_exti.c

# ASM sources
ASM_SOURCES =  \
startup_stm32h743xx.s


#######################################
# binaries
#######################################
PREFIX = arm-none-eabi-
# The gcc compiler bin path can be either defined in make command via GCC_PATH variable (> make GCC_PATH=xxx)
# either it can be added to the PATH environment variable.
ifdef GCC_PATH
CC = $(GCC_PATH)/$(PREFIX)gcc
AS = $(GCC_PATH)/$(PREFIX)gcc -x assembler-with-cpp
CP = $(GCC_PATH)/$(PREFIX)objcopy
SZ = $(GCC_PATH)/$(PREFIX)size
else
CC = $(PREFIX)gcc
AS = $(PREFIX)gcc -x assembler-with-cpp
CP = $(PREFIX)objcopy
SZ = $(PREFIX)size
endif
HEX = $(CP) -O ihex
BIN = $(CP) -O binary -S
 
#######################################
# CFLAGS
#######################################
# cpu
CPU = -mcpu=cortex-m7

# fpu
FPU = -mfpu=fpv5-d16

# float-abi
FLOAT-ABI = -mfloat-abi=hard

# mcu
MCU = $(CPU) -mthumb $(FPU) $(FLOAT-ABI)

# macros for gcc
# AS defines
AS_DEFS = 

# C defines
C_DEFS =  \
-DUSE_HAL_DRIVER \
-DSTM32H743xx


# AS includes
AS_INCLUDES = 

# C includes
C_INCLUDES =  \
-ICore/Inc \
-IDrivers/STM32H7xx_HAL_Driver/Inc \
-IDrivers/STM32H7xx_HAL_Driver/Inc/Legacy \
-IDrivers/CMSIS/Device/ST/STM32H7xx/Include \
-IDrivers/CMSIS/Include


# compile gcc flags
ASFLAGS = $(MCU) $(AS_DEFS) $(AS_INCLUDES) $(OPT) -Wall -fdata-sections -ffunction-sections

CFLAGS = $(MCU) $(C_DEFS) $(C_INCLUDES) $(OPT) -Wall -fdata-sections -ffunction-sections

ifeq ($(DEBUG), 1)
CFLAGS += -g -gdwarf-2
endif


# Generate dependency information
CFLAGS += -MMD -MP -MF"$(@:%.o=%.d)"


#######################################
# LDFLAGS
#######################################
# link script
LDSCRIPT = STM32H743IITx_FLASH.ld

# libraries
LIBS = -lc -lm -lnosys 
LIBDIR = 
LDFLAGS = $(MCU) -specs=nano.specs -T$(LDSCRIPT) $(LIBDIR) $(LIBS) -Wl,-Map=$(BUILD_DIR)/$(TARGET).map,--cref -Wl,--gc-sections

# default action: build all
all: $(BUILD_DIR)/$(TARGET).elf $(BUILD_DIR)/$(TARGET).hex $(BUILD_DIR)/$(TARGET).bin


#######################################
# build the application
#######################################
# list of objects
OBJECTS = $(addprefix $(BUILD_DIR)/,$(notdir $(C_SOURCES:.c=.o)))
vpath %.c $(sort $(dir $(C_SOURCES)))
# list of ASM program objects
OBJECTS += $(addprefix $(BUILD_DIR)/,$(notdir $(ASM_SOURCES:.s=.o)))
vpath %.s $(sort $(dir $(ASM_SOURCES)))

$(BUILD_DIR)/%.o: %.c Makefile | $(BUILD_DIR) 
	$(CC) -c $(CFLAGS) -Wa,-a,-ad,-alms=$(BUILD_DIR)/$(notdir $(<:.c=.lst)) $< -o $@

$(BUILD_DIR)/%.o: %.s Makefile | $(BUILD_DIR)
	$(AS) -c $(CFLAGS) $< -o $@

$(BUILD_DIR)/$(TARGET).elf: $(OBJECTS) Makefile
	$(CC) $(OBJECTS) $(LDFLAGS) -o $@
	$(SZ) $@

$(BUILD_DIR)/%.hex: $(BUILD_DIR)/%.elf | $(BUILD_DIR)
	$(HEX) $< $@
	
$(BUILD_DIR)/%.bin: $(BUILD_DIR)/%.elf | $(BUILD_DIR)
	$(BIN) $< $@	
	
$(BUILD_DIR):
	mkdir $@		

#######################################
# clean up
#######################################
clean:
	-rm -fR $(BUILD_DIR)
  
#######################################
# dependencies
#######################################
-include $(wildcard $(BUILD_DIR)/*.d)

# *** EOF ***

build.sh配置

在代码根目录 /device/st/stm32h743_harmony 里新建build.sh文件:

#!/bin/bash

set -e

OUT_DIR="$1"
TOOLCHAIN_DIR="$2"


function main(){
    ROOT_DIR=$(cd $(dirname "$0");pwd)
    if [ -z "${TOOLCHAIN_DIR}" ]; then
        make clean &&  make -j16 OUT_DIR_PATH=${OUT_DIR}
    else
        make clean &&  make -j16 OUT_DIR_PATH=${OUT_DIR} TOOLCHAIN_DIR_PATH=${TOOLCHAIN_DIR}
    fi
}

main "$@"

内核特性配置项 target_config.h

liteos_m的完整配置能力及默认配置在los_config.h定义,该头文件中的配置项可以根据不同的单板进行裁剪配置。
要进行不同的板级配置,则可将对应的配置项直接定义到对应单板的device/xxxx/target_config.h文件中,其他未定义的配置项,采用los_config.h中的默认值。
在代码根目录下创建 target_config.h 文件


#ifndef _TARGET_CONFIG_H
#define _TARGET_CONFIG_H

#include "stm32h7xx.h"

#ifdef __cplusplus
#if __cplusplus
extern "C" {
#endif /* __cplusplus */
#endif /* __cplusplus */

/*=============================================================================
                                        System clock module configuration
=============================================================================*/
#define OS_SYS_CLOCK                                        SystemCoreClock
#define LOSCFG_BASE_CORE_TICK_PER_SECOND                    (1000UL)
#define LOSCFG_BASE_CORE_TICK_HW_TIME                       0
#define LOSCFG_BASE_CORE_TICK_WTIMER                        0
#define LOSCFG_BASE_CORE_TICK_RESPONSE_MAX                  SysTick_LOAD_RELOAD_Msk

/*=============================================================================
                                        Hardware interrupt module configuration
=============================================================================*/
#define LOSCFG_PLATFORM_HWI                                 1
#define LOSCFG_USE_SYSTEM_DEFINED_INTERRUPT                 1
#define LOSCFG_PLATFORM_HWI_LIMIT                           128
/*=============================================================================
                                       Task module configuration
=============================================================================*/
#define LOSCFG_BASE_CORE_TSK_LIMIT                          24
#define LOSCFG_BASE_CORE_TSK_IDLE_STACK_SIZE                (0x500U)
#define LOSCFG_BASE_CORE_TSK_DEFAULT_STACK_SIZE             (0x2D0U)
#define LOSCFG_BASE_CORE_TSK_MIN_STACK_SIZE                 (0x130U)
#define LOSCFG_BASE_CORE_TIMESLICE                          1
#define LOSCFG_BASE_CORE_TIMESLICE_TIMEOUT                  20000
/*=============================================================================
                                       Semaphore module configuration
=============================================================================*/
#define LOSCFG_BASE_IPC_SEM                                 1
#define LOSCFG_BASE_IPC_SEM_LIMIT                           48
/*=============================================================================
                                       Mutex module configuration
=============================================================================*/
#define LOSCFG_BASE_IPC_MUX                                 1
#define LOSCFG_BASE_IPC_MUX_LIMIT                           24
/*=============================================================================
                                       Queue module configuration
=============================================================================*/
#define LOSCFG_BASE_IPC_QUEUE                               1
#define LOSCFG_BASE_IPC_QUEUE_LIMIT                         24
/*=============================================================================
                                       Software timer module configuration
=============================================================================*/
#define LOSCFG_BASE_CORE_SWTMR                              1
#define LOSCFG_BASE_CORE_SWTMR_ALIGN                        0
#define LOSCFG_BASE_CORE_SWTMR_LIMIT                        48
/*=============================================================================
                                       Memory module configuration
=============================================================================*/
#define LOSCFG_MEM_MUL_POOL                                 1
#define OS_SYS_MEM_NUM                                      20
/*=============================================================================
                                       Exception module configuration
=============================================================================*/
#define LOSCFG_PLATFORM_EXC                                 1
/* =============================================================================
                                       printf module configuration
============================================================================= */
#define LOSCFG_KERNEL_PRINTF                                1

#define LOSCFG_BASE_CORE_SCHED_SLEEP                        1

#define LOSCFG_SYS_HEAP_SIZE                                0x4000UL

#ifdef __cplusplus
#if __cplusplus
}
#endif /* __cplusplus */
#endif /* __cplusplus */

#endif /* _TARGET_CONFIG_H */

main函数

#include "main.h"
#include "gpio.h"
#include "los_task.h"

uint32_t LED_Task_Handle;
uint32_t Creat_LED_Task(void);
void LED_Task(void);
void AppTaskCreate(void);

void SystemClock_Config(void);

/**
  * @brief  The application entry point.
  * @retval int
  */
int main(void)
{
  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();
  SystemClock_Config();
  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  AppTaskCreate();
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }
}

/**
  * @brief System Clock Configuration
  * @retval None
  */
void SystemClock_Config(void)
{
  RCC_OscInitTypeDef RCC_OscInitStruct = {0};
  RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};

  /** Supply configuration update enable
  */
  HAL_PWREx_ConfigSupply(PWR_LDO_SUPPLY);
  /** Configure the main internal regulator output voltage
  */
  __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE3);

  while(!__HAL_PWR_GET_FLAG(PWR_FLAG_VOSRDY)) {}
  /** Initializes the RCC Oscillators according to the specified parameters
  * in the RCC_OscInitTypeDef structure.
  */
  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;
  RCC_OscInitStruct.HSIState = RCC_HSI_DIV1;
  RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;
  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE;
  if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
  {
    Error_Handler();
  }
  /** Initializes the CPU, AHB and APB buses clocks
  */
  RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
                              |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2
                              |RCC_CLOCKTYPE_D3PCLK1|RCC_CLOCKTYPE_D1PCLK1;
  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_HSI;
  RCC_ClkInitStruct.SYSCLKDivider = RCC_SYSCLK_DIV1;
  RCC_ClkInitStruct.AHBCLKDivider = RCC_HCLK_DIV1;
  RCC_ClkInitStruct.APB3CLKDivider = RCC_APB3_DIV1;
  RCC_ClkInitStruct.APB1CLKDivider = RCC_APB1_DIV1;
  RCC_ClkInitStruct.APB2CLKDivider = RCC_APB2_DIV1;
  RCC_ClkInitStruct.APB4CLKDivider = RCC_APB4_DIV1;

  if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_1) != HAL_OK)
  {
    Error_Handler();
  }
}

/* USER CODE BEGIN 4 */

uint32_t Creat_LED_Task(void)
{
   uint32_t uwRet = LOS_OK;	
	 
	 TSK_INIT_PARAM_S task_init_param;
	
	 task_init_param.pcName = "LED_Task";
	 task_init_param.usTaskPrio = 5;
	 task_init_param.pfnTaskEntry = (TSK_ENTRY_FUNC)LED_Task;
	 task_init_param.uwStackSize = 1024;
	
	 uwRet = LOS_TaskCreate(&LED_Task_Handle,&task_init_param);
	
	 return uwRet;
}

void LED_Task(void)
{
	 
   while(1)
	 {
	    HAL_GPIO_TogglePin(GPIOA,GPIO_PIN_15);
		  //HAL_GPIO_WritePin(GPIOA, GPIO_PIN_15, GPIO_PIN_RESET);
		  LOS_TaskDelay(1000);	
   }
}

void AppTaskCreate(void)
{
    uint32_t uwRet = LOS_OK;
    uwRet = LOS_KernelInit();
	  if(uwRet==LOS_OK)
		{
        Creat_LED_Task();
        LOS_Start();
		}
}
/* USER CODE END 4 */

/**
  * @brief  This function is executed in case of error occurrence.
  * @retval None
  */
void Error_Handler(void)
{
  /* USER CODE BEGIN Error_Handler_Debug */
  /* User can add his own implementation to report the HAL error return state */
  __disable_irq();
  while (1)
  {
  }
  /* USER CODE END Error_Handler_Debug */
}

#ifdef  USE_FULL_ASSERT
/**
  * @brief  Reports the name of the source file and the source line number
  *         where the assert_param error has occurred.
  * @param  file: pointer to the source file name
  * @param  line: assert_param error line source number
  * @retval None
  */
void assert_failed(uint8_t *file, uint32_t line)
{
  /* USER CODE BEGIN 6 */
  /* User can add his own implementation to report the file name and line number,
     ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
  /* USER CODE END 6 */
}
#endif /* USE_FULL_ASSERT */


产品级 vendor 配置

config.json配置

\vendor\st\stm32h743_harmony 下新建 config.json

{
    "product_name": "stm32h743_harmony",     //产品名称,支持自定义,建议与vendor下的三级目录名称一致
    "ohos_version": "OpenHarmony 3.0",       //HarmonyOS版本号
    "device_company": "st",                  //芯片解决方案厂商名称,建议与device的二级目录名称一致
    "board": "stm32h743_harmony",            //开发板名称,建议与device的三级级目录名称一致
    "kernel_type": "liteos_m",               //内核类型,应与开发板支持的内核类型匹配
    "kernel_version": "3.0.0",               //内核版本号,应与开发板支持的内核版本匹配
    "subsystems": [                          //产品选择的子系统,应为OS支持的子系统
      {
        "subsystem": "kernel",    
        "components": [                      //产品选择的某个子系统下的组件,应为某个子系统支持的组件
          { "component": "liteos_m",
            "features":[                     //产品配置的某个组件的特性
              "enable_ohos_kernel_liteos_m_fs = false",
              "enable_ohos_kernel_liteos_m_kal = false"
            ]
          }
        ]
      }
    ],
    "vendor_adapter_dir": "//device/st/stm32h743_harmony",
    "third_party_dir": "//third_party",
    "product_adapter_dir": "",
    "ohos_product_type":"",
    "ohos_manufacture":"",
    "ohos_brand":"",
    "ohos_market_name":"",
    "ohos_product_series":"",
    "ohos_product_model":"",
    "ohos_software_model":"",
    "ohos_hardware_model":"",
    "ohos_hardware_profile":"",
    "ohos_serial":"",
    "ohos_bootloader_version":"",
    "ohos_secure_patch_level":"",
    "ohos_abi_list":""
}

编译脚本配置

\vendor\st\stm32h743_harmony 下新建 BUILD.gn

group("stm32h743_harmony") {
}

六、开始移植

将配置好的目录移植到鸿蒙源码对应的目录,
即device里的st文件夹移到鸿蒙device目录里,
vendor里的st文件夹移植到鸿蒙vendor目录里

点击“+”新建终端,再用cd命令进入到源码目录

输入 hb set

选择st下的stm32h743_harmony后回车,再输入hb build -f 命令编译
不出意外会报错:

这是官方源码漏了一个字符串,直接进入对应目录,对应行号添加一下:

只改这一个,再编译后,我这里又出现新的问题:
鸿蒙这玩意就是坑多,而且不允许有一个警告,有就编译不通过。
明明有这个头文件却识别不出来,后续改了其他地方,报的错又不一样了,感觉还是脚本和makefile那里没写好,毕竟我也是参考的别人的。
等博主makefile学精了以后再来尝试吧,本贴就给各位借鉴一下。如有大佬指点就更好了。
另外如果正常编译通过的话会显示编译seccess,然后再把OUT目录下的hex文件烧录到板子上就算成功了。

有关移植openharmony到STM32H743IIT6【记录帖】的更多相关文章

  1. STM32读取串口传感器数据(颗粒物传感器,主动上传) - 2

    文章目录1.开发板选择*用到的资源2.串口通信(个人理解)3.代码分析(注释比较详细)1.主函数2.串口1配置3.串口2配置以及中断函数4.注意问题5.源码链接1.开发板选择我用的是STM32F103RCT6的板子,不过代码大概在F103系列的板子上都可以运行,我试过在野火103的霸道板上也可以,主要看一下串口对应的引脚一不一样就行了,不一样的就更改一下。*用到的资源keil5软件这里用到了两个串口资源,采集数据一个,串口通信一个,板子对应引脚如下:串口1,TX:PA9,RX:PA10串口2,TX:PA2,RX:PA32.串口通信(个人理解)我就从串口采集传感器数据这个过程说一下我自己的理解,

  2. ruby-on-rails - 可移植 Ruby on Rails 环境 - 2

    我给自己买了一个新的8gigUSBkey,我正在寻找一个合适的解决方案来拥有一个可移植RoR环境来学习。我在谷歌上搜索了一下,发现了一些可能性,但我很想听听一些现实生活中的经历和意见。谢谢! 最佳答案 我喜欢InstantRails,非常容易使用,无需安装程序,也不会修改您的系统环境。 关于ruby-on-rails-可移植RubyonRails环境,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/q

  3. STM32的HAL和LL库区别和性能对比 - 2

    LL库和HAL库简介LL:Low-Layer,底层库HAL:HardwareAbstractionLayer,硬件抽象层库LL库和hal库对比,很精简,这实际上是一个精简的库。LL库的配置选择如下:在STM32CUBEMX中,点击菜单的“ProjectManager”–>“AdvancedSettings”,在下面的界面中选择“AdvancedSettings”,然后在每个模块后面选择使用的库总结:1、如果使用的MCU是小容量的,那么STM32CubeLL将是最佳选择;2、如果结合可移植性和优化,使用STM32CubeHAL并使用特定的优化实现替换一些调用,可保持最大的可移植性。另外HAL和L

  4. ESP32学习入门:WiFi连接网络 - 2

    目录一、ESP32简单介绍二、ESP32Wi-Fi模块介绍三、ESP32Wi-Fi编程模型四、ESP32Wi-Fi事件处理流程 五、ESP32Wi-Fi开发环境六、ESP32Wi-Fi具体代码七、ESP32Wi-Fi代码解读6.1主程序app_main7.2自定义代码wifi_init_sta()八、ESP32Wi-Fi连接验证8.1测试方法8.2服务器模拟工具sscom58.3测试代码8.4测试结果前言为了开发一款亚马逊物联网产品,开始入手ESP32模块。为了能够记录自己的学习过程,特记录如下操作过程。一、ESP32简单介绍ESP32是一套Wi-Fi(2.4GHz)和蓝牙(4.2)双模解决方

  5. Spring Security 6.0系列【32】授权服务器篇之默认过滤器 - 2

    有道无术,术尚可求,有术无道,止于术。本系列SpringBoot版本3.0.4本系列SpringSecurity版本6.0.2本系列SpringAuthorizationServer版本1.0.2源码地址:https://gitee.com/pearl-organization/study-spring-security-demo文章目录前言1.OAuth2AuthorizationServerMetadataEndpointFilter2.OAuth2AuthorizationEndpointFilter3.OidcProviderConfigurationEndpointFilter4.N

  6. ruby - 摘要::CRC32 与 Zlib - 2

    在我的代码中,我需要使用各种算法(包括CRC32)对文件进行哈希处理。因为我还在Digest系列中使用其他加密哈希函数,所以我认为为它们维护一个一致的接口(interface)会很好。为了记录,我确实找到了digest-crc,一颗完全符合我要求的gem。问题是,Zlib是标准库的一部分,并且有一个我想重用的CRC32工作实现。此外,它是用C编写的,因此它应该提供与digest-crc相关的卓越性能,后者是纯ruby​​实现。实现Digest::CRC32一开始看起来非常简单:%w(digestzlib).each{|f|requiref}classDigest::CRC32一切正常:

  7. ruby - 安装gem : Couldn't reserve space for cygwin's heap, Win32错误487错误 - 2

    我正在尝试在我的机器上安装win32-apigem,但在构建native扩展时我遇到了一些问题:$geminstallwin32-api--no-ri--rdocTemporarilyenhancingPATHtoincludeDevKit...Buildingnativeextensions.Thiscouldtakeawhile...C:\Programs\dev_kit\bin\make.exe:***Couldn'treservespaceforcygwin'sheap,Win32error0ERROR:Errorinstallingwin32-api:ERROR:Failed

  8. Ruby 1.9 - 没有这样的文件可以加载 'win32/open3' - 2

    我在Windows上运行ruby​​1.9.2并试图移植在Ruby1.8中工作的代码。该代码使用以前运行良好的Open4.popen4。对于1.9.2,我做了以下事情:通过geminstallPOpen4安装了POpen4需要POpen4通过require'popen4'尝试像这样使用POpen4:Open4.popen4("cmd"){|io_in,io_out,io_er|...}当我这样做时,我得到了错误:nosuchfiletoload--win32/open3如果我尝试安装win32-open3(geminstallwin32-open3),我会收到错误消息:win32-op

  9. Dell Inspiron 5488加内存32G - 2

    DellInspiron5488加内存32G 原装内置内存仅仅8G,目前看,真的太小了! 1.内存型号Dell5488内存型号:DDR42666。笔记本有两个内存插槽,原装占了一个,还能扩展一个。 2.买内存如果买Dell原装笔记本内存,8G就得500块左右。 我咨询了一下,三星的笔记本内存,可以兼容。16G,299块(2023年2月23日,京东价) Dell5488内存组合,最多只能插两根16G内存。 我于是买了两根三星16G内存。装上,很爽😄 跑国产系统统信UOS,再也看不到用交换区了,32G内存,爽!  

  10. ruby - 如何在 Ruby 中构建可移植的绝对路径? - 2

    让我们假设一个脚本需要访问一个目录,比如在“任意”操作系统上的/some/where/abc。在Ruby中构建路径有几个选项:File.join('','some','where','abc')File.absolute_path("some#{File::SEPARATOR}where#{File::SEPARATOR}abc",File::SEPARATOR)标准API中的路径名我相信第一个解决方案足够清晰,但符合惯用语。根据我的经验,一些代码审查会要求评论来解释它的作用......问题有没有更好的方法来构建绝对路径是Ruby,其中更好的意思是“完成工作并为自己说话”?

随机推荐