关于GD32替换STM32(pin to pin)搭载rt-thread操作系统,需要注意的问题总结

news2024/11/20 6:14:57

1、SystemInit()函数

该函数位于启动文件中的Reset_Handler中(具体实现在GD32位于system_gd32f4xx.c,STM32位于system_stm32f4xx.c中,几乎所有的文件,你只要把gd换成st就能找到对应的文件),gd的叫startup_gd32Fxxx.s,一般st的也是类似的名字,像startup_st32Fxxx.s,(其实就是兆芯抄的别人的。。)xxx是对应的芯片的具体型号,例如我用的gd32f450,和stm32f427的芯片,二者可以pin to pin互换。
两款芯片,在该函数中都是做了reset操作,例如重置向量表,rcc时钟,失能中断等等,两者不同的是gd的函数中多了一个system_clock_config()函数,
需要将该函数注释掉,否则,STM32的对应芯片会起不来,main函数进不去,初始化失败,相反的,如果用ST替换GD,那么一般不需要特别的在此处增加该函数(但需要在其他地方增加类似的函数)。

2、system_clock 系统时钟

上面一节提到了system_clock_config(),该函数就是用来配置系统时钟的,例如如果你定义了
defined (__SYSTEM_CLOCK_168M_PLL_25M_HXTAL)
即使用外部25m时钟源做时钟,通过PLL倍频到168M系统时钟。
然后调用了system_clock_168m_25m_hxtal();函数,该函数即是通过设置rcc的相关寄存器将系统时钟倍频到168M,AHB做1分频,也是168M,APB1做4分频即42M,APB2做2分频即84M,**注意,第一点不同!**GD32F4系列新品对应的主频和STM32F4系列芯片主频不同!
GD32F4系列新品的AHB 、 APB2、APB1 域的最高时率分别为 240 MHz/120 MHz/60 MHz,而STM32F4系列的最高主频是AHB 域的最大频率为 168 MHz/84 MHz/42 MHz!所以,我们需要将两者替换的时候,需要注意系统时钟的配置项。一般用GD替换ST的时候,GD可以正常运行,而用GD替换ST不能正常运行的原因就在这里,低主频即使无法完美发挥GD芯片的性能,但是却可以运行,很多人说ST的程序可以直接在GD上跑,反过来不行,就觉得ST的芯片做的好,国产的垃圾,其实并非如此。
第一节,说到替换的时候需要注释掉system_clock_config()函数,我们可以将系统时钟初始化的部分放到main函数开始,或者如果使用了rtt系统可以放到board.c的void rt_hw_board_init()函数当中;
如果使用SMT32的hal库来初始化,那么代码就如下所示:

  RCC_OscInitTypeDef RCC_OscInitStruct;
  RCC_ClkInitTypeDef RCC_ClkInitStruct;

  __PWR_CLK_ENABLE();

  __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);

  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
  RCC_OscInitStruct.HSEState = RCC_HSE_ON;
  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
  RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
  RCC_OscInitStruct.PLL.PLLM = 25;
  RCC_OscInitStruct.PLL.PLLN = 336;
  RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2;
  RCC_OscInitStruct.PLL.PLLQ = 4;
  HAL_RCC_OscConfig(&RCC_OscInitStruct);

  RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
                              |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
  RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
  RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4;
  RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2;
  HAL_RCC_ClockConfig(&RCC_ClkInitStruct, 5);

  HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000);

  HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK);

  /* SysTick_IRQn interrupt configuration */
  HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0);

前面的

 __PWR_CLK_ENABLE();
__HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);

是关于PMU的时钟处理,设置调节器输出电压级别以及开启 Over-Driver 功能都是电源控制相关配置,这里的配置直接影响系统时钟的频率,
由PWR控制寄存器 CR 的位 15:14 来确定的:
位 15:14 VOS[1:0]
00:保留(默认模式 3 选中)
01:级别 3:HCLK 最大频率 120MHz
10:级别 2: HCLK 最大频率 144MHz
11:级别 1:HCLK 最大频率 168MHz,通过开启 Over-drive 模式可以达到 180MHz(超频模式)
我们如果设置到了168M,那么PWR寄存器我们需要设置为11级别1,即PWR_REGULATOR_VOLTAGE_SCALE1;
另外一个需要注意的是FLASH的延时配置,即HAL_RCC_ClockConfig(&RCC_ClkInitStruct, 5);,的参数2;具体的是根据参考手册中的下表来确定的:
在这里插入图片描述
我们的电压是3.3,主频即HCLK是168M,所以,我们的等待周期是5WS。

3、嵌入式SRAM

关于SRAM,STM32F4系列和GD32F4系列很大不同!通过参考手册我们可以看到:
STM32F4xx:
STM32F4xx
GD32F4xx:
在这里插入图片描述
STM32的SRAM要小一些,特别是GD32有了附加SRAM以后,可以被AHB访问的SRAM可能超过了512KB,而STM32仅有192kb而已。所以位于启动文件中的堆大小即

Stack_Size      EQU     0x00001200

                AREA    STACK, NOINIT, READWRITE, ALIGN=3
Stack_Mem       SPACE   Stack_Size
__initial_sp


; <h> Heap Configuration
;   <o>  Heap Size (in Bytes) <0x0-0xFFFFFFFF:8>
; </h>

Heap_Size       EQU     0x00001200

可能需要根据需要修改。
另外,如果搭载了rt-thread操作系统,位于board.c文件中的关于系统堆大小初始化的地方也需要修改;即函数void rt_hw_board_init()中的rt_system_heap_init((void *)HEAP_BEGIN, (void *)HEAP_END);函数,
直接根据具体的使用情况修改#define GD32_SRAM_SIZE 128位于board.h当中,我这里修改为了128k的sram。

4、其他的外设的时钟修改

由于两者的主频不一样,所以,一些外设的时钟也需要相应的作出修改,例如IIC IIS,ADC,CAN等外设。
仅以CAN的时钟配置为例,
在GD32的标准库中有关于CAN设备的初始化库函数:

//can的mq初始化
rt_mq_init(&gMqRx_CAN0, "MqRxCAN0", gRxCAN0_MsgPool, RxCan0_MsgMaxSize, MsgPoolSize_0, RT_IPC_FLAG_FIFO);
//时钟使能
rcu_periph_clock_enable(RCU_CAN0);
rcu_periph_clock_enable(RCU_GPIOA);
//gpio复用    
gpio_output_options_set(GPIOA, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_11);//CAN0_RX
gpio_mode_set(GPIOA, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_11);
gpio_af_set(GPIOA, GPIO_AF_9, GPIO_PIN_11);
        
gpio_output_options_set(GPIOA, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_12);//CAN0_TX
gpio_mode_set(GPIOA, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_12);
gpio_af_set(GPIOA, GPIO_AF_9, GPIO_PIN_12);
//can中断使能
nvic_irq_enable(CAN0_RX0_IRQn, 0, 0);

can_parameter_struct can_parameter; 
can_filter_parameter_struct can_filter;

//can时钟重置使能
rcu_periph_reset_enable(RCU_CAN0RST);
rcu_periph_reset_disable(RCU_CAN0RST);
        
/* initialize CAN parameters */
can_parameter.time_triggered = DISABLE;
can_parameter.auto_bus_off_recovery = DISABLE;
can_parameter.auto_wake_up = DISABLE;
can_parameter.auto_retrans = ENABLE;
can_parameter.rec_fifo_overwrite = DISABLE;
can_parameter.trans_fifo_order = DISABLE;

can_parameter.working_mode = CAN_NORMAL_MODE;
can_parameter.resync_jump_width = CAN_BT_SJW_1TQ;
can_parameter.time_segment_1 = CAN_BT_BS1_12TQ;
can_parameter.time_segment_2 = CAN_BT_BS2_8TQ;
        
/* baudrate = 1M, APB1总线*/
can_parameter.prescaler = 2;
can_init(CAN0, &can_parameter);

通过时钟的使能函数或者参考手册,我们可以得知can是挂载在AHB1上的,如果我们设置的时钟系统,AHB1为42M(即PLL为168M,系统时钟168M,AHB2为84M),那么如果将can的波特率设置为1M,我们只需要关注time_segment_1 、time_segment_2 、prescaler 这三个参数即可,can波特路的计算公式为:
在这里插入图片描述
time_segment_1在ST中也被简写成TS1,TS2,prescaler 简写成BRP,都是一样的意思。简化一下,can的波特率公式:

can波特率=AHB1频率/[(TS1+TS2+1)*BRP]

注意公式中的TS1和TS2不是实际值,而是几倍的tq的值,例如我们上面程序中的

can_parameter.time_segment_1 = CAN_BT_BS1_12TQ;
can_parameter.time_segment_2 = CAN_BT_BS2_8TQ;

TS1对应是12被的TQ,TS2对应的是8倍的TQ,但是如果我们查找定义就会发现CAN_BT_BS1_12TQ其实值是11,CAN_BT_BS2_8TQ的值是7,如果我们以实际值来算就需要加上2,这里很多博客里面都讲的不明白或者讲错了。
根据公式,我们得到can的波特率=42m/[(8+12+1)*2]=1m,

如果STM32代码中使用标准库或者HAL库,你可以看到都是类似的配置。
至此,我们完成GD32F450替换STM32F427的芯片。

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

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

相关文章

4.HIVE函数

1.hive函数 1.1 空值替换 两个输入&#xff1a;nvl(col,default_num) : 如果colum不为null&#xff0c;返回col.否则返回default_num 多个输入&#xff1a;coalesce(col1, col2, col3, ....) &#xff1a;从左到右找第一个不为null的值 例如&#xff1a;求所有员工的平均薪…

【操作系统】总结

依旧是小林coding 的内容 存储架构 现代 CPU 都是多核心的&#xff0c;线程可能在不同 CPU 核心来回切换执行&#xff0c;这对 CPU Cache 不是有利的&#xff0c;虽然 L3 Cache 是多核心之间共享的&#xff0c;但是 L1 和 L2 Cache 都是每个核心独有的&#xff0c;如果一个线…

VMWare安装windows7虚拟机提示Operating System not found

前提&#xff1a;下载windows7 Gost并创建虚拟机&#xff0c;启动报错&#xff1a;Operating System not found 解决办法 用微PE工具制作iso系统&#xff0c;对虚拟机进行分区 下载地址&#xff1a;https://www.wepe.com.cn/ 制作方法&#xff0c;双击安装程序&#xff0c;选…

最困难的也是最简单的,做好这两点不盈利天理难容

投资者应该时刻记住&#xff0c;在外汇交易中复杂的方法并不总是最好的。Forexclub发现交易中最困难的是正确识别进场点和出场点。 从技术上来说&#xff0c;进入交易是非常容易的&#xff0c;你只需要点击一个按钮&#xff0c;你就在那里交易。但是你会从中获利吗?没人能回答…

【Linux Network】网络编程套接字(代码练习)—UDP

目录 1. 常用接口 2. C/S 回声模拟 3. C/S myshell 的制作 Linux网络编程✨ 1. 常用接口 socket&#xff1a;创建套接字&#xff1a; // 创建 socket 文件描述符 int socket(int domain, int type, int protocol); 返回值&#xff1a; 套接字创建成功返回一个文件描述符 &…

GAMMA电源维修直流高压电源模块RR300-1P

美国GAMMA高压电源维修参数&#xff08;RR分离式&#xff09;&#xff1a; 输入&#xff1a;220VAC 或 380VAC&#xff08;视型号而定&#xff09; 输出电压&#xff1a;550KV&#xff0c;功率&#xff1a;0-10KW或定制 纹波率0.01 &#xff1b;稳定度0.01/1H 控制部分19英…

(只需两步)让ChatGPT帮你制作出漂亮的PPT

目录 第一步&#xff1a;生成 PPT 代码 第二步&#xff1a;将代码转化为 PPT 还在为制作PPT而烦恼吗&#xff1f; 让ChatGPT来帮您&#xff01; 本篇文章介绍如何利用ChatGPT一键生成PPT文字和样式&#xff0c;省时省力又专业&#xff01; &#xff08;真的只需两步&#xf…

案例实践|云智慧ITSM产品在利星行汽车的运维实践

ITSM&#xff08;信息技术服务管理&#xff09;是一种以客户为中心的方法&#xff0c;旨在提高信息技术的效率和效果。在传统零售行业&#xff0c;ITSM可以帮助连锁零售企业提升客户服务水平&#xff0c;通过IT服务台提供快速响应和解决客户的问题和需求。同时&#xff0c; ITS…

PSP - 配置 AlphaFold2 的高效运行环境

欢迎关注我的CSDN:https://spike.blog.csdn.net/ 本文地址:https://blog.csdn.net/caroline_wendy/article/details/130560538 AlphaFold2 是由 DeepMind 开发,可以根据蛋白质的氨基酸序列预测其三维结构,准确度经常可以与实验相媲美。DeepMind 和 EMBL 的欧洲生物信息学研…

最新的Ubuntu20安装配置Nagios教程

首先声明&#xff0c;盗帖可耻&#xff0c;我发现有人把我文章复制到百度文库&#xff0c;并设置vip下载&#xff0c;直接照搬别人的还牟利&#xff0c;恶心&#xff01;&#xff01;&#xff01; 目录 一、简介 二、安装配置 1、安装Nagios以及相关插件 a、安装Nagios核心…

Blender渲染动画太慢怎么办?用云渲染啊!

1995 年&#xff0c;荷兰开发者 Ton Roosendaal 开发了三维制作软件 Blender &#xff0c;这是一款功能强大的 3D 创建工具&#xff0c;用于创建 3D 图形、交互式 3D 应用程序、视频游戏、虚拟现实视频和动画。它自 2002 年以来一直作为开源软件提供&#xff0c;可在 macOS、Li…

嵌入式基础测试手册——基于NXP iMX6ULL开发板(3)

前 言 本文档适用开发环境: Windows开发环境:Windows 7 64bit、Windows 10 64bit 虚拟机:VMware15.1.0 Linux开发环境:Ubuntu18.04.4 64bit U-Boot:U-Boot-2020.04 Kernel:Linux-5.4.70 Linux SDK:5.4.70_2.3.0 基于测试板卡:创龙科技TLIMX6U-EVM是一款基于NXP…

Gradio的web界面演示与交互机器学习模型,主要特征《2》

上一篇文章是介绍了安装与使用&#xff0c;Gradio的web界面演示与交互机器学习模型&#xff0c;安装和使用《1》 了解到这个gradio&#xff0c;真是个贴心的产品&#xff0c;接下来更多的关注一些重要的细节特征&#xff0c;让我们去更完善和熟练的使用它。 1、简单计算器的示…

Netty基础(三)

1.Netty模型 1.1.工作原理示意图1-简单版 Netty主要基于主从Reactors多线程模型(如图)做了一定的改进,其中主从Reactor多线程模型有多个Reactor; 说明: ①.BossGroup线程池中的线程维护了Selector,只关注Accecpt事件; ②.当接收到Accept事件,获取到连接对应的SocketChannel…

数据结构入门--栈和队列

栈 栈的概念及结构 栈&#xff1a;一种特殊的线性表&#xff0c;其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除的一段为栈顶&#xff0c;另一端为栈底。栈中元素遵循后进先出LIFO&#xff08;Last In First Out&#xff09;原则。 压栈&#xff1a;栈的插…

玄子Share - 2023.1 IDEA 部署Web项目

玄子Share - 2023.1 IDEA 部署Web项目 创建项目 IDEA 2023 创建Jakarta EE项目 模板&#xff1a;选择使用 Web 应用程序 应用程序服务器&#xff1a;选择安装的 Tomcat 第一次创建项目可能识别不到 Tomcat 需要手动添加 Tomcat 服务器 设置 Tomcat 主目录为 Tomcat 的安装路径…

给httprunnermanager接口自动化测试平台加点功能(二)

文章目录 一、背景1.1、新增字段1.2、简化流程1.3、举一反三 二、总结 一、背景 继续前面的功能改造&#xff0c;这回又是什么需求呢&#xff1f;在编写测试用例的时候&#xff0c;咱们有看到列表有作者名称&#xff0c;也就是说&#xff0c;可以在用例列表就可以知道这条用例是…

网络数据包丢失监控

什么是网络数据包 数据包或网络数据包是通过网络传输的小数据单元。顾名思义&#xff0c;这些是小的、离散的数据单元。单独来看&#xff0c;这些单位不一定有多大意义。它们只是正在传输的整体消息的一部分&#xff0c;这些消息已被组装成多个层。但是&#xff0c;当组合在一…

人工智能前景

人工智能AI的未来非常广阔和光明。随着科技的不断发展和普及&#xff0c;人工智能已经开始逐渐融入我们生活的方方面面&#xff0c;比如智能家居、智能医疗、无人驾驶等等。未来&#xff0c;随着更多的应用场景被开拓和挖掘&#xff0c;人工智能的应用范围将会越来越广泛&#…

Word控件Spire.Doc 【打印】教程(3):如何在自定义纸张尺寸上打印 Word—C#/VB.NET

Spire.Doc for .NET是一款专门对 Word 文档进行操作的 .NET 类库。在于帮助开发人员无需安装 Microsoft Word情况下&#xff0c;轻松快捷高效地创建、编辑、转换和打印 Microsoft Word 文档。拥有近10年专业开发经验Spire系列办公文档开发工具&#xff0c;专注于创建、编辑、转…