记录一下移植openharmony到STM32H743IIT6的过程
选择第一个创建工程

选择对应的芯片,这里我用的是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使用ssh连接远程Ubuntu服务器
可以按官方的教程用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/lite | HarmonyOS基础编译构建框架 |
| /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/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

##########################################################################################################################
# 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 ***
在代码根目录 /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 "$@"
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 */
#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\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文件烧录到板子上就算成功了。
文章目录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.串口通信(个人理解)我就从串口采集传感器数据这个过程说一下我自己的理解,
我给自己买了一个新的8gigUSBkey,我正在寻找一个合适的解决方案来拥有一个可移植RoR环境来学习。我在谷歌上搜索了一下,发现了一些可能性,但我很想听听一些现实生活中的经历和意见。谢谢! 最佳答案 我喜欢InstantRails,非常容易使用,无需安装程序,也不会修改您的系统环境。 关于ruby-on-rails-可移植RubyonRails环境,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/q
LL库和HAL库简介LL:Low-Layer,底层库HAL:HardwareAbstractionLayer,硬件抽象层库LL库和hal库对比,很精简,这实际上是一个精简的库。LL库的配置选择如下:在STM32CUBEMX中,点击菜单的“ProjectManager”–>“AdvancedSettings”,在下面的界面中选择“AdvancedSettings”,然后在每个模块后面选择使用的库总结:1、如果使用的MCU是小容量的,那么STM32CubeLL将是最佳选择;2、如果结合可移植性和优化,使用STM32CubeHAL并使用特定的优化实现替换一些调用,可保持最大的可移植性。另外HAL和L
目录一、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)双模解决方
有道无术,术尚可求,有术无道,止于术。本系列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
在我的代码中,我需要使用各种算法(包括CRC32)对文件进行哈希处理。因为我还在Digest系列中使用其他加密哈希函数,所以我认为为它们维护一个一致的接口(interface)会很好。为了记录,我确实找到了digest-crc,一颗完全符合我要求的gem。问题是,Zlib是标准库的一部分,并且有一个我想重用的CRC32工作实现。此外,它是用C编写的,因此它应该提供与digest-crc相关的卓越性能,后者是纯ruby实现。实现Digest::CRC32一开始看起来非常简单:%w(digestzlib).each{|f|requiref}classDigest::CRC32一切正常:
我正在尝试在我的机器上安装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
我在Windows上运行ruby1.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
DellInspiron5488加内存32G 原装内置内存仅仅8G,目前看,真的太小了! 1.内存型号Dell5488内存型号:DDR42666。笔记本有两个内存插槽,原装占了一个,还能扩展一个。 2.买内存如果买Dell原装笔记本内存,8G就得500块左右。 我咨询了一下,三星的笔记本内存,可以兼容。16G,299块(2023年2月23日,京东价) Dell5488内存组合,最多只能插两根16G内存。 我于是买了两根三星16G内存。装上,很爽😄 跑国产系统统信UOS,再也看不到用交换区了,32G内存,爽!
让我们假设一个脚本需要访问一个目录,比如在“任意”操作系统上的/some/where/abc。在Ruby中构建路径有几个选项:File.join('','some','where','abc')File.absolute_path("some#{File::SEPARATOR}where#{File::SEPARATOR}abc",File::SEPARATOR)标准API中的路径名我相信第一个解决方案足够清晰,但符合惯用语。根据我的经验,一些代码审查会要求评论来解释它的作用......问题有没有更好的方法来构建绝对路径是Ruby,其中更好的意思是“完成工作并为自己说话”?