[技术问答] M058S 实验dataflash功能,复位断电数据不保存的问题?

[复制链接]
179|5
 楼主 | 2019-9-9 07:44 | 显示全部楼层 |阅读模式
本帖最后由 121322620 于 2019-9-9 11:42 编辑

小弟最近在玩一块新唐M058S的片子,实验的dataflash功能。程序是读数据,再++,写进去。本意是每次上电或者复位从上次数值开始,可是发现,每次断电,第一次读出的数据都是从FFFF。很奇怪这样?求大神指点

#define DATA_FLASH_TEST_BASE        (FMC->DFBADR)
#define DATA_FLASH_TEST_END         (FMC->DFBADR + 0x1000)

int32_t  VerifyData(uint32_t u32StartAddr, uint32_t u32EndAddr, uint32_t u32Pattern)
{
    uint32_t    u32Addr;
    uint32_t    u32Data;

    for(u32Addr = u32StartAddr; u32Addr < u32EndAddr; u32Addr += 4)
    {
        u32Data = FMC_Read(u32Addr);
        if(u32Data != u32Pattern)
        {
          return -1;
        }
    }
    return 0;
}




int32_t WriteToFlash(uint32_t u32StartAddr, uint32_t u32Length, uint32_t *u32data)
{
  uint32_t    u32Addr,i;
        u32Addr = u32StartAddr;
         for(u32Addr = u32StartAddr; u32Addr < (u32StartAddr + u32Length*4); u32Addr += FMC_FLASH_PAGE_SIZE)
        {
          FMC_Erase(u32Addr);
                if(VerifyData(u32Addr, u32Addr + FMC_FLASH_PAGE_SIZE, 0xFFFFFFFF) < 0)
        {                                        
            return -1;
        }       
        }
       
        u32Addr = u32StartAddr;
         for(i =0; i < u32Length; i++)
    {               
        FMC_Write(u32Addr, u32data);
                          u32Addr += 4;
    }
               
    return 0;
}


int32_t ReadFromFlash(uint32_t u32StartAddr, uint32_t u32Length, uint32_t *u32data)
{
  uint32_t    u32Addr,i;
        u32Addr = u32StartAddr;
         for(i =0; i < u32Length; i++)
    {
                         u32data = FMC_Read(u32Addr);
       u32Addr += 4;
    }
    return 0;

}


uint32_t DateFlash[4];

void Flash_Test(void)
{
  //uint32_t recorddata[4]={1,2,3,4};
        SYS_UnlockReg();
        FMC_Open();
        ReadFromFlash(DATA_FLASH_TEST_BASE,4,DateFlash);
        DateFlash[0]+=2;
        DateFlash[1]+=2;
        DateFlash[2]+=2;
        DateFlash[3]+=2;
        WriteToFlash(DATA_FLASH_TEST_BASE,4,DateFlash);
       
        ReadFromFlash(DATA_FLASH_TEST_BASE,4,DateFlash);
        FMC_Close();
  SYS_LockReg();

}




int main(void)
{

    /* Unlock protected registers */
    SYS_UnlockReg();

    /* Init System, peripheral clock and multi-function I/O */
    SYS_Init();

    /* Lock protected registers */
    SYS_LockReg();

          Inter_Init();
    Led_init();
    Timer3_Init();
          UART_Open(UART0, 115200);
          //PWM_OUT_Init();
          printf(" uart---    \r\r\n");
while(1)
        {
         
   Flash_Test();

        }
               
}   



捕获.PNG

使用特权

评论回复
 楼主 | 2019-9-9 21:21 | 显示全部楼层
知道原因了,应该是while一直在循环读写,断电的某一刻正好是处在擦除的时刻,到处在读取都是FF

使用特权

评论回复
| 2019-9-9 10:39 | 显示全部楼层
确认每次写入是否写入正确,写入后再读出做个判断。

使用特权

评论回复
| 2019-9-9 10:48 | 显示全部楼层
另外确认一下是不是有开始时候初始化的代码,要去掉,不然如果写入了,每次重启又被清理掉了。

使用特权

评论回复

评论

121322620 2019-9-9 11:43 回复TA
哪些地方的初始化会对dataflash产生影响?代码里好像没有。 
 楼主 | 2019-9-9 11:45 | 显示全部楼层
jiekou001 发表于 2019-9-9 10:48
另外确认一下是不是有开始时候初始化的代码,要去掉,不然如果写入了,每次重启又被清理掉了。 ...

我在keil在线调试的时候,点击“重置调试”按钮,好像dataflash就会从上次保存的数据开始。

使用特权

评论回复
扫描二维码,随时随地手机跟帖
您需要登录后才可以回帖 登录 | 注册

本版积分规则

我要发帖 投诉建议 创建版块 申请版主

快速回复

您需要登录后才可以回帖
登录 | 注册
高级模式

论坛热帖

在线客服 快速回复 返回顶部 返回列表