注:本文档仅针对GD32F103系列替代STM32F103系列
版权:威尔健科技有限公司
主营业务:GD MCU代理与方案开发,中科微定位模块或芯片,美格通讯模块等。
联系方式:18816824119(微信同号)
本人:GD技术支持

一、相同点**
1)、外围引脚PIN TO PIN兼容,每个引脚上的复用功能也完全相同。
2)、芯片内部寄存器、外部IP寄存器地址和逻辑地址完全相同,但是有些寄存器默认值不同,有些外设模块的设计时序上和STM32有差异,这点差异主要体现在软件上修改,详情见下文。
3)、编译工具:完全相同例如:KEIL 、IAR
4)、型号命名方式完全相同,所以替代只需找尾缀相同的型号即可,例如:STM32F103C8T6 与 GD32F103C8T6。
5)、仿真工具:JLINK STLink Ulink GDLINK

二、外围硬件区别

三、硬件替换需要注意的地方
从上面的介绍中,我们可以看出,GD32F103系列和STM32F103系列是兼容的,但也需要一些注意的地方。
1)、BOOT0必须接10K下拉或接GND,ST可悬空,这点很重要。
2)、RC复位电路必须要有,否则MCU可能不能正常工作,ST的有时候可以不要。
3)、有时候发现用仿真器连接不上。因为GD的swd接口驱动能力比ST弱,可以有如下几种方式解决:
a、线尽可能短一些;
b、降低SWD通讯速率;
c、SWDIO接10k上拉,SWCLK接10k下拉。
4)、使用电池供电等,注意GD的工作电压,例如跌落到2.0V~2.6V区间,ST还能工作,GD可能无法启动或工作异常。

四、使用ST标准库开发需要修改的地方
1)、GD对时序要求严格,配置外设需要先打开时钟,在进行外设配置,否则可能导致外设无法配置成功;ST的可以先配置在开时钟。

2)、修改外部晶振起振超时时间,不用外部晶振可跳过这步。
原因:GD与ST的启动时间存在差异,为了让GD MCU更准确复位。
修改:
将宏定义:
#define HSE_STARTUP_TIMEOUT ((uint16_t)0x0500)
修改为:
#define HSE_STARTUP_TIMEOUT ((uint16_t)0xFFFF)

3)、GD32F10X flash取值零等待,而ST需要2个等待周期,因此,一些精确延时或者模拟IIC或SPI的代码可能需要修改。
原因:GD32采用专利技术提高了相同工作频率下的代码执行速度。
修改:如果使用for或while循环做精确定时的,定时会由于代码执行速度加快而使循环的时间变短,因此需要仿真重新计算设计延时。使用Timer定时器无影响。

4)、在代码中设置读保护,如果使用外部工具读保护比如JFLASH或脱机烧录器设置,可跳过此步骤。
在写完KEY序列后,需要读该位确认key已生效,修改如下:

总共需要修改如下四个函数:

FLASH_Status FLASH_EraseOptionBytes(void);
FLASH_Status FLASH_ProgramOptionByteData(uint32_t Address, uint8_t Data);
uint32_t FLASH_GetWriteProtectionOptionByte(void);
FlagStatus FLASH_GetReadOutProtectionStatus(void);

5)、GD与ST在flash的Erase和Program时间上有差异,修改如下:

6)、需求flash大于256K注意,小于256K可以忽略这项。
与ST不同,GD的flash存在分区的概念,前256K,CPU执行指令零等待,称code区,此范围外称为dataZ区。两者在擦写操作上没有区别,但在读操作时间上存在较大差别,code区代码取值零等待,data区执行代码有较大延迟,代码执行效率比code区慢一个数量级,因此data区通常不建议运行对实时性要求高的代码,为解决这个问题,可以使用分散加载的方法,比如把初始化代码,图片代码等放到data区。

7)、ADC采集
a> ADC通道要配置成模拟输入,芯片默认是浮空输入,如果不配成模拟输入,ST的可以正常采集,GD不行
b> ADC时钟没有手动分频最大运行频率14Mhz以内,ST可以正常采集,GD不行。
c> ADC使能后需要加不少于20us延时。
d> 采样精度不如STM32f103,GD32f103存在这个问题,如果对ADC精度要求不高可以选用,可以选用PIN TO PIN 兼容F103系列的GD32E103和GD32F303系列解决。

总结:至此,经过以上修改,在不使用USB和网络能复杂协议的代码,就可以使用ST的代码操作了。

附加:
1、修改或为了区分GD32和STM32的代码,可以使用如下代码:

2、GD的主频支持108MHz,有时候需要提供主频,提供一个96MHZ的参考:

static void SetSysClockTo96(void)
{__IO uint32_t StartUpCounter = 0, HSEStatus = 0;RCC_APB2PeriphResetCmd(RCC_APB2Periph_AFIO|RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOE|RCC_APB2Periph_GPIOC,ENABLE);RCC_APB2PeriphResetCmd(RCC_APB2Periph_AFIO|RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOE|RCC_APB2Periph_GPIOC,!ENABLE);/* SYSCLK, HCLK, PCLK2 and PCLK1 configuration ---------------------------*/    /* Enable HSE */    RCC->CR |= ((uint32_t)RCC_CR_HSEON);/* Wait till HSE is ready and if Time out is reached exit */do{HSEStatus = RCC->CR & RCC_CR_HSERDY;StartUpCounter++;  } while((HSEStatus == 0) && (StartUpCounter != HSE_STARTUP_TIMEOUT));
for(StartUpCounter=0;StartUpCounter<0x1fff;StartUpCounter++);if ((RCC->CR & RCC_CR_HSERDY) != RESET){HSEStatus = (uint32_t)0x01;}else{HSEStatus = (uint32_t)0x00;}  if (HSEStatus == (uint32_t)0x01){/* Enable Prefetch Buffer */FLASH->ACR |= FLASH_ACR_PRFTBE;/* Flash 2 wait state */FLASH->ACR &= (uint32_t)((uint32_t)~FLASH_ACR_LATENCY);FLASH->ACR |= (uint32_t)FLASH_ACR_LATENCY_2;    /* HCLK = SYSCLK */RCC->CFGR |= (uint32_t)RCC_CFGR_HPRE_DIV1;/* PCLK2 = HCLK */RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE2_DIV1;/* PCLK1 = HCLK */RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE1_DIV2;#ifdef STM32F10X_CL/* Configure PLLs ------------------------------------------------------*//* PLL2 configuration: PLL2CLK = (HSE / 5) * 8 = 40 MHz *//* PREDIV1 configuration: PREDIV1CLK = PLL2 / 5 = 8 MHz */RCC->CFGR2 &= (uint32_t)~(RCC_CFGR2_PREDIV2 | RCC_CFGR2_PLL2MUL |RCC_CFGR2_PREDIV1 | RCC_CFGR2_PREDIV1SRC);RCC->CFGR2 |= (uint32_t)(RCC_CFGR2_PREDIV2_DIV5 | RCC_CFGR2_PLL2MUL8 |RCC_CFGR2_PREDIV1SRC_PLL2 | RCC_CFGR2_PREDIV1_DIV5);/* Enable PLL2 */RCC->CR |= RCC_CR_PLL2ON;/* Wait till PLL2 is ready */while((RCC->CR & RCC_CR_PLL2RDY) == 0){}/* PLL configuration: PLLCLK = PREDIV1 * 12 = 96 MHz */ RCC->CFGR &= (uint32_t)~(RCC_CFGR_PLLXTPRE | RCC_CFGR_PLLSRC | RCC_CFGR_PLLMULL);RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLXTPRE_PREDIV1 | RCC_CFGR_PLLSRC_PREDIV1 | RCC_CFGR_PLLMULL12);
#else
#if 0/*  PLL configuration: PLLCLK = HSE * 12 = 96 MHz */RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_PLLSRC | RCC_CFGR_PLLXTPRE |RCC_CFGR_PLLMULL));for(StartUpCounter=0;StartUpCounter<0x1fff;StartUpCounter++);RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLSRC_HSE | RCC_CFGR_PLLMULL12);
#else
//  RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_PLLSRC | RCC_CFGR_PLLXTPRE |
//                                        RCC_CFGR_PLLMULL));//RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLSRC_HSE|(1<<17));//RCC->CFGR &= ~(RCC_CFGR_PLLMULL);//RCC->CFGR |= (uint32_t)(1<<27u);RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_PLLSRC | RCC_CFGR_PLLXTPRE |RCC_CFGR_PLLMULL));RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLSRC_HSE | (1<<27)|(7<<18)|(1<<17));
#endif
#endif /* STM32F10X_CL *//* Enable PLL */RCC->CR |= RCC_CR_PLLON;/* Wait till PLL is ready */while((RCC->CR & RCC_CR_PLLRDY) == 0){}for(StartUpCounter=0;StartUpCounter<0x1fff;StartUpCounter++);/* Select PLL as system clock source */RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_SW));RCC->CFGR |= (uint32_t)RCC_CFGR_SW_PLL;    for(StartUpCounter=0;StartUpCounter<0x200;StartUpCounter++);for(StartUpCounter=0;StartUpCounter<0x1fff;StartUpCounter++);/* Wait till PLL is used as system clock source */while ((RCC->CFGR & (uint32_t)RCC_CFGR_SWS) != (uint32_t)0x08){}}else{ /* If HSE fails to start-up, the application will have wrong clock configuration. User can add here some code to deal with this error */}
}

GD32F103快速替换STM32F103相关推荐

  1. 国产 MCU AT32F403A 替换 STM32F103 can通讯测试

    第九章AT32F403A替换stm32f103 can通讯测试 前言 此文章是使用AT32F403A的开发板去跑stm32f103的can通讯功能的测试情况 硬件 硬件方面使用的是自己画的板子,使用的 ...

  2. 【OpenCV 例程300篇】202. 查表快速替换(cv.LUT)

    OpenCV 例程200篇 总目录 201. 图像的颜色空间转换 202. 查表快速替换(cv.LUT) 203. 伪彩色图像处理 204. 图像的色彩风格滤镜 205. 调节色彩平衡/饱和度/明度 ...

  3. Jackson快速替换Fastjson之道

    Jackson快速替换Fastjson之道 一· 概述 Fastjson已经连续几次爆出高危漏洞,和Structs一样,每次影响范围都比较广,殃及几乎所有的JAVA后台系统.为避免以后频繁地应急处理F ...

  4. idea利用正则表达式快速替换

    idea利用正则表达式快速替换 需求:要将link标签中的href属性替换成用thymeleaf表达的形式,让其资源寻址是从从项目名开始寻找的 如将<link rel="stylesh ...

  5. 快速替换jar包中.class、.html、.yml格式的文件

    快速替换jar包中.class..html..yml格式的文件 文章目录 快速替换jar包中.class..html..yml格式的文件 背景 下载反编译软件JD-GUI 使用 jd-gui 打开we ...

  6. 快速替换合并单元格中的空白单元格

    合并单元格数据中存在空值,如何快速替换空白单元格为"未知"? 复制原数据到一个新的sheet 取消合并单元格 CTRL+G 定位空值 编辑栏输入"未知",CTR ...

  7. GD32E103/F303系列替换STM32F103

    注:本文档仅针对GD32E103/F303系列替代STM32F103系列 版权:威尔健科技有限公司 联系方式:18816824119(微信同号) 本人:GD技术支持 明:GD32E103/GD32F1 ...

  8. 国产 MCU AT32F403A 替换 STM32F103 点LED灯

    第三章   点LED测试 前言 既然是替换,那就是要AT32F403A直接去跑stm32的代码更能说明可行性.此文章是使用AT32F403A的开发板去跑stm32f103的LED灯的代码的测试情况. ...

  9. oracle扩充undo,Oracle快速替换UNDO表空间方法

    UNDO表空间不够用,有两种处理方法: 1.扩大表空间大小: 2.创建新的UNDO表空间,删除原来的. 一.初步操作 确认UNDO表空间名称 select name from v$tablespace ...

  10. 网管日记:故障网络交换机快速替换方法

    网络管理员每天要处理的事情很多,不仅仅要保持网络的稳定,还要保证计算机工作正常.这些日常的网络管理维护也是有技巧的,当计算机硬件发生问题后最常用的方法是替换法,拿另外一台计算机的同样部件来替代怀疑损坏 ...

最新文章

  1. intellij idea 怎么全局搜索--转
  2. ava method org.apache.struts2.components.Form.getValidators(String) threw an exception when invoke
  3. foreman源NO_PUBKEY 6F8600B9563278F6
  4. iphone-命令行编译之--xcodebuild
  5. 惊呆~从风控的多头策略能了解到的行业信息还真不少
  6. java中是否可以覆盖over_”static”关键字是什么意思?Java中是否可以覆盖(override)一个private或者是static的方法?...
  7. SQL Server迁移数据库文件(ldfmdf文件)到其他盘
  8. ISO18000-6C 电子标签数据存储空间及数据加密说明
  9. 大牛解密阿里云直播技术平台
  10. 伺服电机功率计算选型与伺服电机惯量匹配
  11. java NBA2010,关于一个NBA球队连续夺冠的SQL查询问题,解法很精妙~
  12. 搜狗站长平台多线程推送工具【免码-免VPS】
  13. 盘点编程那些英语单词的中文意思
  14. piranha(注意iptables和selinux的问题)
  15. 怎么用python表白_如何正确使用Python进行表白
  16. 心态很容易受别人影响_太容易被别人影响,我上辈子可能是个“复印机”
  17. 《游戏设计快乐之道(第2版)》一第2章 大脑如何运作
  18. WRF-Chem emission guide
  19. 特斯拉、华为们要用软件重新定义汽车?
  20. 烤仔建工 | 来红浪漫和漂亮姐姐Yanelis K歌吧

热门文章

  1. java axis_Java 使用Axis实现WebService实例
  2. ie8兼容性视图灰色修复_win8系统设置IE8浏览器兼容性视图的方法
  3. Hbase下载与安装部署(一)- 独立式
  4. java无经验_应届生没有项目经验怎么面试?(java篇)
  5. 尚学堂第二章作业题答案
  6. 微信红包封面开放平台序列号
  7. 《完全写作指南》读书笔记
  8. android exoplayer 直播流,android – Exoplayer自适应hls流媒体
  9. 人教版四年级上次计算机教案,人教版四年级上册数学教案
  10. html当前时间插件,HTML日期时间插件