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

基于GD32F103CBT6的温湿度采集传感器

[复制链接]
5734|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
#申请原创#

现在的进口的MCU芯片普遍缺货,之前主要用是STNXPMCU做项目,这两家低功耗做的比较好,一直有代理过来推荐国产的单片机GD说和STPINTOPIN兼容,但是换方案比较麻烦,就一直没动。去年年底到今年来,单片机交期普遍在30周左右了,领导也考虑国产替代试一下,正好有个新项目进行,就采购一批GD32F103CBT6回来试一下,当时价格还好,8块多买回来,听说后来也涨到20+了,感觉目前这个状态是不正常的,按道理原厂不停的生产,目前也没有什么火爆的项目在进行,为什么市面上这么缺货?言归正传,分享一下使用时的心得。
整体来看和ST使用基本差不多,原理图如下:
官方手册上说,BOOT0BOOT1引脚必须接下拉,不能悬空。这里可能和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和温湿度采集器功能,有需要的小伙伴可以和我沟通,哈哈。今天就分享这些!
@21小跑堂 @21小跑堂 @21小跑堂


使用特权

评论回复

打赏榜单

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

沙发
我就说亮| | 2021-5-22 16:44 | 只看该作者
一模一样的。随便用。直接用st的库开发同样使用

使用特权

评论回复
板凳
laocuo1142|  楼主 | 2021-5-23 17:20 | 只看该作者
我就说亮 发表于 2021-5-22 16:44
一模一样的。随便用。直接用st的库开发同样使用

是啊

使用特权

评论回复
地板
1428140555| | 2021-6-29 11:55 | 只看该作者
學習學習

使用特权

评论回复
5
taurus2021| | 2021-6-29 13:06 | 只看该作者
感谢原创分享~

使用特权

评论回复
6
renpengfly| | 2021-6-30 09:49 | 只看该作者
楼主大公无私感谢分享

使用特权

评论回复
7
yangjiaxu| | 2021-6-30 15:31 | 只看该作者
这个不错啊,写的很细,图文思路清晰

使用特权

评论回复
8
Betty996| | 2021-6-30 15:31 | 只看该作者
GD的芯片 是不是都不好买了

使用特权

评论回复
9
Charlotte夏| | 2021-6-30 15:32 | 只看该作者
感谢楼主分享,GD没有怎么体验过 不过感觉口碑还行

使用特权

评论回复
10
match007| | 2021-7-1 16:53 | 只看该作者
我就说亮 发表于 2021-5-22 16:44
一模一样的。随便用。直接用st的库开发同样使用

103的还没试过,
但是F4系列的,多少要微调一下。

使用特权

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

本版积分规则

1191

主题

5214

帖子

12

粉丝