你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【经验分享】GD32如何替换STM32?

[复制链接]
STMCU小助手 发布时间:2022-3-13 20:59
RX~WTV4QSKH22CRIF5GV7AU.png

! t" ~) @3 m2 ]5 d$ g3 Q' F: DGD32F103是GD早期的产品,GD32E103和GD32F303是对GD32F103的升级和优化,所以4者是兼容的。虽然内核不同,但是通用外设几乎很少涉及到内核部分,在时间急迫的情况下可以使用ST的库开发。
2 Z/ v! v" {! Y5 R
& N- d% r+ j( l5 E
一、相同点

& H! r( E  ?8 R) o& f- P
1)外围引脚PIN TO PIN兼容,每个引脚上的复用功能也完全相同。
  j- q( A4 r  S# J- ~2 p5 }
2)芯片内部寄存器、外部IP寄存器地址和逻辑地址完全相同,但是有些寄存器默认值不同,有些外设模块的设计时序上和STM32有差异,这点差异主要体现在软件上修改,详情见下文。
' F. t/ h" }0 G& g$ I% d
3)编译工具:完全相同,例如KEIL 、IAR。
, w* s& A% F* P* r* e0 v: v2 K
4)型号命名方式完全相同,所以替代只需找尾缀相同的型号即可,例如:STM32F103C8T6 与 GD32E103C8T6。
& w1 A. o2 u; _2 \7 g+ P" c- m
5)仿真工具:JLINK GDLINK

5 ~( P% ]" @" e+ e2 B
二、外围硬件区别

7 C1 B9 ?- }" Y. p8 c2 B. k
C7U~TXOD)U@L$D)H$PW(ZZM.png
8 E8 U0 k% I6 H% Z) h$ m+ R+ z
三、硬件替换需要注意的地方
) G5 m1 Z9 |' q. \. g
从以上介绍可以看出,GD32F30/E103系列和STM32F103系列是兼容的,但也需要一些注意的地方。
  \" M1 M5 t6 u1 X9 G
1)BOOT0必须接10K下拉或接GND,ST可悬空,这点很重要。
( n  ^: [2 U, u  R6 i. }% z
2)RC复位电路必须要有,否则MCU可能不能正常工作,ST的有时候可以不要。
+ T/ K+ C& W/ G. a4 @% v
3)有时候发现用仿真器连接不上。因为GD的swd接口驱动能力比ST弱,可以有如下几种方式解决:
& }, j7 _, w8 P
  • 线尽可能短一些
  • 降低SWD通讯速率
  • SWDIO接10k上拉,SWCLK接10k下拉

    " d/ l$ T4 x+ F2 ^
    % t9 v. y$ |+ c' ?& a  Z

4 k) X. }9 U: f4)使用电池供电等,注意GD的工作电压,例如跌落到2.0V~2.6V区间,ST还能工作,GD可能无法启动或工作异常。
2 U. D. a8 ^& r1 Z( e! a6 H% v
四、使用ST标准库开发需要修改的地方
+ j* ^- D0 V7 t
1)GD对时序要求严格,配置外设需要先打开时钟,在进行外设配置,否则可能导致外设无法配置成功;ST的可以先配置在开时钟。
, \2 w1 H' j) f' n* h
2)修改外部晶振起振超时时间,不用外部晶振可跳过这步。
" K! ^3 o3 l( w) v
  |/ g2 j( I( V. d, k+ l
原因:GD与ST的启动时间存在差异,为了让GD MCU更准确复位。
* g  n/ U+ U# r* N6 h& v. V
修改:
将宏定义:#define HSE_STARTUP_TIMEOUT ((uint16_t)0x0500)修改为:#define HSE_STARTUP_TIMEOUT ((uint16_t)0xFFFF)修改为:/ m4 \( _3 Q( T6 T% n, A
#define HSE_STARTUP_TIMEOUT ((uint16_t)0xFFFF)
6 |* z1 w; _7 n+ x8 b, d
9 X9 v* w# v2 @, u9 _# v

* d( o  A4 ]; m3 j! p
3)GD32F10X flash取值零等待,而ST需要2个等待周期,因此,一些精确延时或者模拟IIC或SPI的代码可能需要修改。

3 e7 S. [. j% f  N( P
原因:GD32采用专利技术提高了相同工作频率下的代码执行速度。
. ~4 a: O( q( K1 ?; s+ Z* E
修改:如果使用for或while循环做精确定时的,定时会由于代码执行速度加快而使循环的时间变短,因此需要仿真重新计算设计延时。使用Timer定时器无影响。
( K) J$ P$ ^6 f# c; J1 L& x
4)在代码中设置读保护,如果使用外部工具读保护比如JFLASH或脱机烧录器设置,可跳过此步骤。
在写完KEY序列后,需要读该位确认key已生效,修改如下:

% J0 f) u8 `" }, |9 I
@AR(0%J]R1@E8KF3Q@`5L(J.png

* {9 W+ ?9 H! B6 Z6 |! M8 e总共需要修改如下四个函数:
  1. FLASH_Status FLASH_EraseOptionBytes(void);4 F% I; @' O* |: v
  2. FLASH_Status FLASH_ProgramOptionByteData(uint32_t Address, uint8_t Data);
    $ S. P# N' V$ \8 m
  3. uint32_t FLASH_GetWriteProtectionOptionByte(void);
    4 z: r( v& x( O, i$ h
  4. FlagStatus FLASH_GetReadOutProtectionStatus(void);
复制代码
/ ?( @7 x, l3 z+ W$ w
5)GD与ST在flash的Erase和Program时间上有差异,修改如下:
8 d$ N  z; n) B  B
_BK{32ZPJUG7NN4%2)0NUIK.png
1 E/ u( ~+ Z& \
6)需求flash大于256K注意,小于256K可以忽略这项。
+ u; s# B- g8 C
与ST不同,GD的flash存在分区的概念,前256K,CPU执行指令零等待,称code区,此范围外称为dataZ区。
# E  k8 x  z  }* ^; L# R$ W
两者在擦写操作上没有区别,但在读操作时间上存在较大差别,code区代码取值零等待,data区执行代码有较大延迟,代码执行效率比code区慢一个数量级,因此data区通常不建议运行对实时性要求高的代码。
  _+ |- G$ Z7 r
为解决这个问题,可以使用分散加载的方法,比如把初始化代码,图片代码等放到data区。
  f8 }5 q$ q! b8 v3 ~! J0 k0 U- R
总结:至此,经过以上修改,在不使用USB和网络能复杂协议的代码,就可以使用ST的代码操作了。
8 p5 G) _7 X8 K# J( b

9 ]+ n9 {0 G6 [' b# y" \, P  @* s( z  u* t1 t3 N* \* L
赞 收藏 评论0 发布时间:2022-3-13 20:59

举报

0个回答

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版