注:本文档仅针对GD32F103系列替代STM32F103系列

一、相同点**
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);
1
2
3
4
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 */
  }
}
————————————————
版权声明:本文为CSDN博主「笙歌君独忧」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_23852045/article/details/109206536

GD32F103替换STM32F103相关推荐

  1. 在GD32F103移植STM32F103代码

    在GD32F103移植STM32F103代码 使用相同FLASH和管脚数量相同的芯片,例如GDF103C8T6移植STM32F103C8T6程序.虽然两个款芯片的寄存器地址以及架构基本相同.但是需要注 ...

  2. GD32F103替代STM32F103带来串口不能用的问题

    近期,由于需要,先前使用GD32F103的替换STM32F103的芯片,它的系统主频提升到104MHZ, 众所周之,STM32F103的主频是72MHZ,这里没有什么问题,只要改一下SYSTEMCLO ...

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

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

  4. GD32E103/F303系列替换STM32F103

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

  5. APM32F103替换STM32F103的经历

    目录 1.替换STM32 2.尝试失败 3.再次尝试 4.意外发现 1.替换STM32 由于2020年末STM32F103系列单片机严重涨价,笔者不得不考虑更换芯片方案:而GD32系列单片机据同行反应 ...

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

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

  7. stm32f103移植到f0_STM32F042替换STM32F103

    因为从事汽车CAN总线及多媒体解码盒,常常需要解一些简单的CAN数据,需要的硬件IO不多,仅仅是CAN+UART,所以最近为了节省成本,也是花了不少心思. 直到最近发现了STM32F042,据介绍,这 ...

  8. 关于最近GD32F103替代STM32F103方案个人记录

    由于最近STM32芯片价格猛涨,公司要求寻找替代方案.考虑到开发时间最终选择了pin-pin兼容的GD32. 在STM32原有工程基础上不做大发动,只要细微修改下面图示一个地方便可以实现替代. 一.使 ...

  9. 雅特力AT32F403A, 国产芯片PIN TO PIN 替代STM32F103

    中美贸易摩擦日渐加剧,美国从各个方面到处打压中国,半导体行业也收到一定冲击,逼迫国内企业不得不准备产品国产化方案,自从华为被美国制裁之后,国内的很多手机厂商明白了一个道理,爹有娘有,不如自己有.于是各 ...

  10. 学校学生工科学生接私活_理工科学生在美国以外的最佳城市

    学校学生工科学生接私活 Expanding the scope of where to look can broaden skills and experiences. 扩大看点的范围可以扩大技能和经 ...

最新文章

  1. 商汤作价1026亿IPO,商业化汤教授身家220亿
  2. jni和java之间字符串的转换
  3. emacs org mode 中的标签全参考
  4. iptables加载顺序问题及优化方法
  5. mysql自动转库_JAVA自动操作0racle数据库转mysql数据库
  6. ubuntu16.04 搭建Jenkins自动编译环境问题汇总
  7. LINK : fatal error LNK1104: cannot open file mfc42d.lib
  8. 小师妹学JVM之:GC的垃圾回收算法
  9. Debian11服务器系统默认不存在sudo命令的解决办法
  10. 解决js弹窗网页出现白屏
  11. 远程调试运行在Resin上面的Web应用程序
  12. 浅析Windows计算机中丢失SETUPAPI.dll的问题
  13. pyqt5 实现右键自定义_Python界面(GUI)编程PyQt5事件和信号
  14. php试卷分析,试卷分析常用统计指标
  15. Python:寻找回文素数
  16. Microsoft Teams管理(一)
  17. 解决虚拟机-虚拟网络配置没有桥接模式,本地没有虚拟网卡
  18. focaltech(敦泰)触摸屏驱动Ft5306.c学习记录
  19. 计算机网络硬件ppt,4计算机网络硬件基础全解.ppt
  20. 91sp.vido.ws index.php_Vidows

热门文章

  1. 第三章在局域网中使用冗余链路
  2. VB.NET利用WMI获取操作系统所在硬盘序列号
  3. 使用Jquery.flot插件时出现“例外被抛出且未被接住”
  4. android助手盒子版,小米盒子助手
  5. 窗户控制app开发day1(机智云的二次开发之换皮肤)
  6. LM2596、LM2576
  7. HUSTOJ的安装与配置
  8. java手机解锁密码_Appium 解决手势密码 (java篇)
  9. WOWZA的安装及(VOD+LIVE)简单配置和VLC RTP推流
  10. MATLAB模糊控制器