打印
[DemoCode下载]

NUC029TAN DataFlash模拟E2PROM存储

[复制链接]
1044|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 星星点灯69 于 2019-7-16 14:00 编辑

  我最近用到的一款设备需要手动校准保存一些参数,芯片用的NUC029TAN,于是乎捣鼓了两三天dataflash模拟E2PROM的储存功能,总算调通了!
  现在发个帖整理一下碰到的问题以及解决的办法,以便做个记录,也方便后面使用新唐单片机的小伙伴少走些弯路。
  首先,  我通过查看官方手册可以知道,NUC029TAN是有4KBytes的dataflash供用户使用,地址范围0x0001F000-0x000FFFF,但是怎么使用呢,官方bsp有个FMC_RW的demo。
  新塘的技术资料是整理的挺好的,但是有两个明显的弊端:频繁的使用printf让人看得不耐烦,再有就是多个类似的功能放在一个工程里统一测试,有时候提取自己需要的东西改动就会非常多。


废话不多说直接上代码,我把读写dataflash封装成了两个API函数:写数据函数FMC_WriteDataFlash(uint32_t *u32Config, uint32_t u32Count),
                                                                                                读数据函数FMC_ReadDataFlash(uint32_t *u32Config, uint32_t u32Count),注意是以u32为最小单位,也就是4个字节。
最重要的一点:写数据之前需要先把整页数据擦除,不然会写入不成功,每次只能读到0xFFFFFFFF!!! 这让我纠结了一整天,还好顺利解决了。
以下是函数定义,很简洁明了,附件是DataFlash.c和DataFlash.h文件,方便坛友直接下载。
#define FMC_USERF_BASE  0x0001F000  //用户数据FLASH起始地址
/**
  * @brief       Read the User Configuration words.
  * @param[out]  u32Config  The word buffer to store the User Configuration data.
  * @param[in]   u32Count   The word count to be read.
  * @retval       0: Success
  * @retval      -1: Failed
  */
int32_t FMC_ReadDataFlash(uint32_t *u32Config, uint32_t u32Count)
{
    int32_t i;
    uint32_t data_buff[128]={0};
         
    for(i = 0; i < u32Count; i++)
        u32Config = FMC_Read(FMC_USERF_BASE + i * 4);
              
    return 0;
}


/**
  * @brief    Write User Configuration
  *
  * @param    u32Config: The word buffer to store the User Configuration data.
  * @param    u32Count:  The word count to program to User Configuration.
  *
  * @retval    0:  Success
  * @retval   -1: Failed
  *
  * @Details  User must enable User Configuration update before writing it.
  *           User must erase User Configuration before writing it.
  *           User Configuration is also be page erase. User needs to backup necessary data
  *           before erase User Configuration.
  */
int32_t FMC_WriteDataFlash(uint32_t *u32Config, uint32_t u32Count)
{
    int32_t i;
         
    FMC_Erase(FMC_USERF_BASE);//写入数据前先擦除整页数据,否则从第2次开始后写入数据不成功!
    for(i = 0; i < u32Count; i++)
    {
        FMC_Write(FMC_USERF_BASE + i * 4, u32Config);
        if(FMC_Read(FMC_USERF_BASE + i * 4) != u32Config)
            return -1;
    }

    return 0;
}

先写这么多吧,欢迎一起讨论交流



DataFlash.rar

1.02 KB

使用特权

评论回复
沙发
幸福小强| | 2019-7-16 16:43 | 只看该作者
官方是不是也有这个类似的例子提供

使用特权

评论回复
板凳
小明的同学| | 2019-7-17 08:40 | 只看该作者
是的,这样可以省一个芯片钱。

使用特权

评论回复
地板
星星点灯69|  楼主 | 2019-7-17 10:06 | 只看该作者
幸福小强 发表于 2019-7-16 16:43
官方是不是也有这个类似的例子提供

有,官方的demo是用来读芯片的CID、UID等产品ID之类的

使用特权

评论回复
5
星星点灯69|  楼主 | 2019-7-17 10:09 | 只看该作者
本帖最后由 星星点灯69 于 2019-7-17 10:13 编辑
小明的同学 发表于 2019-7-17 08:40
是的,这样可以省一个芯片钱。

确实,省了一片EEPROM,唯一的弊端就是改变一个字需要先擦除整页一遍

使用特权

评论回复
6
zhuotuzi| | 2019-7-19 00:37 | 只看该作者
例子非常丰富的。

使用特权

评论回复
7
yiy| | 2019-7-20 20:58 | 只看该作者
非常方便,直接就能拿来用。

使用特权

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

本版积分规则

7

主题

51

帖子

0

粉丝