#申请原创#
现在的进口的MCU芯片普遍缺货,之前主要用是ST和NXP的MCU做项目,这两家低功耗做的比较好,一直有代理过来推荐国产的单片机GD说和ST的PINTOPIN兼容,但是换方案比较麻烦,就一直没动。去年年底到今年来,单片机交期普遍在30周左右了,领导也考虑国产替代试一下,正好有个新项目进行,就采购一批GD32F103CBT6回来试一下,当时价格还好,8块多买回来,听说后来也涨到20+了,感觉目前这个状态是不正常的,按道理原厂不停的生产,目前也没有什么火爆的项目在进行,为什么市面上这么缺货?言归正传,分享一下使用时的心得。 整体来看和ST使用基本差不多,原理图如下: 官方手册上说,BOOT0和BOOT1引脚必须接下拉,不能悬空。这里可能和ST稍有差别。实物图如下: 板子焊好之后,到官网下载例程包, 开始程序编辑,我使用的是keil v5。 打开程序后,提醒没有PACK包,找到PACK包进行安装,发现例程选择的芯片不对,重新选择芯片,如下图: 选择GD32F103CB型号。 编译一下例程,看能不能通过,发现很多错误,后面找到原因知道是keil的版本问题和一个宏定义重复导致,如下图: 先解决版本问题,点击上图的部分,把版本切换到keil V5
把例程的库文件链接,在软件里重新添加一下路径就行。再进行编译,还是缺一个core_cm3.h文件。 找到keil V5的安装位置里,找到该文件,路径如下: 添加之后编译就OK了。烧写uart的例程之后,就可以正常打印数据了。 该工程就可以正常使用了,可以开始添加我之前使用的一些器件的驱动,调试各项功能。该设备定位是温湿度传感器,带LCD显示屏进行就地显示。添加之前写好的驱动程序,配置一些时钟就行了。其中用到了GD的内部flash做设备的参数存储,用到了ADC采集电池电压做电量计算,其他就是几个定时器做时序控制和看门狗。 下面先分享一下内部FLASH操作,直接调用函数 GDFMC_ErasePage(ParaStartAddr); //擦除 GDFLASH_Write(ParaStartAddr,(uint32_t *)DefaultPara,ParaLen); //写入 我是定义的把0x0801FC00(每页1024字节)最后一页擦除,然后写入我需要的数据,直接调用上面的函数即可,读flash的时候,直接用指针指向改地址就能读出参数。例如直接用指针指向0x0801FC00,((uint8_t)*((volatile uint32_t *) 0x0801FC00)) ,就能读出该地址的数据。目前测试功能是可以的,这个函数好像和ST有区别,需要自己编辑一下流程,如下: /********************************************************** * * 函数名: void fmc_erase_pages(void) * 功 能: 擦除flash一页数据 * 说 明: * 设计人: * 设计时间:2021-03-19 * 入口参数:无 * 出口参数:无 ***********************************************************/ void GDFMC_ErasePage(uint32_t PageAddr) { // uint8_t i; // zTransferStatus = PASSED; fmc_unlock(); fmc_flag_clear(FMC_FLAG_BANK0_END); fmc_flag_clear(FMC_FLAG_BANK0_WPERR); fmc_flag_clear(FMC_FLAG_BANK0_PGERR); fmc_page_erase(PageAddr);//GD32_FLASH_BASE + (FMC_PAGE_SIZE * PageAddr)); fmc_flag_clear(FMC_FLAG_BANK0_END); fmc_flag_clear(FMC_FLAG_BANK0_WPERR); fmc_flag_clear(FMC_FLAG_BANK0_PGERR); fmc_lock(); } /********************************************************** * * 函数名: void fmc_erase_pages(void) * 功 能: 把数据写入flash * 说 明: * 设计人: * 设计时间:2021-03-19 * 入口参数:无 * 出口参数:无 ***********************************************************/ void GDFLASH_Write(uint32_t WriteAddr,uint32_t *pBuffer,uint32_t NumToWrite) { // uint32_t addrx=0; uint32_t endaddr=0; // uint32_t i; fmc_unlock(); // addrx=WriteAddr; endaddr=WriteAddr+NumToWrite*4; fmc_flag_clear(FMC_FLAG_BANK0_END); fmc_flag_clear(FMC_FLAG_BANK0_WPERR); fmc_flag_clear(FMC_FLAG_BANK0_PGERR); while(WriteAddr<endaddr) { fmc_word_program(WriteAddr,*pBuffer); fmc_flag_clear(FMC_FLAG_BANK0_END); fmc_flag_clear(FMC_FLAG_BANK0_WPERR); fmc_flag_clear(FMC_FLAG_BANK0_PGERR); WriteAddr+=4; pBuffer++; } fmc_lock(); } 使用上面两个函数就能正常使用内部FLASH。 其中的子函数是在库函数的这里,如下图: 整体来说,基本使用和ST基本一致,细微上有些差别。 最后成品如上图,里面有LCD和温湿度采集器功能,有需要的小伙伴可以和我沟通,哈哈。今天就分享这些!
|