GD32F103快速替换STM32F103
注:本文档仅针对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相关推荐
- 国产 MCU AT32F403A 替换 STM32F103 can通讯测试
第九章AT32F403A替换stm32f103 can通讯测试 前言 此文章是使用AT32F403A的开发板去跑stm32f103的can通讯功能的测试情况 硬件 硬件方面使用的是自己画的板子,使用的 ...
- 【OpenCV 例程300篇】202. 查表快速替换(cv.LUT)
OpenCV 例程200篇 总目录 201. 图像的颜色空间转换 202. 查表快速替换(cv.LUT) 203. 伪彩色图像处理 204. 图像的色彩风格滤镜 205. 调节色彩平衡/饱和度/明度 ...
- Jackson快速替换Fastjson之道
Jackson快速替换Fastjson之道 一· 概述 Fastjson已经连续几次爆出高危漏洞,和Structs一样,每次影响范围都比较广,殃及几乎所有的JAVA后台系统.为避免以后频繁地应急处理F ...
- idea利用正则表达式快速替换
idea利用正则表达式快速替换 需求:要将link标签中的href属性替换成用thymeleaf表达的形式,让其资源寻址是从从项目名开始寻找的 如将<link rel="stylesh ...
- 快速替换jar包中.class、.html、.yml格式的文件
快速替换jar包中.class..html..yml格式的文件 文章目录 快速替换jar包中.class..html..yml格式的文件 背景 下载反编译软件JD-GUI 使用 jd-gui 打开we ...
- 快速替换合并单元格中的空白单元格
合并单元格数据中存在空值,如何快速替换空白单元格为"未知"? 复制原数据到一个新的sheet 取消合并单元格 CTRL+G 定位空值 编辑栏输入"未知",CTR ...
- GD32E103/F303系列替换STM32F103
注:本文档仅针对GD32E103/F303系列替代STM32F103系列 版权:威尔健科技有限公司 联系方式:18816824119(微信同号) 本人:GD技术支持 明:GD32E103/GD32F1 ...
- 国产 MCU AT32F403A 替换 STM32F103 点LED灯
第三章 点LED测试 前言 既然是替换,那就是要AT32F403A直接去跑stm32的代码更能说明可行性.此文章是使用AT32F403A的开发板去跑stm32f103的LED灯的代码的测试情况. ...
- oracle扩充undo,Oracle快速替换UNDO表空间方法
UNDO表空间不够用,有两种处理方法: 1.扩大表空间大小: 2.创建新的UNDO表空间,删除原来的. 一.初步操作 确认UNDO表空间名称 select name from v$tablespace ...
- 网管日记:故障网络交换机快速替换方法
网络管理员每天要处理的事情很多,不仅仅要保持网络的稳定,还要保证计算机工作正常.这些日常的网络管理维护也是有技巧的,当计算机硬件发生问题后最常用的方法是替换法,拿另外一台计算机的同样部件来替代怀疑损坏 ...
最新文章
- intellij idea 怎么全局搜索--转
- ava method org.apache.struts2.components.Form.getValidators(String) threw an exception when invoke
- foreman源NO_PUBKEY 6F8600B9563278F6
- iphone-命令行编译之--xcodebuild
- 惊呆~从风控的多头策略能了解到的行业信息还真不少
- java中是否可以覆盖over_”static”关键字是什么意思?Java中是否可以覆盖(override)一个private或者是static的方法?...
- SQL Server迁移数据库文件(ldfmdf文件)到其他盘
- ISO18000-6C 电子标签数据存储空间及数据加密说明
- 大牛解密阿里云直播技术平台
- 伺服电机功率计算选型与伺服电机惯量匹配
- java NBA2010,关于一个NBA球队连续夺冠的SQL查询问题,解法很精妙~
- 搜狗站长平台多线程推送工具【免码-免VPS】
- 盘点编程那些英语单词的中文意思
- piranha(注意iptables和selinux的问题)
- 怎么用python表白_如何正确使用Python进行表白
- 心态很容易受别人影响_太容易被别人影响,我上辈子可能是个“复印机”
- 《游戏设计快乐之道(第2版)》一第2章 大脑如何运作
- WRF-Chem emission guide
- 特斯拉、华为们要用软件重新定义汽车?
- 烤仔建工 | 来红浪漫和漂亮姐姐Yanelis K歌吧
热门文章
- java axis_Java 使用Axis实现WebService实例
- ie8兼容性视图灰色修复_win8系统设置IE8浏览器兼容性视图的方法
- Hbase下载与安装部署(一)- 独立式
- java无经验_应届生没有项目经验怎么面试?(java篇)
- 尚学堂第二章作业题答案
- 微信红包封面开放平台序列号
- 《完全写作指南》读书笔记
- android exoplayer 直播流,android – Exoplayer自适应hls流媒体
- 人教版四年级上次计算机教案,人教版四年级上册数学教案
- html当前时间插件,HTML日期时间插件