GD32F103与STM32F103的区别 2021.6.2

           GD32F103和STM32F103区别介绍

关键词Key words:
GD32F103、STM32F103
摘要Abstract:
本文主要是GD32F103和STM32F103区别进行介绍。

                              目录
  1. 简介
  2. GD32和STM32的区别
    2.1. 内核
    2.2. 主频
    2.3. 供电
    2.4. FLASH差异
    2.5. 功耗
    2.6. 串口
    2.7. ADC差异
    2.8. FSMC
    2.9. 103系列RAM&FLASH大小差别
    2.10. 抗干扰能力
  3. GD32替换STM32注意事项
    3.1. 硬件注意事项
    3.2. 软件注意事项
  4. 自测记录

1.简介

  • GD32是国内开发的一款单片机,据说开发的人员是来自ST公司的,GD32也是以STM32作为模板做出来的,因此GD32和STM32有很多地方都是一样的,但是GD32和STM32毕竟是不同的产品,不可能将所有东西都沿用STM32的,有些自主开发的东西还是有区别的。相同的地方就不说了,下面我着重介绍一下GD32和STM32不同的地方。

2.GD32和STM32的区别
2.1.内核
GD32采用二代的M3内核,STM32主要采用一代M3内核,下图是ARM公司的M3内核勘误表,GD使用的内核只有752419这一个BUG。
图1 STM32F103勘误表
2.2.主频
使用HSE(高速外部时钟):GD32的主频最大108M,STM32的主频最大72M;
使用HSI(高速内部时钟):GD32的主频最大108M,STM32的主频最大64M;
主频大意味着单片机代码运行的速度会更快,项目中如果需要进行刷屏,开方运算,电机控制等操作,GD是一个不错的选择。

2.3.供电
外部供电:GD32外部供电范围是2.63.6V,STM32外部供电范围是23.6V。GD的供电范围比STM32相对要窄一点。
内核电压:GD32内核电压是1.2V,STM32内核电压是1.8V。GD的内核电压比STM32的内核电压要低,所以GD的芯片在运行的时候运行功耗更低。

2.4.FLASH差异
GD32的Flash是自主研发的,和STM32的不一样。
GD Flash执行速度:GD32 Flash中程序执行为0等待周期。(?)
STM32 Flash执行速度:ST系统频率不访问flash等待时间关系:当0<SYSCLK<24MHz,0等待周期;当24MHz<SYSCLK≤48MHz,1等待周期;当48MHz<SYSCLK≤72MHz,等2待周期,。
Flash擦除时间:GD擦除的时间要久一点,官方给出的数据是这样的:GD32F103/101系列Flash 128KB 及以下的型号, Page Erase 典型值100ms, 实际测量60ms 左右。对应的ST 产品Page Erase 典型值 20~40ms。

2.5.功耗
相同主频情况下,GD的运行功耗比STM32小,但是在相同的设置下GD的停机模式、待机模式、睡眠模式比STM32还是要高的。
 图2 功耗表

2.6.串口
GD在连续发送数据的时候每两个字节之间会有一个Bit的Idle,而STM32没有,如下图。
 图3 串口数据位状态
GD的串口在发送的时候停止位只有1/2两种停止位模式,STM32有0.5/1/1.5/2四种停止位模式。GD和STM32 USART的这两个差异对通信基本没有影响,只是GD的通信时间会加长一点。

2.7.ADC差异
GD的输入阻抗和采样时间的设置和ST有一定差异,相同配置GD采样的输入阻抗相对来说要小。具体情况见下表这是跑在72M的主频下,ADC的采样时钟为14M的输入阻抗和采样周期的关系:
在这里插入图片描述
2.8.FSMC
STM32只有100Pin以上的大容量(256K及以上)才有FSMC,GD32所有的100Pin或100Pin以上的都有FSMC。

2.9.103系列RAM&FLASH大小差别
GD103系列和ST103系列的ram和flash对比如下图:
在这里插入图片描述
2.10.抗干扰能力
关于这一点,官方没有给出,我在网上查阅资料时,查阅到一个工程师在做项目的时候偶然发现GD的抗干扰能力不如STM32。项目原本是用STM32F103C8T6,后来换成GD F103C8T6,这两个芯片的引脚完全一致,然后单片机用了的两个邻近的引脚作为SPI的时钟引脚和数据输出引脚,然后发现STM32的SPI能正常通讯,GD的不行,经过检查发现PCB板SPI的铜线背面有两根IIC的铜线经过,信号应该是受到影响了。用示波器看了一下引脚的电平,发现确实是,STM32和GD的数据引脚波形都不正常,但是STM32的波形要好很多,波形虽然差了点,但是SPI通讯依然正常。而GD则不能正常通讯了。然后该工程师又把SPI的通讯速率减慢,发现STM32的数据引脚很快就恢复正常波形了,而GD的依然差,直到速率降到很低才恢复正常。初步怀疑是STM32内部对引脚有做一些滤波的电路,而GD则没有。

3.GD32替换STM32注意事项
GD32F103和STM32F103有很多地方是一致,但若想替换,软硬件更改点还是比较多的,下面依次阐述替换中需要注意的点。

3.1.硬件注意事项
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可能无法启动或工作异常。

3.2.软件注意事项
3.2.1.开发环境
目前公司用STM32F103软件开发软件为Eclipse,而GD32的开发软件是keil,代理商给的移植资料和网上可查询也都是基于keil开发软件进行移植的,用eclipse作为开发软件的参考资料尚未查询到。

3.2.2.所有模块的 GPIO 初始化部分。
GD相对于 ST系列最大的改动在 GPIO 部分,主要有以下三点:
1、GPIO 时钟总线配置区别。
之前 ST 系列的 GPIO ABCDF 都挂在了 APB2 总线上,而 GD 的 GPIO 口都挂在了 AHB 总线上,所以在打开 GPIO ABCDF 的时钟的时候就要注意,如下:
比如使能 GPIOA 时钟:
ST 下配置为:RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
GD 下需改为:RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA,ENABLE);
GPIOB、C、D、F 的时钟使能以此类推。
2、GPIO口复用配置区别。
GD 系列和 ST系列的 IO 口复用配置模式不同。具体对比说明如下:
比如 USART1 的 GPIO 口配置,可以映射到 PA9 和 PA10,也可以映射到 PB6 和 PB7。
(1)ST 配置 USART1 的 GPIO 口,大概过程如下(以 PA9 和 PA10 为例):
(2)首先使能 USART1、GPIOA 和 AFIO 的时钟。
在这里插入图片描述
(3) 然后配置 PA9 和 PA10 的模式。
在这里插入图片描述

(4)最后配置串口相应参数,这部分和 GD完全相同,就不列出来了。
(5)GD 配置 USART1 的 GPIO 口,大概过程如下(以 PA9 和 PA10 为例):
(6)首先使能 USART1、GPIOA 的时钟。
在这里插入图片描述
(7)然后配置 PA9 和 PA10 的模式。
如果将 USART1 映射到 PB6 和 PB7,则复用模式配置如下:
在这里插入图片描述
至于为什么 PA9、PA10 映射到 GPIO_AF_1,PB6 和 PB7 映射到 GPIO_AF_0,需要查看 GD的 datasheet,如下图:
在这里插入图片描述
3、GPIO口模式配置
ST系列的 GPIO 口有 8 种模式,如下图:
在这里插入图片描述
而 GD 系列的 GPIO 口配置在 ST 系列的基础上,按输入输出、推挽开漏、上拉下拉模式分成了三个结构体,相较 ST 系列而言,组合方式更加自由,如下图:
在这里插入图片描述
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP ;
GD 系列中,就变成了两条语句:
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_OType= GPIO_OType_PP;
又如:ST 系列配置某个 GPIO 口为下拉输入:
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD ;
GD 系列中,就变成了:
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN;

3.2.3.外设中断部分
GD 相对于 ST 系列增加了一些模块(如 SYSCFG、TSC、CEC 等),删减了一些模块(如GD只有一个 ADC、最多两路 DMA 等),因此 GD 的中断向量表的名称包括位置相对于 ST系列都有很大改变,很多客户都反映移植中经常遇到的问题就是无法进入中断。

3.2.4.外中断线 EXIT 部分
以配置 PB13 的下降沿中断为例:
ST 的配置如下:
EXTI_InitTypeDef EXTI_InitStructure;
GPIO_EXTILineConfig( GPIO_PortSourceGPIOB, GPIO_PinSource13 );
EXTI_ClearITPendingBit( EXTI_Line13 );
EXTI_InitStructure.EXTI_Line = EXTI_Line13;
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling ;
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure);
GD 的配置如下:
EXTI_InitTypeDef EXTI_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);
SYSCFG_EXTILineConfig( EXTI_PortSourceGPIOB, EXTI_PinSource13);
EXTI_ClearITPendingBit( EXTI_Line13 );
EXTI_InitStructure.EXTI_Line = EXTI_Line13;
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling ;
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure);

3.2.5.DMA模块
GD和 ST 相比,DMA 模块的配置上完全相同,唯一有区别的是外设的 DMA 通道可能略有差别。下面两张图对比了二者 DMA1 映射的区别:
在这里插入图片描述
在这里插入图片描述
DMA 模块的区别反映在软件代码是就是通道配置的区别,例如 USART1 的 Rx 在 ST 系列中在 DMA1 的通道 5,但是在 GD系列中,缺省模式下映射到 DMA1 的通道 3。如果使用USART1 的 DMA 接收方式,相关配置的修改如下:
ST 中:DMA_Init(DMA1_Channel5, &DMA_InitStructure);
DMA_Cmd(DMA1_Channel5, ENABLE);
GD 中:DMA_Init(DMA1_Channel3, &DMA_InitStructure);
DMA_Cmd(DMA1_Channel3, ENABLE);
以上只是常用的模块的软件移植说明,可能还不够全面,需要后续补充。

4.自测记录
1、硬件改动:仅将DIDO板上芯片stm32f103替换成gd32f103,其余外设无改动;
2、开发软件:Eclipse;
3、测试代码:外扩板工装代码;
4、测试外设:Uart、E2prom、Gpio、I2C、watchdag、adc和Can;
5、测试结果:除Can外,其外设可正常使用,但精度和其它细节仍需继续测试。
由于can不可正常使用,为了定位原因,模拟以下工况。
工况1:ST芯片和国产芯片互发数据。
(1)外扩板工装代码相同,can基础配置一致。
(2)测试结果:国产芯片和ST芯片,建立不起通讯关系,但国产芯片的can可以正产发出数据和收到数据,但ST无法接收到国产芯片传过来的数据。
在这里插入图片描述
图 11 国产芯片发送数据波形
在这里插入图片描述
图 12 国产芯片可以接收数据
(3)为了定位通讯不上原因,测试了ST和GD发送数据的波形。
在这里插入图片描述
图 13 国产芯片波特率
在这里插入图片描述
图 14 ST芯片波特率
can在相同配置下,国产芯片波特率为729.9K,ST芯片波特率为1M,定位原因是因国产芯片和ST芯片主频不一致导致波特率不相同,之后尝试了设置国产芯片和ST芯片波特率,让两者一致,但由于主频不一致,设置的波特率仍有差异,不能完全相同,最后仍未建立起通讯。
工况2:国产芯片和国产芯片互发数据。
(1)外扩板工装代码相同,can基础配置一致。
(2)测试结果:国产芯片和国产芯片,建立不起通讯关系,以下为测试波形。
在这里插入图片描述
图 15 国产收数据
在这里插入图片描述

图 16 国产发数据
波特率虽一致,但仍通讯不上,原因未定位。
数据会有错误!!!

在这里插入图片描述
在这里插入图片描述

工况3:控制器和国产芯片互发数据。
版本信息帧:
在这里插入图片描述
数据帧:
在这里插入图片描述
Runtime模式是可以通讯上的:
在这里插入图片描述
工况4:控制器和ST芯片互发数据。
版本信息帧:
在这里插入图片描述
数据帧:
在这里插入图片描述
工况4:bootloader程序下载不进去。
工况5:ST芯片发送版本信息帧。
软件配置版本:V003B000D000
在这里插入图片描述
回传版本:
在这里插入图片描述
硬件配置版本:0001A36X0001V40002
在这里插入图片描述
对比配置版本和已读回的版本:
在这里插入图片描述
工况6:波特率降至500k。
测试结果:不通过

工况7:修改通讯协议,降低发送速度
测试结果:不通过

工况8:在数据压进邮箱后,加了延迟。
在这里插入图片描述
测试结果:可以正常通讯。

工况9:判断邮箱不为空的标志。
在这里插入图片描述
测试结果:可以正常通讯。

测试结论:
GD的使用st的底层库较老,使用ST最新库时需更改can邮箱选择方式!!!

版权声明:本文为CSDN博主「Peanut」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/Peanut0729/article/details/117510495

           GD32F103和STM32F103区别介绍

关键词Key words:
GD32F103、STM32F103
摘要Abstract:
本文主要是GD32F103和STM32F103区别进行介绍。

                              目录
  1. 简介
  2. GD32和STM32的区别
    2.1. 内核
    2.2. 主频
    2.3. 供电
    2.4. FLASH差异
    2.5. 功耗
    2.6. 串口
    2.7. ADC差异
    2.8. FSMC
    2.9. 103系列RAM&FLASH大小差别
    2.10. 抗干扰能力
  3. GD32替换STM32注意事项
    3.1. 硬件注意事项
    3.2. 软件注意事项
  4. 自测记录

1.简介

  • GD32是国内开发的一款单片机,据说开发的人员是来自ST公司的,GD32也是以STM32作为模板做出来的,因此GD32和STM32有很多地方都是一样的,但是GD32和STM32毕竟是不同的产品,不可能将所有东西都沿用STM32的,有些自主开发的东西还是有区别的。相同的地方就不说了,下面我着重介绍一下GD32和STM32不同的地方。

2.GD32和STM32的区别
2.1.内核
GD32采用二代的M3内核,STM32主要采用一代M3内核,下图是ARM公司的M3内核勘误表,GD使用的内核只有752419这一个BUG。
图1 STM32F103勘误表
2.2.主频
使用HSE(高速外部时钟):GD32的主频最大108M,STM32的主频最大72M;
使用HSI(高速内部时钟):GD32的主频最大108M,STM32的主频最大64M;
主频大意味着单片机代码运行的速度会更快,项目中如果需要进行刷屏,开方运算,电机控制等操作,GD是一个不错的选择。

2.3.供电
外部供电:GD32外部供电范围是2.63.6V,STM32外部供电范围是23.6V。GD的供电范围比STM32相对要窄一点。
内核电压:GD32内核电压是1.2V,STM32内核电压是1.8V。GD的内核电压比STM32的内核电压要低,所以GD的芯片在运行的时候运行功耗更低。

2.4.FLASH差异
GD32的Flash是自主研发的,和STM32的不一样。
GD Flash执行速度:GD32 Flash中程序执行为0等待周期。(?)
STM32 Flash执行速度:ST系统频率不访问flash等待时间关系:当0<SYSCLK<24MHz,0等待周期;当24MHz<SYSCLK≤48MHz,1等待周期;当48MHz<SYSCLK≤72MHz,等2待周期,。
Flash擦除时间:GD擦除的时间要久一点,官方给出的数据是这样的:GD32F103/101系列Flash 128KB 及以下的型号, Page Erase 典型值100ms, 实际测量60ms 左右。对应的ST 产品Page Erase 典型值 20~40ms。

2.5.功耗
相同主频情况下,GD的运行功耗比STM32小,但是在相同的设置下GD的停机模式、待机模式、睡眠模式比STM32还是要高的。
 图2 功耗表

2.6.串口
GD在连续发送数据的时候每两个字节之间会有一个Bit的Idle,而STM32没有,如下图。
 图3 串口数据位状态
GD的串口在发送的时候停止位只有1/2两种停止位模式,STM32有0.5/1/1.5/2四种停止位模式。GD和STM32 USART的这两个差异对通信基本没有影响,只是GD的通信时间会加长一点。

2.7.ADC差异
GD的输入阻抗和采样时间的设置和ST有一定差异,相同配置GD采样的输入阻抗相对来说要小。具体情况见下表这是跑在72M的主频下,ADC的采样时钟为14M的输入阻抗和采样周期的关系:
在这里插入图片描述
2.8.FSMC
STM32只有100Pin以上的大容量(256K及以上)才有FSMC,GD32所有的100Pin或100Pin以上的都有FSMC。

2.9.103系列RAM&FLASH大小差别
GD103系列和ST103系列的ram和flash对比如下图:
在这里插入图片描述
2.10.抗干扰能力
关于这一点,官方没有给出,我在网上查阅资料时,查阅到一个工程师在做项目的时候偶然发现GD的抗干扰能力不如STM32。项目原本是用STM32F103C8T6,后来换成GD F103C8T6,这两个芯片的引脚完全一致,然后单片机用了的两个邻近的引脚作为SPI的时钟引脚和数据输出引脚,然后发现STM32的SPI能正常通讯,GD的不行,经过检查发现PCB板SPI的铜线背面有两根IIC的铜线经过,信号应该是受到影响了。用示波器看了一下引脚的电平,发现确实是,STM32和GD的数据引脚波形都不正常,但是STM32的波形要好很多,波形虽然差了点,但是SPI通讯依然正常。而GD则不能正常通讯了。然后该工程师又把SPI的通讯速率减慢,发现STM32的数据引脚很快就恢复正常波形了,而GD的依然差,直到速率降到很低才恢复正常。初步怀疑是STM32内部对引脚有做一些滤波的电路,而GD则没有。

3.GD32替换STM32注意事项
GD32F103和STM32F103有很多地方是一致,但若想替换,软硬件更改点还是比较多的,下面依次阐述替换中需要注意的点。

3.1.硬件注意事项
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可能无法启动或工作异常。

3.2.软件注意事项
3.2.1.开发环境
目前公司用STM32F103软件开发软件为Eclipse,而GD32的开发软件是keil,代理商给的移植资料和网上可查询也都是基于keil开发软件进行移植的,用eclipse作为开发软件的参考资料尚未查询到。

3.2.2.所有模块的 GPIO 初始化部分。
GD相对于 ST系列最大的改动在 GPIO 部分,主要有以下三点:
1、GPIO 时钟总线配置区别。
之前 ST 系列的 GPIO ABCDF 都挂在了 APB2 总线上,而 GD 的 GPIO 口都挂在了 AHB 总线上,所以在打开 GPIO ABCDF 的时钟的时候就要注意,如下:
比如使能 GPIOA 时钟:
ST 下配置为:RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
GD 下需改为:RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA,ENABLE);
GPIOB、C、D、F 的时钟使能以此类推。
2、GPIO口复用配置区别。
GD 系列和 ST系列的 IO 口复用配置模式不同。具体对比说明如下:
比如 USART1 的 GPIO 口配置,可以映射到 PA9 和 PA10,也可以映射到 PB6 和 PB7。
(1)ST 配置 USART1 的 GPIO 口,大概过程如下(以 PA9 和 PA10 为例):
(2)首先使能 USART1、GPIOA 和 AFIO 的时钟。
在这里插入图片描述
(3) 然后配置 PA9 和 PA10 的模式。
在这里插入图片描述

(4)最后配置串口相应参数,这部分和 GD完全相同,就不列出来了。
(5)GD 配置 USART1 的 GPIO 口,大概过程如下(以 PA9 和 PA10 为例):
(6)首先使能 USART1、GPIOA 的时钟。
在这里插入图片描述
(7)然后配置 PA9 和 PA10 的模式。
如果将 USART1 映射到 PB6 和 PB7,则复用模式配置如下:
在这里插入图片描述
至于为什么 PA9、PA10 映射到 GPIO_AF_1,PB6 和 PB7 映射到 GPIO_AF_0,需要查看 GD的 datasheet,如下图:
在这里插入图片描述
3、GPIO口模式配置
ST系列的 GPIO 口有 8 种模式,如下图:
在这里插入图片描述
而 GD 系列的 GPIO 口配置在 ST 系列的基础上,按输入输出、推挽开漏、上拉下拉模式分成了三个结构体,相较 ST 系列而言,组合方式更加自由,如下图:
在这里插入图片描述
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP ;
GD 系列中,就变成了两条语句:
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_OType= GPIO_OType_PP;
又如:ST 系列配置某个 GPIO 口为下拉输入:
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD ;
GD 系列中,就变成了:
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN;

3.2.3.外设中断部分
GD 相对于 ST 系列增加了一些模块(如 SYSCFG、TSC、CEC 等),删减了一些模块(如GD只有一个 ADC、最多两路 DMA 等),因此 GD 的中断向量表的名称包括位置相对于 ST系列都有很大改变,很多客户都反映移植中经常遇到的问题就是无法进入中断。

3.2.4.外中断线 EXIT 部分
以配置 PB13 的下降沿中断为例:
ST 的配置如下:
EXTI_InitTypeDef EXTI_InitStructure;
GPIO_EXTILineConfig( GPIO_PortSourceGPIOB, GPIO_PinSource13 );
EXTI_ClearITPendingBit( EXTI_Line13 );
EXTI_InitStructure.EXTI_Line = EXTI_Line13;
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling ;
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure);
GD 的配置如下:
EXTI_InitTypeDef EXTI_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);
SYSCFG_EXTILineConfig( EXTI_PortSourceGPIOB, EXTI_PinSource13);
EXTI_ClearITPendingBit( EXTI_Line13 );
EXTI_InitStructure.EXTI_Line = EXTI_Line13;
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling ;
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure);

3.2.5.DMA模块
GD和 ST 相比,DMA 模块的配置上完全相同,唯一有区别的是外设的 DMA 通道可能略有差别。下面两张图对比了二者 DMA1 映射的区别:
在这里插入图片描述
在这里插入图片描述
DMA 模块的区别反映在软件代码是就是通道配置的区别,例如 USART1 的 Rx 在 ST 系列中在 DMA1 的通道 5,但是在 GD系列中,缺省模式下映射到 DMA1 的通道 3。如果使用USART1 的 DMA 接收方式,相关配置的修改如下:
ST 中:DMA_Init(DMA1_Channel5, &DMA_InitStructure);
DMA_Cmd(DMA1_Channel5, ENABLE);
GD 中:DMA_Init(DMA1_Channel3, &DMA_InitStructure);
DMA_Cmd(DMA1_Channel3, ENABLE);
以上只是常用的模块的软件移植说明,可能还不够全面,需要后续补充。

4.自测记录
1、硬件改动:仅将DIDO板上芯片stm32f103替换成gd32f103,其余外设无改动;
2、开发软件:Eclipse;
3、测试代码:外扩板工装代码;
4、测试外设:Uart、E2prom、Gpio、I2C、watchdag、adc和Can;
5、测试结果:除Can外,其外设可正常使用,但精度和其它细节仍需继续测试。
由于can不可正常使用,为了定位原因,模拟以下工况。
工况1:ST芯片和国产芯片互发数据。
(1)外扩板工装代码相同,can基础配置一致。
(2)测试结果:国产芯片和ST芯片,建立不起通讯关系,但国产芯片的can可以正产发出数据和收到数据,但ST无法接收到国产芯片传过来的数据。
在这里插入图片描述
图 11 国产芯片发送数据波形
在这里插入图片描述
图 12 国产芯片可以接收数据
(3)为了定位通讯不上原因,测试了ST和GD发送数据的波形。
在这里插入图片描述
图 13 国产芯片波特率
在这里插入图片描述
图 14 ST芯片波特率
can在相同配置下,国产芯片波特率为729.9K,ST芯片波特率为1M,定位原因是因国产芯片和ST芯片主频不一致导致波特率不相同,之后尝试了设置国产芯片和ST芯片波特率,让两者一致,但由于主频不一致,设置的波特率仍有差异,不能完全相同,最后仍未建立起通讯。
工况2:国产芯片和国产芯片互发数据。
(1)外扩板工装代码相同,can基础配置一致。
(2)测试结果:国产芯片和国产芯片,建立不起通讯关系,以下为测试波形。
在这里插入图片描述
图 15 国产收数据
在这里插入图片描述

图 16 国产发数据
波特率虽一致,但仍通讯不上,原因未定位。
数据会有错误!!!

在这里插入图片描述
在这里插入图片描述

工况3:控制器和国产芯片互发数据。
版本信息帧:
在这里插入图片描述
数据帧:
在这里插入图片描述
Runtime模式是可以通讯上的:
在这里插入图片描述
工况4:控制器和ST芯片互发数据。
版本信息帧:
在这里插入图片描述
数据帧:
在这里插入图片描述
工况4:bootloader程序下载不进去。
工况5:ST芯片发送版本信息帧。
软件配置版本:V003B000D000
在这里插入图片描述
回传版本:
在这里插入图片描述
硬件配置版本:0001A36X0001V40002
在这里插入图片描述
对比配置版本和已读回的版本:
在这里插入图片描述
工况6:波特率降至500k。
测试结果:不通过

工况7:修改通讯协议,降低发送速度
测试结果:不通过

工况8:在数据压进邮箱后,加了延迟。
在这里插入图片描述
测试结果:可以正常通讯。

工况9:判断邮箱不为空的标志。
在这里插入图片描述
测试结果:可以正常通讯。

测试结论:
GD的使用st的底层库较老,使用ST最新库时需更改can邮箱选择方式!!!

版权声明:本文为CSDN博主「Peanut」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/Peanut0729/article/details/117510495

生成海报
点赞 0

Peanut

我还没有学会写个人说明!

暂无评论

相关推荐