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

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

[复制链接]
STMCU小助手 发布时间:2022-3-13 20:59
RX~WTV4QSKH22CRIF5GV7AU.png
7 l2 C, o, L7 W
GD32F103是GD早期的产品,GD32E103和GD32F303是对GD32F103的升级和优化,所以4者是兼容的。虽然内核不同,但是通用外设几乎很少涉及到内核部分,在时间急迫的情况下可以使用ST的库开发。
  I: a+ N" C& W9 u$ C4 s
' S" h, V0 ~4 v' K
一、相同点
9 y5 Z1 v# \. d: r. Z+ C8 M" y
1)外围引脚PIN TO PIN兼容,每个引脚上的复用功能也完全相同。
$ x4 L1 ]5 u9 `+ H
2)芯片内部寄存器、外部IP寄存器地址和逻辑地址完全相同,但是有些寄存器默认值不同,有些外设模块的设计时序上和STM32有差异,这点差异主要体现在软件上修改,详情见下文。

' b6 a& N$ C3 o2 J3)编译工具:完全相同,例如KEIL 、IAR。

5 K) C& w* B" L5 u9 j4)型号命名方式完全相同,所以替代只需找尾缀相同的型号即可,例如:STM32F103C8T6 与 GD32E103C8T6。

# [2 Z" [# D. `0 k5 l5)仿真工具:JLINK GDLINK

+ r) ]) s  Z5 Z! o2 W( O
二、外围硬件区别

9 i, `) m4 b$ N- g- c% n3 f( ?, c
C7U~TXOD)U@L$D)H$PW(ZZM.png

# z  C: I$ `$ V) y( H三、硬件替换需要注意的地方

) w+ W2 z; @, s1 Q& ?0 W& Y+ s
从以上介绍可以看出,GD32F30/E103系列和STM32F103系列是兼容的,但也需要一些注意的地方。
* x9 u  y8 D; t3 g- \
1)BOOT0必须接10K下拉或接GND,ST可悬空,这点很重要。

  M  V- y! o- G6 s5 i2)RC复位电路必须要有,否则MCU可能不能正常工作,ST的有时候可以不要。
/ v; Z/ H) b! w# l
3)有时候发现用仿真器连接不上。因为GD的swd接口驱动能力比ST弱,可以有如下几种方式解决:
4 @! c' ^: C1 d) b, L4 {& I
  • 线尽可能短一些
  • 降低SWD通讯速率
  • SWDIO接10k上拉,SWCLK接10k下拉
    * A- y$ ^' t6 i% `2 d& }9 P4 C  U
    ! x) m9 C- Y$ e
+ ?  y$ V' V) F1 ^) F# {
4)使用电池供电等,注意GD的工作电压,例如跌落到2.0V~2.6V区间,ST还能工作,GD可能无法启动或工作异常。
! ^/ Z& Z( j8 q! Q+ C
四、使用ST标准库开发需要修改的地方
5 k& L/ D; g3 b
1)GD对时序要求严格,配置外设需要先打开时钟,在进行外设配置,否则可能导致外设无法配置成功;ST的可以先配置在开时钟。

/ I3 h/ n8 S2 @  T2 V
2)修改外部晶振起振超时时间,不用外部晶振可跳过这步。$ V7 i: l, g. ~
+ g8 g* V6 F2 G4 F7 ~
原因:GD与ST的启动时间存在差异,为了让GD MCU更准确复位。

! V" U$ F- F$ Z5 y( _4 S* f: J
修改:
将宏定义:#define HSE_STARTUP_TIMEOUT ((uint16_t)0x0500)修改为:#define HSE_STARTUP_TIMEOUT ((uint16_t)0xFFFF)修改为:8 ~% K6 f' a1 l/ i- d1 m# z
#define HSE_STARTUP_TIMEOUT ((uint16_t)0xFFFF)
6 N5 n: h( l) D1 \7 N2 v8 d% z$ o0 O2 u+ g
$ O# a% D$ q! U* I2 u: T" p' Y
3)GD32F10X flash取值零等待,而ST需要2个等待周期,因此,一些精确延时或者模拟IIC或SPI的代码可能需要修改。
) _/ M& v0 @/ n  ?, v
原因:GD32采用专利技术提高了相同工作频率下的代码执行速度。
: B6 ], _$ f9 G
修改:如果使用for或while循环做精确定时的,定时会由于代码执行速度加快而使循环的时间变短,因此需要仿真重新计算设计延时。使用Timer定时器无影响。

+ J0 J3 U0 i0 z0 L) G6 n8 _
4)在代码中设置读保护,如果使用外部工具读保护比如JFLASH或脱机烧录器设置,可跳过此步骤。
在写完KEY序列后,需要读该位确认key已生效,修改如下:
9 `9 J# l; Y" U1 D
@AR(0%J]R1@E8KF3Q@`5L(J.png

+ n8 W) U% \5 M: q" i$ q6 y8 g; l总共需要修改如下四个函数:
  1. FLASH_Status FLASH_EraseOptionBytes(void);
    # \$ A& x- ?' N2 \% d) a/ W
  2. FLASH_Status FLASH_ProgramOptionByteData(uint32_t Address, uint8_t Data);
    & y! I/ |( J8 y" H! n
  3. uint32_t FLASH_GetWriteProtectionOptionByte(void);
    ) B* ~# s2 [7 f
  4. FlagStatus FLASH_GetReadOutProtectionStatus(void);
复制代码
' F- V6 c! K; A1 U
5)GD与ST在flash的Erase和Program时间上有差异,修改如下:
# \( }* n' f9 _* |
_BK{32ZPJUG7NN4%2)0NUIK.png
( |0 K/ `% r' y: j
6)需求flash大于256K注意,小于256K可以忽略这项。

) y) F+ b- `# D3 u3 y
与ST不同,GD的flash存在分区的概念,前256K,CPU执行指令零等待,称code区,此范围外称为dataZ区。
4 b' X3 z$ \+ v) r
两者在擦写操作上没有区别,但在读操作时间上存在较大差别,code区代码取值零等待,data区执行代码有较大延迟,代码执行效率比code区慢一个数量级,因此data区通常不建议运行对实时性要求高的代码。
/ X4 n7 P6 \& U- w0 I7 ?
为解决这个问题,可以使用分散加载的方法,比如把初始化代码,图片代码等放到data区。

7 q7 T+ {+ X! G  s! C
总结:至此,经过以上修改,在不使用USB和网络能复杂协议的代码,就可以使用ST的代码操作了。
, F  _+ W# e; }

! [* r. i1 H6 t' E) W1 J% G' C; W' I. R" ~$ e& A
收藏 评论0 发布时间:2022-3-13 20:59

举报

0个回答

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版