GD32F103替换STM32F103
注:本文档仅针对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相关推荐
- 在GD32F103移植STM32F103代码
在GD32F103移植STM32F103代码 使用相同FLASH和管脚数量相同的芯片,例如GDF103C8T6移植STM32F103C8T6程序.虽然两个款芯片的寄存器地址以及架构基本相同.但是需要注 ...
- GD32F103替代STM32F103带来串口不能用的问题
近期,由于需要,先前使用GD32F103的替换STM32F103的芯片,它的系统主频提升到104MHZ, 众所周之,STM32F103的主频是72MHZ,这里没有什么问题,只要改一下SYSTEMCLO ...
- 国产 MCU AT32F403A 替换 STM32F103 can通讯测试
第九章AT32F403A替换stm32f103 can通讯测试 前言 此文章是使用AT32F403A的开发板去跑stm32f103的can通讯功能的测试情况 硬件 硬件方面使用的是自己画的板子,使用的 ...
- GD32E103/F303系列替换STM32F103
注:本文档仅针对GD32E103/F303系列替代STM32F103系列 版权:威尔健科技有限公司 联系方式:18816824119(微信同号) 本人:GD技术支持 明:GD32E103/GD32F1 ...
- APM32F103替换STM32F103的经历
目录 1.替换STM32 2.尝试失败 3.再次尝试 4.意外发现 1.替换STM32 由于2020年末STM32F103系列单片机严重涨价,笔者不得不考虑更换芯片方案:而GD32系列单片机据同行反应 ...
- 国产 MCU AT32F403A 替换 STM32F103 点LED灯
第三章 点LED测试 前言 既然是替换,那就是要AT32F403A直接去跑stm32的代码更能说明可行性.此文章是使用AT32F403A的开发板去跑stm32f103的LED灯的代码的测试情况. ...
- stm32f103移植到f0_STM32F042替换STM32F103
因为从事汽车CAN总线及多媒体解码盒,常常需要解一些简单的CAN数据,需要的硬件IO不多,仅仅是CAN+UART,所以最近为了节省成本,也是花了不少心思. 直到最近发现了STM32F042,据介绍,这 ...
- 关于最近GD32F103替代STM32F103方案个人记录
由于最近STM32芯片价格猛涨,公司要求寻找替代方案.考虑到开发时间最终选择了pin-pin兼容的GD32. 在STM32原有工程基础上不做大发动,只要细微修改下面图示一个地方便可以实现替代. 一.使 ...
- 雅特力AT32F403A, 国产芯片PIN TO PIN 替代STM32F103
中美贸易摩擦日渐加剧,美国从各个方面到处打压中国,半导体行业也收到一定冲击,逼迫国内企业不得不准备产品国产化方案,自从华为被美国制裁之后,国内的很多手机厂商明白了一个道理,爹有娘有,不如自己有.于是各 ...
- 学校学生工科学生接私活_理工科学生在美国以外的最佳城市
学校学生工科学生接私活 Expanding the scope of where to look can broaden skills and experiences. 扩大看点的范围可以扩大技能和经 ...
最新文章
- 商汤作价1026亿IPO,商业化汤教授身家220亿
- jni和java之间字符串的转换
- emacs org mode 中的标签全参考
- iptables加载顺序问题及优化方法
- mysql自动转库_JAVA自动操作0racle数据库转mysql数据库
- ubuntu16.04 搭建Jenkins自动编译环境问题汇总
- LINK : fatal error LNK1104: cannot open file mfc42d.lib
- 小师妹学JVM之:GC的垃圾回收算法
- Debian11服务器系统默认不存在sudo命令的解决办法
- 解决js弹窗网页出现白屏
- 远程调试运行在Resin上面的Web应用程序
- 浅析Windows计算机中丢失SETUPAPI.dll的问题
- pyqt5 实现右键自定义_Python界面(GUI)编程PyQt5事件和信号
- php试卷分析,试卷分析常用统计指标
- Python:寻找回文素数
- Microsoft Teams管理(一)
- 解决虚拟机-虚拟网络配置没有桥接模式,本地没有虚拟网卡
- focaltech(敦泰)触摸屏驱动Ft5306.c学习记录
- 计算机网络硬件ppt,4计算机网络硬件基础全解.ppt
- 91sp.vido.ws index.php_Vidows