【GD32 MUC 移植教程】从 GD32F10x 移植到 GD32F30x

news2024/9/24 15:20:38

1. 前言

对于使用 GD32 系列微控制器进行产品开发的设计人员来说,因产品及功能升级,往往需要将一种微控制器替换成另一种微控制器,在保留既有功能的情况下增加新功能。为了更快地推出新产品,设计人员经常要将应用程序移植到新的微控制器。
本应用笔记旨在帮助您快速将应用程序从 GD32F10x 系列微控制器移植到 GD32F30x 系列微控制
器。
为了更好的利用本应用笔记中的信息,您需要对 GD32 系列微控制器有比较深刻的了解。您可在兆易创新资料网站 gd32mcu.21ic.com 或网盘 https://pan.baidu.com/s/1mhQsNpu 下载 GD32 各系列 微控制器资料,如 Datasheet 、用户手册、官方例程及各种开发工具等。

2. 引脚兼容性

GD32F10x GD32F30x 在相同封装下是 Pin To Pin 兼容的。但由于 GD32F30x GD32F10x 增 加了内部 48MHz RC 振荡器给 USBD 模块提供固定频率,为满足精度要求, GD32F30x 含有一个 时钟校准控制器(CTC) ,所以两者引脚定义有细微差别,如下表所示:
1 GD32F10x 系列和 GD32F30x 系列引脚区别

3. 内部资源兼容性

下表给出了 GD32F10x GD32F30x 的资源对比总览 ( GD32F103xE GD32F303xE 对比为
)
2 GD32F10x 系列和 GD32F30x 系列内部资源对比总览

4. 程序移植

由上节可看出, GD32F10x GD32F30x 的主要差异性在于主频 (RCU 系统时钟 ) 、内核版本和 CTC 上,而 M4 内核是向下兼容 M3 的,所以无需修改,现就 RCU 方面阐述程序移植过程。

4.1 RCU 系统时钟配置

GD32F10x 系列和 GD32F30x 系列的时钟配置过程相同,但 GD32F30x 支持更高的系统时钟。若
用户选择继续使用原有的时钟频率,则在应用程序中无需做任何改变;若用户选择使用更高的时钟
频率,按以下步骤进行程序修改 ( GD32F103 移植到 GD32F303 、使用外部 8MHz 高速晶振 HXTAL 为例,其他对应型号、使用内部晶振的移植过程类似)

(1) system_gd32f10x.c 文件中增加宏定义:

#define __SYSTEM_CLOCK_120M_PLL_HXTAL (uint32_t)(120000000)
如图 1 所示:

 (2) system_gd32f10x.c 文件中增加使用 120MHz 频率函数的声明,如图 2 所示:

 (3) system_gd32f10x.c 文件中增加使用 120MHz 频率函数的定义:

static void system_clock_120m_hxtal(void)
{
 uint32_t timeout = 0U;
 uint32_t stab_flag = 0U;
 /* enable HXTAL */
 RCU_CTL |= RCU_CTL_HXTALEN;
 /* wait until HXTAL is stable or the startup time is longer than 
HXTAL_STARTUP_TIMEOUT */
 do{
 timeout++;
 stab_flag = (RCU_CTL & RCU_CTL_HXTALSTB);
 }while((0U == stab_flag) && (HXTAL_STARTUP_TIMEOUT != timeout));
 /* if fail */
 if(0U == (RCU_CTL & RCU_CTL_HXTALSTB)){
 while(1){
 }
 }
 /* HXTAL is stable */
 /* AHB = SYSCLK */
 RCU_CFG0 |= RCU_AHB_CKSYS_DIV1;
 /* APB2 = AHB/1 */
 RCU_CFG0 |= RCU_APB2_CKAHB_DIV1;
 /* APB1 = AHB/2 */
 RCU_CFG0 |= RCU_APB1_CKAHB_DIV2;
#if (defined(GD32F10X_MD) || defined(GD32F10X_HD) || defined(GD32F10X_XD))
 /* select HXTAL/2 as clock source */
 RCU_CFG0 &= ~(RCU_CFG0_PLLSEL | RCU_CFG0_PREDV0);
 RCU_CFG0 |= (RCU_PLLSRC_HXTAL | RCU_CFG0_PREDV0);
 /* CK_PLL = (CK_HXTAL/2) * 30 = 120 MHz */
 RCU_CFG0 &= ~(RCU_CFG0_PLLMF | RCU_CFG0_PLLMF_4);
 RCU_CFG0 |= RCU_PLL_MUL30;
#elif defined(GD32F10X_CL)
 /* CK_PLL = (CK_PREDIV0) * 30 = 120MHz */ 
 RCU_CFG0 &= ~(RCU_CFG0_PLLMF | RCU_CFG0_PLLMF_4);
 RCU_CFG0 |= (RCU_PLLSRC_HXTAL | RCU_PLL_MUL30);
 /* CK_PREDIV0 = (CK_HXTAL)/5 *8 /10 = 4 MHz */ 
 RCU_CFG1 &= ~(RCU_CFG1_PREDV0SEL | RCU_CFG1_PLL1MF | 
RCU_CFG1_PREDV1 | RCU_CFG1_PREDV0);
 RCU_CFG1 |= (RCU_PREDV0SRC_CKPLL1 | RCU_PLL1_MUL8 |
RCU_PREDV1_DIV5 | RCU_PREDV0_DIV10);
 /* enable PLL1 */
 RCU_CTL |= RCU_CTL_PLL1EN;
 /* wait till PLL1 is ready */
 while(0U == (RCU_CTL & RCU_CTL_PLL1STB)){
 }
#endif /* GD32F10X_MD and GD32F10X_HD and GD32F10X_XD */
 /* enable PLL */
 RCU_CTL |= RCU_CTL_PLLEN;
 /* wait until PLL is stable */
 while(0U == (RCU_CTL & RCU_CTL_PLLSTB)){
 }
 /* select PLL as system clock */
 RCU_CFG0 &= ~RCU_CFG0_SCS;
 RCU_CFG0 |= RCU_CKSYSSRC_PLL;
 /* wait until PLL is selected as system clock */
 while(0U == (RCU_CFG0 & RCU_SCSS_PLL)){
 }
}
(4) system_gd32f10x.c 文件中增加使用 120MHz 频率函数的调用,如图 3 所示:

5. 外设差异性

GD32F10x GD32F30x 在外设上都是兼容的,但 GD32F30x 作为更高级的 MCU ,较 GD32F10x 在很多外设上增加了部分功能,用户可根据以下罗列出的外设差异性选择是否使用这些功能。

5.1 通用和备用输入/输出接口(GPIO AFIO

I/O 端口在作为输出使用时, GD32F30x 可将 IO 的速度设置为 120MHz(GD32F10x 最大 50MHz),
I/O 端口输出速度大于 50MHz 时,建议使用 I/O 补偿单元对 I/O 端口进行斜率控制,从而降低 I/O 端口噪声对电源的影响。具体功能以及寄存器设置,请用户参考 GD32F30x 用户手册。

5.2 模数转换器 ADC

为减轻 CPU 的负担, GD32F30x GD32F10x 增加了片上硬件过采样单元。它能够处理多个转换, 并将多个转换的结果取平均,得出一个 16 位宽的数据。 片上硬件过采样单元是以降低数据输出 率为代价,换取较高的数据分辨率。 具体功能以及寄存器设置,请用户参考 GD32F30x 用户手册。

5.3 通用同步异步收发器 USART

GD32F30x GD32F10x USART 上增加了块模式 (GD32F10x 只支持字节模式 ) 、数据极性设置、 数据位反转以及 TX RX 引脚电平反转等功能,因此, GD32F30x 多了三个寄存器,分别为: USART_CTL3、 USART_RT USART_STAT1 。具体功能以及寄存器设置,请用户参考 GD32F30x 用户手册
5.4 内部集成电路总线接口 I²C
GD32F30x GD32F10x I ² C 都支持标速 ( 最高 100KHz) 和快速 ( 最高 400KHz) ,同时 GD32F30x 可支持高速模式( 最高 1MHz) ,要使能高速模式,需将 I2C_FMPCFG 寄存器的 FMPEN 1 。具 体功能以及寄存器设置,请用户参考 GD32F30x 用户手册。
5.5 串行外设接口/片上音频接口 SPI/I²S
GD32F30x GD32F10x SPI/I ² S 模块差异性主要表现在 GD32F30x 支持 SPI TI 模式、 SPI NSS 脉冲模式和 SPI 四线功能 ( 只有 SPI0) ,其中 SPI 的四线模式是用于控制四线 SPI Flash 外设,此模式下,数据传输速率是普通模式下的 4 倍。具体功能以及寄存器设置,请用户参考 GD32F30x 用户手册。
5.6 通用串行总线全速设备接口 USBD
GD32F30x GD32F10x USBD 外设中增加了 USB2.0 链接电源管理 (LPM) 等级 L1 ,目的是为
了优化在挂起 / 恢复状态下的电源消耗。 LPM 包括从 L0 L3 4 种状态。 LPM L1 状态(睡眠状
态) 是新的电源管理状态。具体功能以及寄存器设置,请用户参考 GD32F30x 用户手册。
5.7 闪存控制器 FMC
GD32F30x GD32F10x 增加了位编程功能,为用户节省一定的 Flash 空间。其特点是,存储在
闪存中的数据,其值为“ 1 ”的 bit 位可以改写为“ 0 ”,而不影响其它位。例如,地址 0x0800 0400 存储的数据为 0x5a5a 5a5a ,使用位编程功能,可直接将此地址的数据写为 0x0a0a 0a0a ,而不需
要先把该地址的数据擦除,然后写 0x0a0a 0a0a
请注意,位编程功能不能将值为“ 0 ”的 bit 位写“ 1 ”,如上面的例子,将 0x0800 0400 地址写为0xfafa fafa,将不会成功。
关于 FMC 中位编程具体功能以及寄存器设置,请用户参考 GD32F30x 用户手册。
更多 GD32  MCU相关咨询: https://www.gd32bbs.com/

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

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

相关文章

【数据分享】1999—2022年地级市各类交通工具的客货运量和拥有量数据(Shp/Excel格式)

在之前的文章中,我们分享过基于2000-2023年《中国城市统计年鉴》整理的1999-2022年地级市的人口相关数据、各类用地面积数据、污染物排放和环境治理相关数据、房地产投资情况和商品房销售面积、社会消费品零售总额和年末金融机构存贷款余额、一般公共预算收支状况、…

Transformer模型-4-Inputs

Encoder的输入层和Decoder的输入层是一样的结构,都是由Token embedding(词向量 word embedding) 和 Positional embedding(位置向量) 组合而成,并到最终的 输入向量x。 Transformer引入Positional embedding主要是解决词序问题。…

开源程序实操:岩土工程渗流问题的有限单元法应用

有限单元法在岩土工程问题中应用非常广泛,很多商业软件如Plaxis/Abaqus/Comsol等都采用有限单元解法。尽管各类商业软件使用方便,但其使用对用户来说往往是一个“黑箱子”。相比而言,开源的有限元程序计算方法透明、计算过程可控,…

Linux configure.ac:51: error: possibly undefined macro: AC_MSG_ERROR

bug: 解决方法: cd /usr/local/share/autoconf/autoconf  cp *.m4 /usr/share/aclocal

编程语言中的特殊类的设计

文章目录 不能被拷贝的类只能在堆上创建对象的类:方式一方式二 设计类只能创建栈对象实现类, 不能被继承单例模式设计饿汉模式懒汉模式线程安全问题 不能被拷贝的类 c98 只声明(不生成, 编译器默认会生成, 有浅拷贝等的问题), 不实现, 并将其访问设为private c11使用delete来…

Python数据可视化库之bqplot使用详解

概要 在数据科学和机器学习领域,数据可视化是理解和分析数据的重要工具。bqplot 是一个基于 Jupyter Notebook 的 Python 可视化库,专注于交互式数据可视化。它结合了 D3.js 的强大功能和 Python 的易用性,使用户能够在 Jupyter 环境中创建丰富的交互式图表。bqplot 的设计…

如何使用GPT画出带中文的图和表?-已解决GPT画图表出现乱码的问题

众所周知,GPT的中文库有点问题,要求他画带中文的图或表存在中文的时候,就会出现乱码或者方框。 可以发现,GPT的中文库有问题,那么该如何解决这个问题呢? 直接在promote的时候上传你需要它使用的字体&…

高斯混合模型GMM

一、两个角度看GMM 1、从几何角度来看:加权平均值,多个高斯分布叠加而成 纵轴——f(x)概率密度函数,横轴——数据点 2、从混合模型角度看 x:observed variable z:latent variable →对应的样本是属于哪一个高斯分布&…

【SQL】筛选上级经理离职的员工

目录 题目 分析 代码 题目 表: Employees ----------------------- | Column Name | Type | ----------------------- | employee_id | int | | name | varchar | | manager_id | int | | salary | int | ----------------------- 在 SQ…

word文档合并样式问题

word协同工作时,在mac用office编辑后发送给对方进行合并时,出现了一些不该看到的样式。 需要注意的几点: 1、大家均需要使用同样的软件,如office,如果使用wps,会导致新增很多样式。 2、在样式窗格&#…

gitlab SSH的使用

一、 安装git bash https://git-scm.com/download/win 下载windows 版本,默认安装即可。 二、使用命令 打开本地git bash,使用如下命令生成ssh公钥和私钥对 ssh-keygen -t rsa -C ‘xxxxxx.com’ 然后一路回车 (-C 参数是你的邮箱地址) 若是想输入密码可以输入…

浅谈线性表——栈

文章目录 一、什么是栈?二、栈顺序、链式存储时的时间复杂度三、自我实现一个栈3.1、实现代码3.2、熟练使用栈 四、栈的应用场景4.1、不可能的出栈顺序4.2、表达式4.2、OJ题 一、什么是栈? 栈是一种特殊的线性表,他只允许在固定的一端进行插…

直播美颜API与视频美颜SDK的开发指南:构建高效实时美颜工具

在主播美颜的背后,直播美颜API与视频美颜SDK是实现这一切的技术核心。接下来,小编将深入讲解如何开发高效的直播美颜API与视频美颜SDK。 一、视频美颜SDK的概述 视频美颜SDK则是一个开发工具包,提供了完整的美颜功能实现,开发者…

STM32(F103ZET6)第四课:串口中断

目录 需求一、串口中断过程与作用二、中断实现流程1.中断优先级分组2.配置串口中断 三、需求的实现 需求 1.设备上电后四个灯灭。 2.按下KEY1,LED1灯亮,同时串口发送“LED1灯亮”。 3.再次按下KEY1,LED1灯灭,同时串口发送“LED1灯…

大数据计算-SQL优化手段(CBO)-以Flink为例

文章目录 背景理论知识示例结果展示结果解释 背景 大数据计算中,SQL生成的执行计划第一轮会经过固定规则的优化,第二轮会根据原计划,生成多条结合成本的的执行计划,根据cost 进行排序,选出最优的执行计划。 理论知识…

深入调研亚马逊云科技AI平台Amazon Bedrock热门开发功能

国际数据公司(IDC)在2024 年 8 月发布了《 中国大模型平台市场份额, 2023 :大模型元年——初局 》调研报告 。IDC的数据显示,2023年中国大模型平台及相关应用市场规模达惊人的17.65亿元人民币,且科学计算大…

带有音频的ppt导出视频 带有音频的ppt自动播放

之前帮导师申请基金,基金委的要求是提交ppt的讲解视频,这个需求比较容易实现。只要提前把各页的音频录制好,插入对应页,然后直接选择导出-创建视频即可,不需要设置幻灯片自动切换,以及自动换片时间&#xf…

C++ 设计模式——享元模式

C 设计模式——享元模式 C 设计模式——享元模式1. 主要组成成分2. 享元模式内部状态3. 享元模式外部状态4. 逐步构建享元模式4.1 抽象享元类定义4.2 具体享元类实现4.3 享元工厂类实现4.4 主函数 5. 享元模式 UML 图享元模式 UML 图解析 6. 享元模式的优点7. 享元模式的缺点8.…

TMDOG的微服务之路_07——初入微服务,NestJS微服务快速入门

TMDOG的微服务之路_07——初入微服务,NestJS微服务快速入门 博客地址:TMDOG的博客 在前几篇博客中,我们探讨了如何在 NestJS 中的一些基础功能,并可以使用NestJS实现一个简单的单体架构后端应用。本篇博客,我们将进入…

Python 如何进行简单的 GUI 编程(Tkinter)

图形用户界面(GUI)编程是指使用窗口、按钮、文本框等元素与用户进行交互的编程方式。在Python中,Tkinter是一个非常流行的标准库,它使得我们可以轻松地创建和管理图形用户界面。 Tkinter是Python内置的GUI库,它提供了…