兆易创新Cortex-M7 GD32H459适配OpenHarmony轻量系统适配教程

news2024/10/26 21:20:17

笔者利用国庆假期的时间适配了一款Cortex-M7 的国产厂商兆易创新GD32H459,开源地址:https://gitee.com/GD32H759_OpenHarmony

OpenHarmony 4.1r 轻量系统移植到GD32H759文档

1.学习本文档的意义

1.学习如何移植OpenHarmony轻量系统4.1r到GD32 m7内核GD32H737/GD32H757/GD32H759系列MCU上。

2.本文档移植的具体型号为GD32H759IMT6,采用的开发板是慧勤智远GD32H759IMT6开发板

2.学习OpenHarmony轻量系统开发

1.移植之前必须要先熟悉慧勤智远GD32H759IMT6开发板的使用,了解板子的裸机编程、板子裸机工程的默认调试串口。

2.获取到GD32H759IMT6的底层驱动源代码(Firmware Library)

2.0 熟悉GD32H759IMT6的裸机开发

1.兆易创新提供了官方的开发工具GD32 Embedded Builder,下载地址:https://www.gd32mcu.com/cn/download/0?kw=GD32H7

image.png

2.解压直接打开(免安装)

image.png

3.新建C工程

image.png

image.png

4.选择arm工程

image.png

5.选择GD32H759系列芯片GD32H759IMT6

image.png

6.此时就可以看到GD32H759IMT6的驱动库、ld链接文件和.s文件

image.png

7.简单点个灯

image.png


image.png

8.调试串口,PA9和PA10两个GPIO口

image.png

GD32H759IMT6点灯和printf打印样例

2.1 安装源码对应的hb工具

使用什么版本的OpenHarmony的源码,就安装此版本源码对应的hb工具

前提条件
Linux服务器,Ubuntu16.04及以上64位系统版本。
Python 3.7.4及以上。
源码下载成功。
安装hb
在源码根目录下执行:

python3 -m pip install --user build/hb

执行hb help有相关帮助信息,有打印信息即表示安装成功,当前hb 主要提供了hb set,hb build,hb tool,hb env,hb clean五个选项。卸载方法:

python3 -m pip uninstall ohos-build

3.轻量系统GD32H759IMT6芯片移植案例

3.1 目录规划

GD32H759IMT6基于Cortex-M7,移植架构采用Board与SoC分离方案,使用arm-none-eabi-gcc工具链(在轻量系统源码中可以指定编译工具链路径,具体可以查看 https://gitee.com/AT32437_OpenHarmony/arm-gnu-toolchain-12.3.rel1-x86_64-arm-none-eabi)

芯片适配目录规划为:

device
├── board                  --- 单板厂商目录
│   └── gigadevice_board   --- 单板厂商名字:兆易创新
└── soc                    --- SoC厂商目录
    └── gigadevice         --- SoC厂商名称
          └── gd32h7xx     --- SoC Series名

产品样例目录规划为:

vendor
└── gigadevice              --- 开发产品样例厂商目录
    └── GD32H759IMT6_BOARD  --- 产品名字:GD32H759IMT6_BOARD

3.2 预编译适配

预编译适配内容就是围绕hb set命令的适配,使工程能够通过该命令设置根目录、单板目录、产品目录、单板公司名等环境变量,为后续适配编译做准备。

具体的预编译适配步骤如下:

1.在vendor\gigadevice\GD32H759IMT6_BOARD\目录下新增config.json文件,用于描述这个产品样例所使用的单板、内核等信息,描述信息可参考如下内容:

{
  "product_name": "GD32H759IMT6_BOARD",      --- 用于hb set进行选择时,显示的产品名称
  "ohos_version": "OpenHarmony 4.1",
  "type": "mini",                       --- 构建系统的类型,mini/small/standard
  "version": "3.0",                     --- 构建系统的版本,1.0/2.0/3.0
  "device_company": "gigadevice_board",     --- 单板厂商名,用于编译时找到device\board\gigadevice_board目录
  "board": "atstartf437",               --- 单板名,用于编译时找到device\board\gigadevice_board\gd32h759目录
  "kernel_type": "liteos_m",            --- 内核类型,因为OpenHarmony支持多内核,一块单板可能适配了多个内核,所以需要指定某个内核进行编译
  "kernel_version": "3.0.0",            --- 内核版本,一块单板可能适配了多个linux内核版本,所以需要指定某个具体的内核版本进行编译
  "subsystems": [ ]                     --- 选择所需要编译构建的子系统
}

2.在device\board\gigadevice_board\gd32h759\liteos_m目录下新增一个config.gni文件,用于描述该产品的编译配置信息,内核配置为m7

# 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".
# GD32H759IMT6
board_cpu = "cortex-m7"

3.3 添加GD32H759IMT6驱动库

把原厂的驱动文件放置在device\soc\gigadevice\gd32h7xx\libraries和device\soc\gigadevice\gd32h7xx\liteos_m目录下面,为了消除编译报错需要进行一些修改

1.device/soc/artery/at32f4xx/libraries/drivers/inc/gd32h7xx_timer.h中INVALID修改为GD32H759IMT6_INVALID,规避重定义问题

/* constants definitions */
/* UPIFBU bit state */
/*GD32H759IMT6*/
typedef enum {VALID_RESET = 0, VALID_SET = 1, GD32H759IMT6_INVALID = 2} UPIFBUStatus;

2.device/soc/artery/at32f4xx/libraries/drivers/src/gd32h7xx_timer.c中INVALID修改为GD32H759IMT6_INVALID,规避重定义问题

/*!
    \brief      get the UPIFBU bit in the TIMERx_CNT register
    \param[in]  timer_periph: TIMERx(x=0~7,14~16,22,23,30,31,40~44,50,51)
    \param[out] none
    \retval     UPIFBUStatus: VALID_SET or VALID_RESET or GD32H759IMT6_INVALID
      \ret        VALID_SET: the UPIFBU is valid and value is 1
      \ret        VALID_RESET: the UPIFBU is valid and value is 0
      \ret        GD32H759IMT6_INVALID: the UPIFBU is invalid
*/
UPIFBUStatus timer_upifbu_bit_get(uint32_t timer_periph)
{
    if((TIMER_CTL0(timer_periph) & TIMER_CTL0_UPIFBUEN)) {
        if((TIMER50 == timer_periph) || (TIMER51 == timer_periph)) {
            if(TIMER_CNTH(timer_periph) & TIMER_CNT_UPIFBU) {
                return VALID_SET;
            } else {
                return VALID_RESET;
            }
        } else {
            if(TIMER_CNT(timer_periph) & TIMER_CNT_UPIFBU) {
                return VALID_SET;
            } else {
                return VALID_RESET;
            }
        }
    } else {
        return GD32H759IMT6_INVALID;
    }
}

3.4 修改.ld文件

GD32H759IMT6是链接脚本gd32h7xx_flash.ld,适配OpenHarmony轻量系统需要做以下修改,具体修改对比请查看GD32H759IMT6适配OpenHarmony轻量系统前后gd32h7xx_flash

1.注释GROUP(libgcc.a libc.a libm.a libnosys.a),取消libgcc.a libc.a libm.a libnosys.a的引用

3.5 在config.gni添加编译时需要的cflag和LDFLAGS

1.前面提到了兆易创新提供了开发工具GD32 Embedded Builder,需要从中提取编译时需要添加的编译标志,如下图所示

image.png

arm-none-eabi-gcc -mcpu=cortex-m7 -mthumb -O0 -fmessage-length=0 -fsigned-char -ffunction-sections -fdata-sections  -g3 -Wl,-Map,"GD32H759IMT6.map" -T gd32h7xx_flash.ld -Xlinker --gc-sections -L"../ldscripts" -Xlinker --cref --specs=nano.specs -u_printf_float --specs=nosys.specs -o "GD32H759IMT6.elf"  ./src/gd32h759i_eval.o ./src/gd32h7xx_it.o ./src/main.o ./src/systick.o  ./firmware/gd32h7xx_standard_peripheral/src/gd32h7xx_adc.o ./firmware/gd32h7xx_standard_peripheral/src/gd32h7xx_can.o ./firmware/gd32h7xx_standard_peripheral/src/gd32h7xx_cau.o ./firmware/gd32h7xx_standard_peripheral/src/gd32h7xx_cau_aes.o ./firmware/gd32h7xx_standard_peripheral/src/gd32h7xx_cau_des.o ./firmware/gd32h7xx_standard_peripheral/src/gd32h7xx_cau_tdes.o ./firmware/gd32h7xx_standard_peripheral/src/gd32h7xx_cmp.o ./firmware/gd32h7xx_standard_peripheral/src/gd32h7xx_cpdm.o ./firmware/gd32h7xx_standard_peripheral/src/gd32h7xx_crc.o ./firmware/gd32h7xx_standard_peripheral/src/gd32h7xx_ctc.o ./firmware/gd32h7xx_standard_peripheral/src/gd32h7xx_dac.o ./firmware/gd32h7xx_standard_peripheral/src/gd32h7xx_dbg.o ./firmware/gd32h7xx_standard_peripheral/src/gd32h7xx_dci.o ./firmware/gd32h7xx_standard_peripheral/src/gd32h7xx_dma.o ./firmware/gd32h7xx_standard_peripheral/src/gd32h7xx_edout.o ./firmware/gd32h7xx_standard_peripheral/src/gd32h7xx_efuse.o ./firmware/gd32h7xx_standard_peripheral/src/gd32h7xx_enet.o ./firmware/gd32h7xx_standard_peripheral/src/gd32h7xx_exmc.o ./firmware/gd32h7xx_standard_peripheral/src/gd32h7xx_exti.o ./firmware/gd32h7xx_standard_peripheral/src/gd32h7xx_fac.o ./firmware/gd32h7xx_standard_peripheral/src/gd32h7xx_fmc.o ./firmware/gd32h7xx_standard_peripheral/src/gd32h7xx_fwdgt.o ./firmware/gd32h7xx_standard_peripheral/src/gd32h7xx_gpio.o ./firmware/gd32h7xx_standard_peripheral/src/gd32h7xx_hau.o ./firmware/gd32h7xx_standard_peripheral/src/gd32h7xx_hau_sha_md5.o ./firmware/gd32h7xx_standard_peripheral/src/gd32h7xx_hpdf.o ./firmware/gd32h7xx_standard_peripheral/src/gd32h7xx_hwsem.o ./firmware/gd32h7xx_standard_peripheral/src/gd32h7xx_i2c.o ./firmware/gd32h7xx_standard_peripheral/src/gd32h7xx_ipa.o ./firmware/gd32h7xx_standard_peripheral/src/gd32h7xx_lpdts.o ./firmware/gd32h7xx_standard_peripheral/src/gd32h7xx_mdio.o ./firmware/gd32h7xx_standard_peripheral/src/gd32h7xx_mdma.o ./firmware/gd32h7xx_standard_peripheral/src/gd32h7xx_misc.o ./firmware/gd32h7xx_standard_peripheral/src/gd32h7xx_ospi.o ./firmware/gd32h7xx_standard_peripheral/src/gd32h7xx_ospim.o ./firmware/gd32h7xx_standard_peripheral/src/gd32h7xx_pmu.o ./firmware/gd32h7xx_standard_peripheral/src/gd32h7xx_rameccmu.o ./firmware/gd32h7xx_standard_peripheral/src/gd32h7xx_rcu.o ./firmware/gd32h7xx_standard_peripheral/src/gd32h7xx_rspdif.o ./firmware/gd32h7xx_standard_peripheral/src/gd32h7xx_rtc.o ./firmware/gd32h7xx_standard_peripheral/src/gd32h7xx_rtdec.o ./firmware/gd32h7xx_standard_peripheral/src/gd32h7xx_sai.o ./firmware/gd32h7xx_standard_peripheral/src/gd32h7xx_sdio.o ./firmware/gd32h7xx_standard_peripheral/src/gd32h7xx_spi.o ./firmware/gd32h7xx_standard_peripheral/src/gd32h7xx_syscfg.o ./firmware/gd32h7xx_standard_peripheral/src/gd32h7xx_timer.o ./firmware/gd32h7xx_standard_peripheral/src/gd32h7xx_tli.o ./firmware/gd32h7xx_standard_peripheral/src/gd32h7xx_tmu.o ./firmware/gd32h7xx_standard_peripheral/src/gd32h7xx_trigsel.o ./firmware/gd32h7xx_standard_peripheral/src/gd32h7xx_trng.o ./firmware/gd32h7xx_standard_peripheral/src/gd32h7xx_usart.o ./firmware/gd32h7xx_standard_peripheral/src/gd32h7xx_vref.o ./firmware/gd32h7xx_standard_peripheral/src/gd32h7xx_wwdgt.o  ./firmware/cmsis/src/syscalls.o ./firmware/cmsis/src/system_gd32h7xx.o  ./firmware/cmsis/gcc_startup/startup_gd32h7xx.o   

2.还需要添加MCU宏GD32H7XX,USE_STDPERIPH_DRIVER

3.6 Cortex-M7的MCU和Cortex-M4适配Liteos-m的不同——fpu适配

适配Cortex-M7的GD32H759IMT6时,需要在config.gni的board_cflags中添加-D__FPU_PRESENT=1U``-D__FPU_USED=1U,并且需要在gd32h7xx.h中注释掉__FPU_PRESENT。

OpenHarmony轻量系统源码kernel/liteos_m/arch/arm/cortex-m7/gcc/los_dispatch.S中需要同时定义__FPU_PRESENT=1U和__FPU_USED=1U,fpu才能添加进编译

相关issues:https://gitee.com/openharmony/kernel_liteos_m/issues/I4D575?from=project-issue

image.png

3.7 修改.s文件,并且LiteOS-M接管外部GD32H759IMT6中断

startup_gd32h7xx.S中继续使用GD32H759IMT6原生的中断处理函数

                    .word     SysTick_Handler                     /*使用GD32H759IMT6原生的中断处理函数*/

然后在target_config.hLOSCFG_PLATFORM_HWILOSCFG_USE_SYSTEM_DEFINED_INTERRUPT定义为1。表明LiteOS-M接管了GD32H759IMT6的中断

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2210302.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

[论文期刊|稳定检索]2024年信号处理与光学工程国际会议(SPOE 2024 )

2024年信号处理与光学工程国际会议 2024 International Conference on Signal Processing and Optical Engineering 【1】大会信息 会议名称:2024年信号处理与光学工程国际会议 会议简称:SPOE 2024 大会时间:请查看官网 大会地点&#xf…

【JS试题】对象键排序问题的神仙试题

前言 题目如下: const obj { a: 0 } obj[1] 0 obj[obj.a] obj.a const values Object.values(obj) obj[values[1]] obj.a console.log(obj);在此之前需要先了解 JS 对象键的排序问题,JS会对对象的属性进行处理,把所有 Number类型 和 数…

AWS S3迁移到阿里云OSS实践

本教程讲解如何将AWS S3中的数据迁移到阿里云对象存储OSS。 如果您需要将AWS S3中的数据通过专线迁移到阿里云对象存储OSS,请参见使用代理迁移。 概述 阿里云在线迁移服务是阿里云提供的存储产品数据通道。使用在线迁移服务,您可以将第三方数据轻松迁…

GaussDB主备版 8 工具学习

1 客户端工具 1.1 gsql 1.1.1 类似plsql 1.1.2 默认只支持从服务器本机连接,如果需要连接到远端的数据库,必须在服务端进行配置 1.1.3 gsql --help 1.1.4 命令参考-https://doc.hcs.huawei.com/db/zh-cn/gaussdb/24.1.30/tg/gaussdb-38-0007.html 1.1.…

Golang | Leetcode Golang题解之第474题一和零

题目: 题解: func findMaxForm(strs []string, m, n int) int {dp : make([][]int, m1)for i : range dp {dp[i] make([]int, n1)}for _, s : range strs {zeros : strings.Count(s, "0")ones : len(s) - zerosfor j : m; j > zeros; j--…

【网络基础知识】网络通信概述与TCPIP、UDP协议

网络基础知识 介绍网络基础知识,譬如网络通信概述、OSI 七层模型、IP 地址、TCP/IP 协议族、TCP 和 UDP 协议等等, 旨在以引导入门、了解为主,其中并不会深入、详细地介绍这些内容; Linux网络编程入门移步:【Linux网络…

使用CSS和HTML实现3D图片环绕效果

使用CSS和HTML实现3D图片环绕效果 在本篇博客中,将介绍如何使用HTML和CSS实现一个3D图片环绕效果。这个效果不仅具有视觉吸引力,而且具有高度的互动性,鼠标悬停时动画会暂停。接下来将一步步讲解这个效果的实现过程。 1. 效果 2. 页面结构与…

Python人脸识别技术进阶篇

在上一篇文章中,我们介绍了如何使用Python进行基本的人脸识别。本文将深入探讨人脸识别技术的高级应用,包括如何优化识别性能、处理复杂环境下的识别挑战以及如何利用深度学习模型来提高识别准确性等话题。 人脸识别的原理回顾 人脸识别流程 人脸识别…

使用 llamafile 以单个文件运行本地大模型

在开发 GenAI 应用时,有一个在本地运行的大模型是非常重要的,可以很方便地进行开发和测试。目前有几个流行的在本地运行大模型的选项,包括 Ollama 和 LM Studio。 这里介绍的是 llamafile。llamafile 是 Mozilla 支持的开源项目。llamafile …

OceanBase + DolphinScheduler,搭建分布式大数据调度平台的实践

本文整理自白鲸开源联合创始人,Apache DolphinScheduler PMC Chair,Apache Foundation Member 代立冬的演讲。主要介绍了DolphinScheduler及其架构、DolphinScheduler与OceanBase 的联合大数据方案。 DolphinScheduler是什么? Apache Dolphi…

第十六章 RabbitMQ延迟消息之延迟插件优化

目录 一、引言 二、优化方案 三、核心代码实现 3.1. 生产者代码 3.2. 消息处理器 3.3. 自定义多延迟消息封装类 3.4. 订单实体类 3.5. 消费者代码 四、运行效果 一、引言 上一章节我们提到,直接使用延迟插件,创建一个延迟指定时间的消息&…

一款零依赖、跨平台的流媒体协议处理工具,支持 RTSP、WebRTC、RTMP 等视频流协议的处理

大家好,今天给大家分享一款功能强大的流媒体协议处理工具go2rtc,支持多种协议和操作系统,具有零依赖、零配置、低延迟等特点。 项目介绍 go2rtc可以从各种来源获取流,包括 RTSP、WebRTC、HomeKit、FFmpeg、RTMP 等,并…

第一个servlet程序

文章目录 在原有工程上建立模块前端配置前后端映射关系添加外部依赖库后端代码启动配置 在原有工程上建立模块 添加web框架 前端 应用结构 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>第一…

【云原生技术】Docker容器进阶知识

文章目录 namespace概述一、namespace的基本概念二、namespace的主要作用三、namespace的类型四、namespace的操作五、namespace在容器技术中的应用 cgroup一、cgroup的基本概念二、cgroup的主要功能三、cgroup的子系统介绍四、cgroup的应用场景五、cgroup的使用与管理 cgroup和…

uniapp-小程序开发0-1笔记大全

uniapp官网&#xff1a; https://uniapp.dcloud.net.cn/tutorial/syntax-js.html uniapp插件市场&#xff1a; https://ext.dcloud.net.cn/ uviewui类库&#xff1a; https://www.uviewui.com/ 柱状、扇形、仪表盘库&#xff1a; https://www.ucharts.cn/v2/#/ CSS样式&…

余 弦 曲 线

1&#xff0e;问题描述 在屏幕上画出余弦函数cos&#xff08;x&#xff09;曲线&#xff0c;如图1.6所示。 图1.6 余弦函数cos&#xff08;x&#xff09;曲线 2&#xff0e;问题分析 连续的曲线是由点组成的,点与点之间距离比较近&#xff0c;看上去就是曲线了&#xff0c;…

uni-app 如何全局设置,获取app.vue里面的值

在globalData里设置一个值 通过下面方法修改 this.$options.globalData.$versonStatus status 在页面中通过getApp()获取 getApp().globalData.$versonStatus

<<迷雾>> 第11章 全自动加法计算机(3)--存储器示例 示例电路

info::操作说明 将一组比特单元扩展为多组的结果, 操作原理类似 注: 一次只能操作一组, 此处需进一步引入地址译码器才能具体进行操作, 见后面的例子, 此处仅展示结构原理 primary::在线交互操作链接 https://cc.xiaogd.net/?startCircuitLinkhttps://book.xiaogd.net/cyjsjdm…

C++模板初阶速成

温馨提示&#xff1a;本篇文章依旧是c速成系列的文章&#xff0c;但和以往有所不同的是&#xff0c;本篇文章带大家简单了解并能够学会使用模板 泛型编程 概念&#xff1a;编写与类型无关的通用代码&#xff0c;是代码复用的一种手段。 什么是复用&#xff1f; 简单来说就是…

分组相关 -- EoO原理

EoO (Ethernet over OTN) 是将以太网信号处理后&#xff0c;经过封装、映射后上OTN系统&#xff0c;通过WDM通道来传送的技术。传统的OTN承载ETH专线&#xff0c;不支持限速&汇聚等场景。引入EoO技术后&#xff0c;支持LAG、QoS、OAM等L2层的功能特性&#xff0c;实现端口限…