当前位置: 首页 > news >正文

【GD32】(一) 开发方式简介及标准库开发入门

文章目录

    • 0 前言
    • 1 开发方式选择
    • 2 标准库模板的创建
    • 3 遇到的问题和解决方法

0 前言

  因为项目关系,需要使用GD32。之前对此早有耳闻,知道这个是一个STM32的替代品,据说甚至可以直接烧录STM32的程序(一般是同型号),但是GD32型号的编排更加复杂,不能和STM32一一对应,所以,从长远角度来看,还是建议按照官方推荐的方式来开发,其实本质上和STM32开发是差不多的,所以对于熟练STM32开发的人来说上手还是挺快的,关键是要学会查找和使用资料。

GD32开发资料下载——记得点开右上角的箭头可以展开更多

1 开发方式选择

  可能是为了跟上STM32的脚步,兆易最近(2024.04)也开发了适配自家产品的集成开发环境——Embedded Builder,对标STM32的CubeIDE。

在这里插入图片描述

但是我体验下来的感觉并不好,一个是支持的型号有限(没有我正在使用的型号),一个是win7(莫得选择)支持不太好,打开之后不知道为啥显示屏一大段黑条,关掉软件之后就立刻好了(可能是显卡要求比较高?)。

  综上,我不得不放弃私以为更好用的HAL库,转而使用标准库进行开发。以下是开发记录。

2 标准库模板的创建

  标准库开发的第一步,毫无疑问肯定是搭建一个项目工程的模板,这样之后的项目可以直接复制这个模板,然后在此基础上添加自己需要的代码即可,非常方便。

  1. 下载资料
      首先打开上面那个链接,然后在左侧找到对应的芯片型号,这里以GD32E230为例,首先点开 “GD32E2 MCU” 标签页,然后在右侧就能看到这个型号相关的资料:

在这里插入图片描述

当然,这些资料不是都需要下载的,如果是初学,只需要下载必要的文件即可,其他的留个印象,之后如果涉及到可以再来翻阅。

  主要需要下载的有以下几个资料:

  • GD32E230xx Datasheet 芯片数据手册,查看外设引脚必备;
  • GD32E23x User Manual 用户手册,主要是介绍芯片的特性,存储,外设及其相关寄存器等,编程必备;【注意,这个文件有中文版,不想翻译的可以考虑只下载这个】
  • GD32E23x AddOn 软件支持包,使用Keil开发必备;
  • GD32E23x Firmware Library 标准固件库,搭建模板必备。

另外,“用户手册”和“其他资料”中有很多“AN”开头的文件,适用于特定问题的解决,最好留个印象,这样遇到相关的问题不至于不知道去哪里找资料了。

  1. 创建标准库模板工程
      基本流程和STM32配置差不多,这里只展示文件的目录结构,具体的配置流程可以参考之前的一篇文章。
|-- CMSIS                   # 内核文件
|   |-- gd32e23x.h
|   |-- gd32e23x_libopt.h
|   |-- startup_gd32e23x.s
|   |-- system_gd32e23x.c
|   `-- system_gd32e23x.h
|-- Hardware               # 自定义外设
|   |-- usart.c
|   `-- usart.h
|-- Objects                # 编译链接文件
|   |-- gd32e23x_adc.d
|   |-- gd32e23x_adc.o
|   |-- ......
|   `-- usart.o
|-- RTE                    # Real Time Environment,Keil自带的内核相关文件 
|   `-- _Target_1
|       `-- RTE_Components.h
|-- StdPeriph              # 标准外设库
|   |-- Include
|   |   |-- gd32e23x_adc.h
|   |   |-- gd32e23x_cmp.h
|   |   |-- gd32e23x_crc.h
|   |   |-- ......
|   |   `-- gd32e23x_wwdgt.h
|   `-- Source
|       |-- gd32e23x_adc.c
|       |-- gd32e23x_cmp.c
|       |-- gd32e23x_crc.c
|       |-- ......
|       `-- gd32e23x_wwdgt.c
|-- User                   # 用户文件
|   |-- gd32e23x_it.c
|   |-- gd32e23x_it.h
|   |-- main.c
|   |-- main.h
|   |-- systick.c
|   `-- systick.h
|-- gde2_project.uvguix.Zoey  # 最外层目录的这些文件都是项目相关的文件
|-- gde2_project.uvoptx
`-- gde2_project.uvprojx9 directories, 112 files

值得一提的是,这里的RTE文件夹并不是自己建立的,而是在创建项目时首先添加到工程中的:

在这里插入图片描述

之所以要添加这个貌似是因为GD32E2xx固件库中,不存在这个core文件?总之必须得添加这个,不然编译的时候一堆报错。

注意,这个步骤仅限于部分型号,加不加其实取决于固件库的文件夹中有没有内核文件,如果有,直接添加文件即可,因为这一步本质上就是复制Keil安装的支持包中的内核文件而已。

这里再提一下gd32e23x_libopt.h这个文件,相当于是一个选择外设的文件,可以根据需要注释或取消注释包含的头文件,默认全部包含,但是它可能和其他文件不在一个文件夹内,而是在example文件夹中。

  添加好文件之后,接下来就是点击魔法棒来配置项目工程了,首要的肯定是先将自定义文件夹的路径包含在项目中,然后在宏定义中加上:

USE_STDPERIPH_DRIVER,GD32E230

后面这个芯片型号取决于实际使用的是啥,好像也可以不加

  配置好之后,点击编译,如果没有问题的话,一般是 0 Error(s) ,但是!可能会有一堆Warnings,如果有强迫症的,可能已经开始将警告内容复制去浏览器搜索解决方案了,我也尝试过,但无果。
  后来和其他项目工程模板仔细比对之后发现,因为使用了RTE,工程的默认编译器变成了AC6,而且不能换成AC5,所以出现了很多语法格式上的警告,所以解决办法也很简单,将警告的等级降一降:

在这里插入图片描述

亲测有效!

掌握了标准库项目模板的构建,基本也算是入门了,其他的主要就是外设的使用了,这个将在后续博客中介绍。

3 遇到的问题和解决方法

  • 下载程序之后不运行
    当发现程序运行结果和想象中不一样时,可以使用仿真器单步运行。然后就发现代码卡在开始文件的汇编代码中,也就是后缀为.s的文件。最后发现是系统的时钟配置错误。在这里插入图片描述
    如注释所示,这里要选择一个时钟源和主频,然后如果板子上没有使用外部晶振,这里仍然选择了后缀为8M_HXTAL25M_HXTAL的选项,时钟选择错误,导致系统不运行。

    关于时钟的选择,芯片特性手册和使用手册上都有提到,可以去参考。

相关文章:

【GD32】(一) 开发方式简介及标准库开发入门

文章目录 0 前言1 开发方式选择2 标准库模板的创建3 遇到的问题和解决方法 0 前言 因为项目关系,需要使用GD32。之前对此早有耳闻,知道这个是一个STM32的替代品,据说甚至可以直接烧录STM32的程序(一般是同型号)&#x…...

轻松上手:使用Docker部署Java服务

文章目录 1. 什么是Docker?2. 为什么使用Docker部署Java服务?3. 如何使用Docker部署Java服务?步骤1:创建Dockerfile步骤2:构建Docker镜像步骤3:运行Docker容器 4. 注意事项5. 结语推荐阅读文章 在当今的云计…...

wormml_vgg19

创建环境 mamba install libopencv hdf5 -c conda-forge conda create -n st python3.6.2手动导入包 mamba install blas1.0mkl -c conda-forge mamba install hdf51.8.20hac2f561_1 -c conda-forge mamba install libopencv3.4.2h20b85fd_0 -c conda-forge mamba install l…...

Rust学习(二):rust基础语法Ⅰ

Rust学习(二)——rust基础语法Ⅰ: 1、关键字: 了解编程语言的同学都清楚,关键字在一门编程语言中的意义,所谓关键字就是语言的创造者及后续开发者们,以及定义好的具有特殊含义和作用的单词&am…...

【WebRTC】视频发送链路中类的简单分析(下)

目录 1.任务队列节流发送器(TaskQueuePacedSender)1.1 节流控制器添加RTP数据包(PacingController::EnqueuePacket())1.2 监测是否要处理Packet(PacingController::MaybeProcessPackets()) 2.数据包路由&am…...

HTML(超文本标记语言)

HTML(超文本标记语言 - HyperText Markup Language)是一种用于创建网页的标准标记语言。 HTML 最初是由蒂姆・伯纳斯 - 李(Tim Berners - Lee)在 1990 年左右开发的。当时的目的是为了让世界各地的科学家能够方便地共享和交流信息…...

CatBoost中目标变量统计

CatBoost中的目标变量统计(Target Statistics)是其处理分类特征(Categorical Features)的核心技术之一。目标变量统计是一种特殊的编码方法,通过利用目标值信息生成数值特征,从而替代传统的独热编码或其他处…...

WSL与Ubuntu系统--使用Linux

WSL与Ubuntu系统--使用Linux 前言基础教学视频卸载链接网络配置方法1方法2 正式安装步骤步骤1 基本命令修改网络配置Ubuntu系统的导出与导入文件操作给Ubuntu创造界面--也就是在装一个有界面的UbuntuHyper-v与windows主机文件共享 前言 需要链接梯子,并且梯子十分稳…...

操作系统离散存储练习题

1. (简答题)分页存储管理系统具有快表,内存访问时间为2ns,检索快表时间为0.5ns,快表命中率为80%,求有效访问时间 -分析:首先访问缓存(快表),如果没有找到访问内存(页表&…...

性能高于Transformer模型1.7-2倍,彩云科技发布基于DCFormer架构通用大模型云锦天章

2017年,谷歌发布《Attention Is All You Need》论文,首次提出Transformer架构,掀开了人工智能自然语言处理(NLP)领域发展的全新篇章。Transformer架构作为神经网络学习中最重要的架构,成为后来席卷全球的一…...

PHP反序列化_3-漏洞利用

1. 信息收集与分析 确定目标应用程序:首先需要找到存在反序列化漏洞的 PHP 应用程序。这可能是一个网站、Web 服务、内部系统等。可以通过网络扫描、漏洞报告、安全评估等方式来发现潜在的目标。分析应用程序逻辑:了解目标应用程序的功能和业务逻辑&…...

2.初始sui move

vscode安装move插件 查看sui 客户端版本号 sui client --version 创建新项目 sui move new <项目名> sui move new hello_world 项目目录结构&#xff1a; hello_world ├── Move.toml ├── sources │ └── hello_world.move └── tests└── hello_world…...

数据结构--排序算法

目录 一.排序相关概念二.常见排序算法1.堆排序2.插入排序3.希尔排序4.选择排序5.冒泡排序6.快速排序1.快速排序--递归(未优化)2.快速排序--递归(优化)3.快速排序--非递归 7.归并排序1.归并排序--递归2.归并排序--非递归 一.排序相关概念 排序&#xff1a;使一串记录按照某个关…...

day60 图论章节刷题Part10(Floyd 算法、A * 算法)

Floyd 算法 思路&#xff1a;本题是多源最短路问题&#xff0c;使用Floyd算法求解。Floyd 算法对边的权值正负没有要求&#xff0c;核心思想是动态规划。 我们使用动规五部曲来理解和应用Floyd算法&#xff1a; 1、确定dp数组&#xff08;dp table&#xff09;以及下标的含义…...

UI架构解说

UI&#xff08;用户界面&#xff0c;User Interface&#xff09; 是指用户与软件或硬件系统进行交互的界面。 它是用户与系统之间的桥梁&#xff0c;允许用户通过视觉元素、交互组件和反馈机制来操作和控制应用程序或设备。 UI 设计的目标是提供直观、易用和愉悦的用户体验&a…...

车机安装第三方软件实现打开软件全屏教程

简介 越来越多的车友实现安装第三方软件了&#xff0c;但是有的车机的状态栏或者导航栏会遮挡安装的第三方软件。这样的话&#xff0c;第三方软件就会显示不全&#xff0c;体验感非常不好。所以&#xff0c;下面我教一下大家如何使用东君应用管家来实现打开第三方软件全屏。 全…...

八大技术架构与演进2

垂直分库架构 当数据量不断增大&#xff0c;大量的数据都存储在一个库中就已经不太够用了&#xff0c;这时候就可以讲不同的数据分类别存储Mycat也支持在大表拆分为小标的情况下进行访问 但是这种做法其实是增加了数据库的运维难度&#xff0c;这种其实也就叫做分布式数据库&…...

ReactPress技术揭秘

ReactPress Github项目地址&#xff1a;https://github.com/fecommunity/reactpress 欢迎Star。 一、引言 ReactPress是一个基于React构建的开源发布平台&#xff0c;它不仅可以帮助用户在支持React和MySQL数据库的服务器上快速搭建自己的博客或网站&#xff0c;还能作为一个…...

Javascript高级—如何实现一个类型判断函数?

实现一个类型判断函数 判断null判断基础类型使用Object.prototype.toString.call(target)来判断引用类型 [!NOTE] 注意&#xff1a; 一定是使用call来调用&#xff0c;不然是判断的Object.prototype的类型 之所以要先判断是否为基本类型是因为&#xff1a;虽然Object.prototyp…...

asitop macOS 终端 性能监控

macOS 终端 性能监控 安装 pip python3 -m ensurepip# pip3 --version pip 21.2.4安装 asitop pip3 install asitop运行 sudo asitop参考 asitopgithub asitopHow to Install pip on Mac...

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型

摘要 拍照搜题系统采用“三层管道&#xff08;多模态 OCR → 语义检索 → 答案渲染&#xff09;、两级检索&#xff08;倒排 BM25 向量 HNSW&#xff09;并以大语言模型兜底”的整体框架&#xff1a; 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后&#xff0c;分别用…...

装饰模式(Decorator Pattern)重构java邮件发奖系统实战

前言 现在我们有个如下的需求&#xff0c;设计一个邮件发奖的小系统&#xff0c; 需求 1.数据验证 → 2. 敏感信息加密 → 3. 日志记录 → 4. 实际发送邮件 装饰器模式&#xff08;Decorator Pattern&#xff09;允许向一个现有的对象添加新的功能&#xff0c;同时又不改变其…...

DeepSeek 赋能智慧能源:微电网优化调度的智能革新路径

目录 一、智慧能源微电网优化调度概述1.1 智慧能源微电网概念1.2 优化调度的重要性1.3 目前面临的挑战 二、DeepSeek 技术探秘2.1 DeepSeek 技术原理2.2 DeepSeek 独特优势2.3 DeepSeek 在 AI 领域地位 三、DeepSeek 在微电网优化调度中的应用剖析3.1 数据处理与分析3.2 预测与…...

DAY 47

三、通道注意力 3.1 通道注意力的定义 # 新增&#xff1a;通道注意力模块&#xff08;SE模块&#xff09; class ChannelAttention(nn.Module):"""通道注意力模块(Squeeze-and-Excitation)"""def __init__(self, in_channels, reduction_rat…...

【Redis技术进阶之路】「原理分析系列开篇」分析客户端和服务端网络诵信交互实现(服务端执行命令请求的过程 - 初始化服务器)

服务端执行命令请求的过程 【专栏简介】【技术大纲】【专栏目标】【目标人群】1. Redis爱好者与社区成员2. 后端开发和系统架构师3. 计算机专业的本科生及研究生 初始化服务器1. 初始化服务器状态结构初始化RedisServer变量 2. 加载相关系统配置和用户配置参数定制化配置参数案…...

工程地质软件市场:发展现状、趋势与策略建议

一、引言 在工程建设领域&#xff0c;准确把握地质条件是确保项目顺利推进和安全运营的关键。工程地质软件作为处理、分析、模拟和展示工程地质数据的重要工具&#xff0c;正发挥着日益重要的作用。它凭借强大的数据处理能力、三维建模功能、空间分析工具和可视化展示手段&…...

Nginx server_name 配置说明

Nginx 是一个高性能的反向代理和负载均衡服务器&#xff0c;其核心配置之一是 server 块中的 server_name 指令。server_name 决定了 Nginx 如何根据客户端请求的 Host 头匹配对应的虚拟主机&#xff08;Virtual Host&#xff09;。 1. 简介 Nginx 使用 server_name 指令来确定…...

VTK如何让部分单位不可见

最近遇到一个需求&#xff0c;需要让一个vtkDataSet中的部分单元不可见&#xff0c;查阅了一些资料大概有以下几种方式 1.通过颜色映射表来进行&#xff0c;是最正规的做法 vtkNew<vtkLookupTable> lut; //值为0不显示&#xff0c;主要是最后一个参数&#xff0c;透明度…...

网络编程(UDP编程)

思维导图 UDP基础编程&#xff08;单播&#xff09; 1.流程图 服务器&#xff1a;短信的接收方 创建套接字 (socket)-----------------------------------------》有手机指定网络信息-----------------------------------------------》有号码绑定套接字 (bind)--------------…...

【Java学习笔记】BigInteger 和 BigDecimal 类

BigInteger 和 BigDecimal 类 二者共有的常见方法 方法功能add加subtract减multiply乘divide除 注意点&#xff1a;传参类型必须是类对象 一、BigInteger 1. 作用&#xff1a;适合保存比较大的整型数 2. 使用说明 创建BigInteger对象 传入字符串 3. 代码示例 import j…...