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

ST对GD的代码移植

[复制链接]
gaosmile 发布时间:2021-1-13 11:19
ST的价格和交期不用多说,大家都明白,在产品中大量使用ST的芯片的公司都在寻找国产替代的出路。我们的产品追求的的是MCU的串口相应速度,在网友的使用评价和我们针对性测试之后,GD32最终被定为最优的产品,不仅性能符合要求,价格也是十分便宜,用来替换ST最好不过了。项目的初期,我们和GD的代理进行了面对面的交流,他们推介通过修改相关寄存器直接烧录ST的代码,但是我们实测并不理想。于是在他们的配合下成功使用GD自带的固件库替换掉了ST的芯片。产品实测无任何问题,甚至由于GD更高的主频,运行效果远超预期!国产芯片,未来可期!

0 _, W5 c- H) A: O' j- J
下面就进行ST对GD的代码移植:
( Z  d( Y# k" L0 Q
区别:GD32E230 对比 STM32F030 有着很好的兼容性和更高的性价比,内核和外设都有所增强。

$ f3 {5 P7 M3 B6 F+ F( o1 @
STM32F030 与 GD32E230 在相同封装下是 Pin To Pin 兼容的。 外设上本人觉得 GD32E230功能覆盖 STM32F030,大部分外设 GD32E230 完全兼容 STM32F030, 后文我会具体介绍。
8 t3 h2 T) P4 o9 M% `
需要注意: STM32F030 外设编号从 1 开始, GD32E103 外设编号从 0 开始,且命名有差异。 这里介绍了STM32F030 系列和 GD32E230 系列内部资源对比总览  + ]0 ]6 I# z. ?- K* X3 O; D! N
   
微信图片_20210113111655.png
) ~) r" U% m) V- R5 G; @因为GD在主频上高于ST,所以在使用直接烧录的方式移植时会出现延时不同等问题,这也是我不采用此方法的原因,不如直接重写代码。

3 \- v3 u. B) v$ P/ l
我们可以从最常用的开始,因为时间原因,不可能全部的函数都移植,这里介绍最常用的。

7 U2 ?& v! Z: X) l1 ]% j8 {
GPIO:例如我们使用STM32 USART1前需要初始化相关的IO操作:, |; S2 c3 n' M8 a' E% X- R

- p1 K1 ^+ Y3 ?6 Z! N1 z
微信图片_20210113111659.png
9 ^9 g1 I9 n6 Y: |5 U. z
& L- h) Q+ g6 R# F) L; X! d) E
我们需要对GPIO的时钟进行初始化,然后定义端口的复用模式,然后设置PA9,PA10的IO模式速度等参数。因为使用了RS485,还要对使能口进行设置,这一点在GD上同样需要进行。
4 ]+ F$ y' N( A/ w* o
微信图片_20210113111702.png
5 J. A$ m4 B* z) F% O$ ?9 B- ?. E6 y% e
只不过相对于ST的库函数,GD的更加简洁,因为GD的库函数的集成度更高,使用起来更加方便快捷。

" J& c- g; k5 z4 e% [& ~, a
代码的最后两行应该是设置端口的输出高低电平,我采用了寄存器的方式。加快代码运行速度。

2 U# Z# u; f9 t# L# k, I
原型是:gpio_bit_set(uint32_t gpio_periph,uint32_t pin);9 w5 s7 ~8 o; z$ q' T9 g
             gpio_bit_reset(uint32_t gpio_periph,uint32_t pin);
- Z9 S2 r4 f4 K: z) P

. T# d' N: K; {8 n1 N5 u
串口:GPIO初始化完成之后我们需要配置串口:

% {3 z5 e( ^) ~- P8 G( g, \
微信图片_20210113111705.png * ~* v1 K6 X9 P/ a( \$ |! [; B6 e
这里大家都知道的,配置串口的时钟,波特率,起始位,停止位,数据位。这一点在GD上面同样的体现模式:
6 S7 W$ \/ Y6 B9 v
微信图片_20210113111709.png 3 L! d8 X" d" v  v; c
可以看得到的是代码的简洁程度是不同的,GD的外设配置和ST的HAL库有些类似,精简了代码量,但是设置的东西还是一样的。
4 M% c7 W) E( v. E  ]
设置完成后就可以使用库函数的发送和接收函数:

" s, X' x6 K* d: g2 s
微信图片_20210113111712.png
6 L% ?8 _8 F$ V  w) ^4 r2 c' V
微信图片_20210113111715.png ' F- s7 N5 H" a* r
需要提的一点是,串口发送完成的判断应该使用while(RESET == usart_flag_get(USART0, USART_FLAG_TC));我在这里卡住过,这个是最优的方式。

, |- i; g' h% f
接收函数的代码执行效率着实不高。我使用的是直接操作寄存器,有需要的可以借鉴一下。

" j4 h- l- n1 d& K, p
微信图片_20210113111718.png
: A0 K, V4 C% @% O9 y! G, [# m: l
如果需要使用串口中断,直接调用一下几个函数:

/ t2 q! F( A1 O/ t3 H
nvic_irq_enable(USART0_IRQn, 0);
8 p( x; ~+ L! `7 ]) c( R
usart_interrupt_enable(USART0, USART_INT_RBNE);

' U& u& R/ ^3 V5 z+ `) j
先到这里,会跟进。
0 t; Y% m0 e9 i$ a
赞 收藏 评论0 发布时间:2021-1-13 11:19

举报

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