*阅读说明:详细过程及源码资料等请戳原链接查看。
最近一个项目需要测量海拔高度,在淘宝上买了一个气压高度计模块,到货后自己把排针焊上,准备测试。 之前已经在用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:晶体的选择
|