精华内容
下载资源
问答
  • GD32替换STM32注意事项
    2022-02-09 22:25:09

    文章源自微信公众号(8号线攻城狮)

    1.GD32简述

    在这里插入图片描述
    GD32F103是GD早期的产品,GD32E103和GD32F303是对GD32F103的升级和优化,所以4者是兼容的,虽然内核不同,但是通用外设几乎很少涉及到内核部分,在时间急迫的情况下可以使用ST的库开发。

    2.二者之间的相同点

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

    3.外围硬件的区别

    从上面的介绍中,我们可以看出,GD32F30/E103系列和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可能无法启动或工作异常。

    4.使用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区。

    5.总结

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

    更多相关内容
  • 使用GD32替换STM32

    2022-02-22 10:14:09
    使用GD32替换STM32
  • GD32 介绍与 STM32 兼容性汇总。STM32的代码直接在GD32上运行需要小部分的修改。按教程做对应修改就行哈。
  • 点击上方“小麦大叔”,选择“置顶/星标公众号”福利干货,第一时间送达大家好,我是小麦,昨天ST又发涨价涵了,GD32作为一款替换STM32的国产芯片,和STM32有哪些区别,有哪些需要注意的地方呢?下面我们来看看吧。...

    点击上方“小麦大叔”,选择“置顶/星标公众号”

    福利干货,第一时间送达

    大家好,我是小麦,昨天ST又发涨价涵了,GD32作为一款替换STM32的国产芯片,和STM32有哪些区别,有哪些需要注意的地方呢?下面我们来看看吧。

    一、前言

    什么是GD32?

    GD32是国内兆易创新公司开发的一款单片机。

    GD32和STM32有很多地方都是相似的,不过GD32毕竟是不同的产品,不可能所有东西都沿用STM32,有些自主开发的东西还是有区别的。相同的地方我们就不说了,下面我给大家讲一下不同的地方。

    二、区别

    1、内核

    GD32采用二代的M3内核,STM32主要采用一代M3内核,下图是ARM公司的M3内核勘误表,GD使用的内核只有752419这一个BUG。
    89bf78902d31236462b11a9e5556b60b.png

    2、主频

    使用HSE(高速外部时钟):GD32的主频最大108M,STM32的主频最大72M
    使用HSI(高速内部时钟):GD32的主频最大108M,STM32的主频最大64M
    主频大意味着单片机代码运行的速度会更快,项目中如果需要进行刷屏,开方运算,电机控制等操作,GD是一个不错的选择。

    3、供电

    外部供电:GD32外部供电范围是2.6~3.6V,STM32外部供电范围是2~3.6V。

    GD的供电范围比STM32相对要窄一点。


    内核电压:GD32内核电压是1.2V,STM32内核电压是1.8V。GD的内核电压比STM32的内核电压要低,所以GD的芯片在运行的时候运行功耗更低。

    4、Flash差异

    GD32的Flash是自主研发的,和STM32的不一样。


    GD Flash执行速度:GD32 Flash中程序执行为0等待周期。


    STM32 Flash执行速度:ST系统频率不访问flash等待时间关系:0等待周期,当0<SYSCLK<24MHz,1等待周期,当24MHz<SYSCLK≤48MHz,2等待周期,当48MHz<SYSCLK≤72MHz。


    Flash擦除时间:GD擦除的时间要久一点,官方给出的数据是这样的:GD32F103/101系列Flash 128KB 及以下的型号, Page Erase 典型值100ms, 实际测量60ms 左右。对应的ST 产品Page Erase 典型值 20~40ms。

    5、功耗

    从下面的表可以看出GD的产品在相同主频情况下,GD的运行功耗比STM32小,但是在相同的设置下GD的停机模式、待机模式、睡眠模式比STM32还是要高的。
    ca80b6f387bdadf72fd233f1514a016d.png

    6、串口

    GD在连续发送数据的时候每两个字节之间会有一个Bit的Idle,而STM32没有,如下图。

    ac26246f695bbc79f59b6f6934a904a6.png

    GD的串口在发送的时候停止位只有1/2两种停止位模式。STM32有0.5/1/1.5/2四种停止位模式。


    GD 和STM32 USART的这两个差异对通信基本没有影响,只是GD的通信时间会加长一点。

    7、ADC差异

    GD的输入阻抗和采样时间的设置和ST有一定差异,相同配置GD采样的输入阻抗相对来说要小。具体情况见下表这是跑在72M的主频下,ADC的采样时钟为14M的输入阻抗和采样周期的关系:

    89aa72345a4317a1e5e5c4d447d72bff.png

    8、FSMC

    STM32只有100Pin以上的大容量(256K及以上)才有FSMC,GD32所有的100Pin或100Pin以上的都有FSMC。

    9、103系列RAM&FLASH大小差别

    GD103系列和ST103系列的ram和flash对比如下图:
    e6356c1cb0cda410e8acb7c65db39c96.png


    10、105&107系列STM32和GD的差别

    GD的105/107的选择比ST的多很多,具体见下表:
    ec8455d0ef1a621fd9e96bc9d5e3c739.png

    11、抗干扰能力

    关于这一点,官方没有给出,我也是在做项目的时候偶然发现的,项目原本是用STM32F103C8T6,后来换成GD F103C8T6,这两个芯片的引脚完全一致,然后单片机用了的两个邻近的引脚作为SPI的时钟引脚和数据输出引脚,然后发现STM32的SPI能正常通讯,GD的不行,经过检查发现PCB板SPI的铜线背面有两根IIC的铜线经过,信号应该是受到影响了。

    用示波器看了一下引脚的电平,发现确实是,STM32和GD的数据引脚波形都不正常,但是STM32的波形要好很多,波形虽然差了点,但是SPI通讯依然正常。

    而GD则不能正常通讯了。然后我又把SPI的通讯速率减慢,发现STM32的数据引脚很快就恢复正常波形了,而GD的依然差,直到速率降到很低才恢复正常。初步怀疑是STM32内部对引脚有做一些滤波的电路,而GD则没有。

    虽然我用的这个电路板本身布线有些不合理,但是在同样恶劣的环境下,STM32依然保证了通讯的正常,而GD不行,这在一定程度上说明了GD的抗干扰能力不如STM32。

    转自公众号:技术让梦想更伟大

    版权声明:本文来源网络,版权归原作者所有。版权问题,请联系删除。

    —— The End ——

    往期推荐

    高效解析单片机通讯协议,最实用的一个方法

    最适合单片机的通信协议,如何设计?

    4600万台销量!树莓派炼成之路

    好工具,不私藏!介绍一个提高效率的利器

    这个c语言技巧,刷新了我对结构体的认知!

    C语言还可以这么玩,你绝对想不到!

    45ede36c2712b9f307ccd763bd8cf4c4.png

    你点的每个好看,我都认真当成了喜欢

    展开全文
  • GD32替换STM32移植过程

    千次阅读 2021-12-09 16:27:30
    硬件上使用对应的GD32芯片替换STM32,如使用 GD32F103RET6 替换 STM32F103RET6,其引脚数与引脚定义都是一样的 到兆易创新官网 - 资料下载 - 对应系列芯片 - 应用软件 - 找到GD32F1x0_Addon_V3.1.0.rar,解压安装 3....

    1. 硬件芯片移植


    下面以 GD32F103RET6 替换 STM32F103RET6为例

    1. 硬件上使用对应的GD32芯片替换STM32,如使用 GD32F103RET6 替换 STM32F103RET6,其引脚数与引脚定义都是一样的
    2. 兆易创新官网 - 资料下载 - 对应系列芯片 - 应用软件 - 找到GD32F1x0_Addon_V3.1.0.rar,解压安装
      在这里插入图片描述3. 更换算法文件(.FLM)到Keil 的Flash文件夹中(Keil_v5\ARM\Flash)
      在这里插入图片描述

    算法文件资源下载:GD32F10xxx Keil IDE Config.rar

    2. 软件配置

    下图取自STM32 参考手册,配置DMA 通道时须根据此表对应功能配置,如使用DMA 作为串口1的接收功能,就必须使用DMA1 的通道5 .
    在这里插入图片描述

    2.1 修改外部晶振起振超时时间

    ⚠ 不用外部晶振可跳过此步

    由于GD芯片与ST芯片的启动时间存在差异,需要对下面参数进行修改

    搜索以下代码
    #define HSE_STARTUP_TIMEOUT ((uint16_t)0x0500)
    修改为:
    #define HSE_STARTUP_TIMEOUT ((uint16_t)0xFFFF)
    
    

    2.2 增加DMA 功能

    下面以串口3为例

    GD32替换STM32的最大问题就是串口收发问题,经常出现丢数据异常,使用DMA处理串口数据,可有效解决该问题。

    • 首先引入STM32 官方头文件 stm32f10x_dma.h
    #include "stm32f10x_dma.h"
    
    • 串口3与DMA初始化函数
    #define USE_USART3_DMA_RX	1 // 宏定义一个条件变量
    char Usart3data[200]; // 串口数据接收数组
    u8 Usart3flag =0; // 标志位
    u8 usart3Count=0; // 串口数据计数
    
    void USART3_Configuration(u32 BaudRate)      
    {
        USART_InitTypeDef USART_InitStructure;
        GPIO_InitTypeDef GPIO_InitStructure;
        NVIC_InitTypeDef NVIC_InitStructure;
    	  DMA_InitTypeDef DMA_InitStruct;	// 定义dma 结构体
    	
        //打开usart3要使用的时钟
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO, ENABLE);
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3,ENABLE);
    
        //配置串口TX作为推挽复用端口
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_InitStructure.GPIO_Mode =  GPIO_Mode_AF_PP;
        GPIO_Init(GPIOB, &GPIO_InitStructure);
    
        //配置串口RX作为浮空输入
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_InitStructure.GPIO_Mode =  GPIO_Mode_IN_FLOATING;
        GPIO_Init(GPIOB, &GPIO_InitStructure);
    
        //配置NVIC
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);  //一个抢占优先级,3个从优先级
        NVIC_InitStructure.NVIC_IRQChannel =USART3_IRQn; //和库函数手册不一样
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;     //主优先级
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;            //从优先级
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能中断通道
        NVIC_Init(&NVIC_InitStructure);
    
        //配置USART
        USART_InitStructure.USART_BaudRate = BaudRate;	//波特率
        USART_InitStructure.USART_WordLength = USART_WordLength_8b;	//数据位
        USART_InitStructure.USART_StopBits = USART_StopBits_1;	//停止位
        USART_InitStructure.USART_Parity = USART_Parity_No;	//奇偶校验
        USART_InitStructure.USART_HardwareFlowControl =USART_HardwareFlowControl_None; 	//数据流控制
        USART_InitStructure.USART_Mode = USART_Mode_Tx | USART_Mode_Rx;	//模式
        USART_Init(USART3, &USART_InitStructure);	//写入结构体
    //    USART_Cmd(USART3, ENABLE);  //使能usart3
    
        USART_ITConfig(USART3,USART_IT_PE,ENABLE);
        USART_ITConfig(USART3, USART_IT_RXNE,ENABLE);   //打开usart3的接收中断
        USART_ClearFlag(USART3,USART_IT_RXNE);          //清除中断标志
    //    USART_ClearFlag(USART3, USART_FLAG_TC);     // 清标志
    		
    
    /********************************以下是对DMA的参数初始化**********************************/
    #if USE_USART3_DMA_RX		
    	  USART_ITConfig(USART3, USART_IT_IDLE, ENABLE); // 开启串口3空闲中断 		
    		DMA_DeInit(DMA1_Channel3); // 查上表可知,串口3 接收功能对应DMA1 的通道3
    		RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);  // DMA1时钟初始化
        
        // RX DMA1 ??5
        DMA_InitStruct.DMA_BufferSize = sizeof(Usart3data);      			// 传输的数据大小,其中Usart3data 就是串口数据接收变量
        DMA_InitStruct.DMA_DIR = DMA_DIR_PeripheralSRC;            			// 外设作为数据的来源
        DMA_InitStruct.DMA_M2M = DMA_M2M_Disable;                  			// 不使能M TO M传输
        DMA_InitStruct.DMA_MemoryBaseAddr = (uint32_t)Usart3data;			// 设置DMA源地址:串口数据寄存器
        DMA_InitStruct.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;		// 内存数据单元
        DMA_InitStruct.DMA_MemoryInc = DMA_MemoryInc_Enable;        		// 外设地址不增
        DMA_InitStruct.DMA_Mode = DMA_Mode_Normal;                  		// DMA模式一次或者循环模式
    		//DMA_InitStruct.DMA_Mode = DMA_Mode_Circular;              		// DMA模式一次或者循环模式
        DMA_InitStruct.DMA_PeripheralBaseAddr = USART3_BASE + 0x04; 		// 设置DMA源地址:串口数据寄存器地址
        DMA_InitStruct.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;    // 外设数据单元
        DMA_InitStruct.DMA_PeripheralInc = DMA_PeripheralInc_Disable;   // 外设地址不增加
        DMA_InitStruct.DMA_Priority = DMA_Priority_High;            		// 优先级为中
     
        // 配置DMA通道     
        DMA_Init(DMA1_Channel3, &DMA_InitStruct);     
        // 清除DMA所有标志
        DMA_ClearFlag(DMA1_FLAG_TC3);
        DMA_ITConfig(DMA1_Channel3, DMA_IT_TE,ENABLE);
    
        USART_DMACmd(USART3, USART_DMAReq_Rx, ENABLE);//开启串口DMA接收
        DMA_Cmd(DMA1_Channel3, ENABLE);     // 使能DMA通道		
    #else
        USART_ITConfig(USART3, USART_IT_RXNE, ENABLE); // 开启串口接收中断	
    #endif
    //		USART_ClearFlag(USART3, USART_FLAG_TC);     /* 清除标志避免第一个字符丢失 */	// 使用GD32时,发送第一个数据前不要清除 USART_FLAG_TC(发送完成标志位)
        USART_Cmd(USART3, ENABLE);  		//使能串口 
    }
    
    • 串口3中断服务函数
    void USART3_IRQHandler(void)                	//串口1中断服务程序
    {
    	u8 Res;
    	
    #if USE_USART3_DMA_RX	
    	if(USART_GetITStatus(USART3, USART_IT_IDLE) != RESET)  //接收中断(接收到的数据必须是0x0d 0x0a结尾)    读取接收中断标志位后自动清零接收中断标志位
    	{      
    			Receice_DataPack(3);
    			Res = USART3->SR;
    			Res = USART3->DR;
    	}
    #else
    #endif
    }
    
    #define USART_RX_BUFF_SIZE 200
    void Receice_DataPack(uint8_t channel)
    {
    	//接收到的数据长度
    	uint32_t buff_length;
    	u32 i;
    	static uint8_t byteindex = 0;
    	switch(channel)
    	{
    		case 3:
    		{
    				//获取这一帧数据个数,此处注意 USART_RX_BUFF_SIZE 的长度要跟 Usart3data 定义的长度相同,否则会发生异常
    				buff_length = USART_RX_BUFF_SIZE - DMA_GetCurrDataCounter(DMA1_Channel3);
    				
    				for(;byteindex < buff_length;byteindex++)
    				{
    					
    					Putch(USART3,Usart3data[byteindex]);
    				}//回显处理
    				byteindex = buff_length;
    				if(Usart3data[buff_length-1] == '\r' ||Usart3data[buff_length-1] == '\n') //接收到了一帧完整的命令
    				{
    					Usart3flag = 1;//接收到空行的命令
    					Putch(USART3,'\n');//MAC下不发送新行会覆盖输入
    					byteindex = 0;
    					if(Usart3data[buff_length-1] == '\n' || Usart3data[buff_length-1] == '\r')//去掉接受数据中尾部的回车换行符
    					{
    						Usart3data[buff_length-1] = 0;
    					}
    					if(Usart3data[buff_length-2] == '\r')
    					{
    						Usart3data[buff_length-2] = 0;
    					}
    					return;
    				}
    				if(buff_length >= 50)
    				{
    					byteindex = 0;
    					DMA1_Channel3->CCR&=~(1<<0);                //关闭DMA接受中断		
    					DMA1_Channel3->CNDTR=USART_RX_BUFF_SIZE;  //清空DMA数据计数器,重新计数下一帧数据			
    					DMA1_Channel3->CCR|=1<<0; 			
    				}			
    			break;			
    		}
    		default: break;
    		}
    
    }
    
    void  Putch(USART_TypeDef* USARTx,u8 k) // 回显函数
    {
    	if(k == '\n')
    	{
    		USART_SendData(USARTx,'\r');
    		while(USART_GetFlagStatus(USARTx,USART_FLAG_TC)!=SET);//等待发送结束
    		USART_SendData(USARTx,'\n');
    		while(USART_GetFlagStatus(USARTx,USART_FLAG_TC)!=SET);//等待发送结束
    	}
    	else if(k == '\b')//接收到
    	{
    		USART_SendData(USARTx,'\b');
    		while(USART_GetFlagStatus(USARTx,USART_FLAG_TC)!=SET);//等待发送结束
    		USART_SendData(USARTx,' ');
    		while(USART_GetFlagStatus(USARTx,USART_FLAG_TC)!=SET);//等待发送结束
    		USART_SendData(USARTx,'\b');
    		while(USART_GetFlagStatus(USARTx,USART_FLAG_TC)!=SET);//等待发送结束		
    	}
    	else
    	{
    		while(USART_GetFlagStatus(USARTx,USART_FLAG_TC)!=SET);//等待发送结束
    		USART_SendData(USARTx,k);
    		//while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);//等待发送结束
    	}
    }
    
    
    • main函数
    int main()
    {
    
    ... //省略代码
    
        while(1)
        {
    				... //省略代码
            if(Usart3flag==1) //接收完成
            {
    						port_Index=3;
                  CheckUartCmd(Usart3data); 
    						Usart3flag=0;
    						memset(Usart3data,'\0',sizeof(Usart3data));//清空接收缓冲区
    						DMA1_Channel3->CCR&=~(1<<0);                //关闭DMA接受中断
    						DMA1_Channel3->CNDTR=sizeof(Usart3data);  //清空DMA数据计数器,重新计数下一帧数据
    						DMA1_Channel3->CCR|=1<<0;  
    						usart3Count=0;
            }
        }
    }
    

    参考:GD32如何替换STM32?

    展开全文
  • 关注、星标公众号,直达精彩内容来源:网络素材GD32是国内开发的一款单片机,据说开发的人员是来自ST公司的,GD32也是以STM32作为模板做出来的。所以GD32和STM32有很多地方都是...

    关注、星标公众号,直达精彩内容

    6d49c0e3a534cefe66596a459b3cde13.png

    来源:网络素材

    GD32是国内开发的一款单片机,据说开发的人员是来自ST公司的,GD32也是以STM32作为模板做出来的。所以GD32和STM32有很多地方都是一样的。

    不过GD32毕竟是不同的产品,不可能所有东西都沿用STM32,有些自主开发的东西还是有区别的。

    相同的地方我们就不说了,下面列一下不同的地方。

    1 内核

    GD32采用二代的M3内核,STM32主要采用一代M3内核,下图是ARM公司的M3内核勘误表,GD使用的内核只有752419这一个BUG。

    d08adc104cca52e84d9d0fdda0883102.png

    2 主频

    使用HSE(高速外部时钟):GD32的主频最大108M,STM32的主频最大72M

    使用HSI(高速内部时钟):GD32的主频最大108M,STM32的主频最大64M

    主频大意味着单片机代码运行的速度会更快,项目中如果需要进行刷屏,开方运算,电机控制等操作,GD是一个不错的选择。

    3 供电

    外部供电:GD32外部供电范围是2.6-3.6V,STM32外部供电范围是2-3.6V。GD的供电范围比STM32相对要窄一点。

    内核电压:GD32内核电压是1.2V,STM32内核电压是1.8V。GD的内核电压比STM32的内核电压要低,所以GD的芯片在运行的时候运行功耗更低。

    4 Flash差异

    GD32的Flash是自主研发的,和STM32的不一样。

    GD Flash执行速度:GD32 Flash中程序执行为0等待周期。

    STM32 Flash执行速度:ST系统频率不访问flash等待时间关系,0等待周期,当0<SYSCLK<24MHz;1等待周期,当24MHz<SYSCLK≤48MHz;2等待周期,当48MHz<SYSCLK≤72MHz。

    Flash擦除时间:GD擦除的时间要久一点,官方给出的数据是这样的“GD32F103/101系列Flash 128KB及以下的型号,Page Erase典型值100ms, 实际测量60ms左右。”对应的ST 产品Page Erase典型值 20~40ms。

    5 功耗

    从下面的表可以看出GD的产品在相同主频情况下,GD的运行功耗比STM32小,但是在相同的设置下GD的停机模式、待机模式、睡眠模式比STM32还是要高的。

    2fc6eb484c741bcb6a864cd11984bc73.png

    6 串口

    GD在连续发送数据的时候每两个字节之间会有一个Bit的Idle,而STM32没有,如下图。

    e5953679216d3f2e625cc4a2db456f73.png

    GD的串口在发送的时候停止位只有1/2两种停止位模式。STM32有0.5/1/1.5/2四种停止位模式。

    GD 和STM32 USART的这两个差异对通信基本没有影响,只是GD的通信时间会加长一点。

    7 ADC差异

    GD的输入阻抗和采样时间的设置和ST有一定差异,相同配置GD采样的输入阻抗相对来说要小。具体情况见下表这是跑在72M的主频下,ADC的采样时钟为14M的输入阻抗和采样周期的关系:

    385a3cc24010de3710e87bd7cb96df37.png

    8 FSMC

    STM32只有100Pin以上的大容量(256K及以上)才有FSMC,GD32所有的100Pin或100Pin以上的都有FSMC。

    9 103系列RAM&FLASH大小差别

    GD103系列和ST103系列的ram和flash对比如下图:

    728de6413b0beb661845c3b4413c4cc0.png

    10 105&107系列STM32和GD的差别

    GD的105/107的选择比ST的多很多,具体见下表:

    ebe8969912298e53b989d25e3a74824a.png

    11 抗干扰能力

    关于这一点,官方没有给出,笔者也是在做项目的时候偶然发现的。

    项目原本是用STM32F103C8T6,后来换成GDF103C8T6。这两个芯片的引脚完全一致,单片机用了的两个邻近的引脚作为SPI的时钟引脚和数据输出引脚,然后发现STM32的SPI能正常通讯,GD的不行;经过检查发现PCB板SPI的铜线背面有两根IIC的铜线经过,信号应该是受到影响了。

    用示波器看了一下引脚的电平,发现确实是,STM32和GD的数据引脚波形都不正常,但是STM32的波形要好很多,波形虽然差了点,但是SPI通讯依然正常。而GD则不能正常通讯了。

    然后笔者又把SPI的通讯速率减慢,发现STM32的数据引脚很快就恢复正常波形了,而GD的依然差,直到速率降到很低才恢复正常。初步怀疑是STM32内部对引脚有做一些滤波的电路,而GD则没有。

    虽然用的这个电路板本身布线有些不合理,但是在同样恶劣的环境下,STM32依然保证了通讯的正常,而GD不行,这在一定程度上说明了GD的抗干扰能力不如STM32。

    ‧‧‧‧‧‧‧‧‧‧‧‧‧‧‧‧  END  ‧‧‧‧‧‧‧‧‧‧‧‧‧‧‧‧
    
    关注我的微信公众号,回复“加群”按规则加入技术交流群。
    
    欢迎关注我的视频号:

    d278af8c8bcd17f2b59c8dc97ee136e2.png

    点击“阅读原文”查看更多分享,欢迎点分享、收藏、点赞、在看。
    展开全文
  • stm32程序使用CubeMX生成,HAL库为最新库,将代码烧写到GD32上运行异常,该问题是GD32不能兼容最新的HAL库,需要使用旧的HAL库
  • 今日份视频号视频----正文----一、 GD32 与 STM32 异同1.相同点1)外围引脚定义:相同型号的管脚定义相同2) Cortex M3 内核:STM32F103 内核 R1...
  • 项目场景: GD32替换STM32遇到HAL库CAN无法初始化 问题描述 GD32替换STM32遇到HAL库CAN无法初始化 void HAL_CAN_MspInit(CAN_HandleTypeDef* canHandle) { GPIO_InitTypeDef GPIO_InitStruct = {0}; if(canHandle->...
  • STM32 三相逆变器 国产芯片
  • GD32替换STM32注意事项!!!

    万次阅读 2020-04-12 17:41:45
    直接上文档,比较具体,下载观看就行。 GD32替换STM32注意事项!!!
  • STM32F103芯片换成GD32的芯片,但是依然是STM32的工程,其中#define HSE_STARTUP_TIMEOUT ((uint16_t)0x0500)替换为#define HSE_STARTUP_TIMEOUT ((uint16_t)0xFFFF) 发现 CAN和串口通讯正常,...
  • 00 前言缺料危机还在持续,MCU从国外ST...兆易创新GD32是国内开发的一款单片机,据说开发的人员是来自ST公司的,GD32也是以STM32作为模板做出来的。所以GD32和STM32有很多地方都是一样的。不过GD32毕竟是不同的产品...
  • GD32与STM32的区别.doc

    2021-06-17 01:05:29
    GD32与STM32的区别
  • GD32如何替换STM32

    千次阅读 2021-01-11 15:32:45
    关注、星标公众号,直达精彩内容作者:笙歌君独忧链接:https://blog.csdn.net/qq_23852045/article/details/109802955GD32F103...
  • GD32F103替换STM32F103

    2022-02-24 10:28:26
    注:本文档仅针对GD32F103系列替代STM32F103系列 一、相同点** 1)、外围引脚PIN TO PIN兼容,每个引脚上的复用功能也完全相同。 2)、芯片内部寄存器、外部IP寄存器地址和逻辑地址完全相同,但是有些寄存器默认值...
  • 由于疫情的原因,STM32芯片供货紧张、货期长。就算可以购买到现货,但现货价格高的离谱。另外,就此大环境,拆机件大量涌现,拆机件你真的敢用吗? 2021芯慌啊,我早期设计使用的STM32F030C8T6,原厂都不给排单了,...
  • GD32是国内开发的一款单片机,据说开发的人员是来自ST公司的,GD32也是以STM32作为模板做出来的。所以GD32和STM32有很多地方都是一样的。 不过GD32毕竟是不同的产品,不可能所有东西都沿用STM32,有些自主开发的...
  • 如何替换_GD32如何替换STM32

    千次阅读 2021-03-19 22:43:40
    GD32F103是GD早期的产品,GD32E103和GD32F303是对GD32F103的升级和优化,所以4者是兼容的,虽然内核不同,但是通用外设几乎很少涉及到内核部分,在时间急迫的情况下可以使用ST的库开发。 一、相同点 1)外围引脚PIN...
  • 【看完就懂】GD32替代STM32全过程记录

    万次阅读 多人点赞 2021-05-05 00:51:28
    STM32程序改个数值,生成的编译文件直接下载到GD32里面就能运行!!!
  • GD32替代STM32,是什么体验?

    千次阅读 2021-08-19 00:12:25
    一、前言大家好,我是张巧龙,最近ST涨价厉害,单位的物料成本也是频频告急。网上一直传,什么完美替代,直接就能用。说不心动吧,那是假的。看到嵌入式ARM这篇关于GD32替代STM32的文章...
  • 图解 GD32时钟配置.zip

    2020-06-07 08:46:54
    GD32系列MCU时钟配置图解说明,时钟树图与固件库函数的对应关系图解。快速上手时钟配置。GD32新手必备。
  • 背景 在中美摩擦日益增大的情况下,芯片的国产替代也愈发重要,尤其是最近芯片价格疯...我记得那时我的领导问我,stm32f103c8t6有没有国产替代的,我找了半天也只有三四家,可以同型号替代。时间来到了2021年,芯片厂商
  • 本文件是AT32(雅特力)与STM32GD32替换说明表,很详细
  • 1、GDF10x、GDF1x0、GDF20x、GDF450、STF10x、STF0xx、STF20x、STF4xx的硬件兼容性 2、GDF450和STF4xx是否硬件pin to pin? 3、GDF450和STF4xx是否软件兼容? 4、为什么GDF450要跟STF4xx兼容而不是和GDF10x、GDF20x...
  • 本资源详尽讲述了使用GD32F103C8T6芯片替换STM32F103C8T6芯片的全部过程,并附有实操全过程及过程截图和必备软件。
  • GD32F450替换STM32F429

    千次阅读 热门讨论 2022-01-28 10:25:17
    GD芯片替换STM32,解决出现的flash、usb以及HAL库兼容问题。
  • STM32F030移植到GD32E230心得

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 512
精华内容 204
关键字:

gd32替换stm32

友情链接: kaifaliuc.zip