完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
一、相同**
1)、外围引脚点到引脚特性,每个两个上的角色功能完全相同。 2)、芯片内部引导、外部IP地址和外部知识产权地址和逻辑上完全相同,但有一些原因可能默认值不同,所以外设模块的设计上和STM32 有不同的差异,这点不同主要表现在软件上的修改,详情见工具。 3)、更多:完全相同例如:IL 、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更准确复位。 修改: 将宏定义: #定义HSE_STARTUP_TIMEOUT ((uint16_t)0x0500) 修改为: #define HSE_STARTUP_TIMEOUT ((uint16_t)0xFFFF) 3)、GD32F10X flash取值零等待,而ST需要2个等待,因此,一些可能需要模拟IIC或SPI的代码可能需要修改。 原因:GD32采用专利技术提高了相同频率下的速度。 修改:如果使用或循环执行代码定时执行的,时间会执行速度惊人而使循环的时间变短,因此需要修改。仿真重计算设计。使用定时器定时器无影响。 4)、在代码中设置读保护,如果使用外部工具读保护如 JFLASH 或脱机烧录器设置,可跳过此步骤。 在写完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的擦除和程序时间上有差异,修改如下: 6)、需求flash大于256K注意,小于256K可以忽略。 与ST,GD的flash存在区分不同的概念,前256K ,CPU执行指令零等待,称代码区外区,此区称为外数据区。代码有错误,代码执行效率比代码慢一个数量级,因此数据区通常不建议运行对实时性要求高的代码,为解决这个问题,可以使用本地加载的方法,比如把代码初始化,图片代码等放到数据区。 7),ADC采集 一》 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 */ } } |
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1609 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1540 浏览 1 评论
970 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
681 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1587 浏览 2 评论
1861浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
644浏览 4评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
515浏览 3评论
528浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
503浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-21 01:25 , Processed in 0.843906 second(s), Total 77, Slave 61 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号