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

永利游戏开户直营
183|5
楼主
本帖最后由 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 (273.14 KB, 下载次数: 0)

捕获.PNG
来自 2楼
 楼主 | 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产生影响?代码里好像没有。 
5
 楼主 | 2019-9-9 11:45 | 只看该作者
jiekou001 发表于 2019-9-9 10:48
另外确认一下是不是有开始时候初始化的代码,要去掉,不然如果写入了,每次重启又被清理掉了。 ...

我在keil在线调试的时候,点击“重置调试”按钮,好像dataflash就会从上次保存的数据开始。
扫描二维码,随时随地手机跟帖
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

快速回复

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

论坛热帖

永利游戏开户直营 快速回复 返回顶部 返回列表
天天VR赛车彩票 亿万先生棋牌现金开户 不夜城国际娱乐城网上娱乐场 趣彩彩票开户 亚洲最佳真人娱乐导航
蒙特卡罗娱乐MG电子 优优PT 871sb.com 钻石娱乐ag棋牌 何氏贵宾会PT电子
澳门娱乐GPK棋牌 新葡京娱乐棋牌app 百盛娱乐棋牌下载 尊龙娱乐MW 玉和娱乐WM棋牌
hb鬼屋登入 聚星娱乐MG电子 时时彩投注平台登入 大西洋娱乐IM棋牌 873sun.com