打印

国产MCU之光 第51期: GD32项目开发过程中的问题解决过程及经验分享

[复制链接]
5586|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
   
*阅读说明:详细过程及源码资料等请戳原链接查看


最近一个项目需要测量海拔高度,在淘宝上买了一个气压高度计模块,到货后自己把排针焊上,准备测试。
之前已经在用GD32303C-EVAL开发板在做其他相关的开发工作了,包括屏幕显示、串口中断收发等功能,都是用的官方例程进行组合,然后做相应改动来进行的。
首先用官方的屏显例程,理解例程里的显示接口,根据需要修改成自己的显示内容;然后将串口中断收发例程融合进去,并自己添加了串口接收环形缓冲区功能。并成功将串口接收到的内容显示到屏幕上。
下一步开始的工作就是I2C接口驱动的移植,这里使用I2C_EEPROM例程进行融合,然后修改芯片地址即可(开发板上的EEPROM芯片是AT24Cxx,地址是0xA0,我手上的MPL3115A2气压计芯片地址是0xC0),可直接使用开发板上的I2C引脚,并且不需要将EEPROM芯片断开,通过地址即可进行选择读取。
在进行了一系列的融合与地址修改之后,并编写了MPL芯片的初始化程序,编译,通过,下载,运行,发现死机了……



使用GD32303C-EVAL开发板和MPL3115A2模块测量气压或高度数据,两者间使用硬件I2C进行通讯。
上次调试发现官方例程(单一I2C读写功能)可以正常读写MPL芯片的寄存器,而我建立的由官方例程融合(多个功能模块组合)的工程无法正常读写,会造成程序卡死在一个地方。
上次定位到了I2C异常的原因是屏幕初始化函数exmc_lcd_init()导致的。
为了再次确认确实是这个函数导致的问题,再进行一次反向验证:在有问题的工程里,将I2C的操作地址修改为0xA0(EEPROM的操作地址),进行同样的验证。
验证结果一致,即注释掉屏幕初始化函数exmc_lcd_init()即可正常读写,加上这个函数就会出问题。
由此,已经从各方面印证了问题就是出在屏幕初始化函数exmc_lcd_init()这里。
那么这个函数里都有什么呢?
…………
至此,硬件I2C读写异常问题完美解决。
导致问题出现的原因是开发板在不同模块的例程上都用到了PB7,从而导致两个功能无法同时使用。
进行引脚功能remap即可解决该问题。



本文使用GD32F103微控制,进行C++程序的开发测试,遇到一些问题特地分享。Keil5更新之后,开始支持ARM V6编译器,新版本的编译器对C++有了更多的支持,已经支持到了C++17。
以建立一个led闪烁的工程为例,说明注意事项。



考虑国产替代试一下,正好有个新项目进行,就采购一批GD32F103CBT6回来试一下,
官方手册上说,BOOT0和BOOT1引脚必须接下拉,不能悬空。这里可能和ST稍有差别。实物图如下:
板子焊好之后,到官网下载例程包,
开始程序编辑,我使用的是keil v5。
打开程序后,提醒没有PACK包,找到PACK包进行安装,发现例程选择的芯片不对,重新选择芯片。
选择GD32F103CB型号。
编译一下例程,看能不能通过,发现很多错误,后面找到原因知道是keil的版本问题和一个宏定义重复导致。
…………



把USB转CANFD产品资料打包发送给大家分享,主要包括:产品逻辑图,PCB印制板图、ISP装载文件和产品说明书。
经验1:关于开发板
经验2:关于GD32E103TBU6
经验3:关于USB接口的D+连线上的上拉电阻
经验4:关于全速USB接口速率
经验5:用ISP重新装载应用
经验6:关于GD库函数(很重要)
经验7:关于串口调试工具
经验8:(虚拟串口)USB转CANFD性能测试
经验9:晶体的选择






使用特权

评论回复
沙发
cooldog123pp| | 2023-5-27 10:13 | 只看该作者
楼主讲的很详细,非常感谢楼主的讲解,mark一下,收藏学习,受教受教。

使用特权

评论回复
板凳
lulugo| | 2023-5-31 16:49 | 只看该作者
安富莱电子的H7-TOOL可以仿真烧录兆易创新系列的芯片

使用特权

评论回复
地板
lxc88998899| | 2023-6-15 16:18 | 只看该作者
学习了,谢谢老师分享经验

使用特权

评论回复
5
jinniuxing| | 2023-6-29 13:35 | 只看该作者
谢谢分享~!

使用特权

评论回复
6
cherryNuyoah| | 2023-7-3 14:10 | 只看该作者
可以的,谢谢分享

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

167

主题

705

帖子

32

粉丝