发新帖本帖赏金 10.00元(功能说明)我要提问
返回列表
打印

STM32F0->GD32E230代码移植,非直接烧录

[复制链接]
3312|20
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 呐咯密密 于 2020-12-23 09:18 编辑

#申请原创#
ST的价格和交期不用多说,大家都明白,在产品中大量使用ST的芯片的公司都在寻找国产替代的出路。我们的产品追求的的是MCU的串口相应速度,在网友的使用评价和我们针对性测试之后,GD32最终被定为最优的产品,不仅性能符合要求,价格也是十分便宜,用来替换ST最好不过了。项目的初期,我们和GD的代理进行了面对面的交流,他们推介通过修改相关寄存器直接烧录ST的代码,但是我们实测并不理想。于是在他们的配合下成功使用GD自带的固件库替换掉了ST的芯片。产品实测无任何问题,甚至由于GD更高的主频,运行效果远超预期!国产芯片,未来可期!
下面就进行ST对GD的代码移植:
区别:
GD32E230 对比 STM32F030 有着很好的兼容性和更高的性价比,内核和外设都有所增强。
STM32F030 与 GD32E230 在相同封装下是 Pin To Pin 兼容的。 外设上本人觉得 GD32E230
功能覆盖 STM32F030,大部分外设 GD32E230 完全兼容 STM32F030, 后文我会具体介绍。 需要
注意: STM32F030 外设编号从 1 开始, GD32E103 外设编号从 0 开始,且命名有差异。 这里介绍了STM32F030 系列和 GD32E230 系列内部资源对比总览
  
  
因为GD在主频上高于ST,所以在使用直接烧录的方式移植时会出现延时不同等问题,这也是我不采用此方法的原因,不如直接重写代码。
我们可以从最常用的开始,因为时间原因,不可能全部的函数都移植,这里介绍最常用的。
GPIO:
例如我们使用STM32 USART1前需要初始化相关的IO操作:


我们需要对GPIO的时钟进行初始化,然后定义端口的复用模式,然后设置PA9,PA10的IO模式速度等参数。因为使用了RS485,还要对使能口进行设置,这一点在GD上同样需要进行。

只不过相对于ST的库函数,GD的更加简洁,因为GD的库函数的集成度更高,使用起来更加方便快捷。
代码的最后两行应该是设置端口的输出高低电平,我采用了寄存器的方式。加快代码运行速度。
原型是:gpio_bit_set(uint32_t gpio_periph,uint32_t pin);
             gpio_bit_reset(uint32_t gpio_periph,uint32_t pin);
串口:
GPIO初始化完成之后我们需要配置串口:

这里大家都知道的,配置串口的时钟,波特率,起始位,停止位,数据位。这一点在GD上面同样的体现模式:

可以看得到的是代码的简洁程度是不同的,GD的外设配置和ST的HAL库有些类似,精简了代码量,但是设置的东西还是一样的。
设置完成后就可以使用库函数的发送和接收函数:


需要提的一点是,串口发送完成的判断应该使用while(RESET == usart_flag_get(USART0, USART_FLAG_TC));我在这里卡住过,这个是最优的方式。
接收函数的代码执行效率着实不高。我使用的是直接操作寄存器,有需要的可以借鉴一下。

如果需要使用串口中断,直接调用一下几个函数:
nvic_irq_enable(USART0_IRQn, 0);
usart_interrupt_enable(USART0, USART_INT_RBNE);
先到这里,会跟进。
从STM32F030移植到GD32E230的手册见附件(直接烧录)
GD32E230的固件库中文版见附件@21小跑堂
从STM32F030移植到GD32E230(1)(2).pdf (511.14 KB)


GD32E230_gujiankuyonghuzhinan_V1.0.pdf (9.1 MB)


使用特权

评论回复

打赏榜单

21小跑堂 打赏了 10.00 元 2021-01-04
理由:恭喜通过原创文章审核!请多多加油哦!

沙发
zhcj66| | 2020-12-22 21:37 | 只看该作者
楼主对比手册哪里下载的,我需要f103的

使用特权

评论回复
评论
呐咯密密 2020-12-23 16:03 回复TA
@zhcj66 :就是南京的商络这家代理,如果你的量大,他们的服务超级好,全程跟踪,在线解决。还可以帮你写驱动 
zhcj66 2020-12-23 15:34 回复TA
@呐咯密密 :你用的是深圳的还是哪里的代理,我找了一个叫阿威的 回复速度太慢了 
呐咯密密 2020-12-23 13:54 回复TA
@zhcj66 :南京商络 
zhcj66 2020-12-23 13:39 回复TA
@呐咯密密 :你用的哪家代理 
呐咯密密 2020-12-23 09:19 回复TA
对比手册是GD的代理提供的。 
板凳
pattywu| | 2020-12-23 04:26 | 只看该作者
需要回复才能看,就没意思了

使用特权

评论回复
评论
呐咯密密 2020-12-23 09:18 回复TA
不好意思,我放开哈 
地板
gxp6604| | 2020-12-23 09:17 | 只看该作者
666666

使用特权

评论回复
5
呐咯密密|  楼主 | 2020-12-24 10:03 | 只看该作者
#申请原创# 使用USART就必须要说一下USART的DMA功能。

这里使用了SYSCFG_DMAChannelRemapConfig()函数,因为我的DMA通道二被SPI给占用了,所以这里需要将DMA串口发送从通道2重映射到通道4,但是在使用该函数之前必须调用RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE); 使能SYSCFG时钟。否则无法完成重映射。
使用DMA的发送时需要先失能DMA通道,然后重新设定传输的数据长度,再重新使能DMA的通道。同样的原因,为了追求最快的响应速度,这里使用直接操作寄存器,被屏蔽的部分是使用库函数,在场景要求不高的情况下可直接调用库函数。
GD32

同样是通道占用,也需要对通道进行重定向。其他的一些设置参数差不多,对比就可发现异同。

然后就是失能DMA通道,设定要发送的内存地址和字节数,使能通道。
但是有一点需要注意,在调用此函数时肯定要判断数据是否发送完成,这里我踩雷了,到底用哪个标志位判断。
在和GD的代理沟通的过程中他们让我使用DMA_FLAG_FTF和忙标志都不行,最后采用
while(RESET == usart_flag_get(USART0, USART_FLAG_TC));
完美解决,其他的总是会出现一些问题,这里给大家分享一下。@21小跑堂


使用特权

评论回复
6
xzhiwei| | 2020-12-30 16:33 | 只看该作者
官方的例程 5.25无法编译 这是**不

使用特权

评论回复
评论
呐咯密密 2020-12-30 16:39 回复TA
报错能截图看看不,原因很多,具体分析。我也遇到过无法编译的错误 
7
hui223| | 2021-1-3 14:51 | 只看该作者
GD32資料下載地址
http://www.gd32mcu.com/cn/download?kw=

使用特权

评论回复
8
萝卜头008| | 2021-1-4 09:58 | 只看该作者
据说GD系列的CAN接口有问题,没用过不清楚,如果用到要小心

使用特权

评论回复
9
iamdair| | 2021-1-5 15:56 | 只看该作者
国产的机会来了

使用特权

评论回复
评论
呐咯密密 2021-1-5 16:01 回复TA
半导体股票都涨疯了 
10
3htech| | 2021-1-19 10:39 | 只看该作者
正在学习移植,多谢热心的同行!

使用特权

评论回复
11
huangalan| | 2021-1-23 15:23 | 只看该作者
学习了

使用特权

评论回复
12
nipperhu| | 2021-5-8 08:50 | 只看该作者
有问题可以和我进行沟通 GD代理 胡工 13825615011 微信同号

使用特权

评论回复
13
chenyelong| | 2021-5-8 17:49 | 只看该作者
gd现在也是天价了

使用特权

评论回复
发新帖 本帖赏金 10.00元(功能说明)我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

认证:苏州澜宭自动化科技嵌入式工程师
简介:本人从事磁编码器研发工作,负责开发2500线增量式磁编码器以及17位、23位绝对值式磁编码器,拥有多年嵌入式开发经验,精通STM32、GD32、N32等多种品牌单片机,熟练使用单片机各种外设。

483

主题

3815

帖子

47

粉丝