注册 登录
查看: 1164|回复: 12

Flash 擦除问题

[复制链接]
发表于 2014-5-23 22:58:46 | 显示全部楼层 |阅读模式
山外哥  为什么Flash每次写入都要先擦除  否则读取时会出错,例程里由于只写入一次  没有问题,但我要用Flash保存参数  所以要多次写
回复

使用道具 举报

发表于 2014-5-24 08:50:53 | 显示全部楼层
SPI的Flash,写入时,只能把1改写成0.
把0改成1只有通过擦除操作。
回复 支持 反对

使用道具 举报

发表于 2014-5-24 09:36:44 | 显示全部楼层
对FLASH写入前,必须要先擦除,这是FLASH的特性
回复 支持 反对

使用道具 举报

发表于 2014-5-24 09:40:53 | 显示全部楼层
这个是必须的要求,flash的特性决定的。
而且flash不宜频繁写的。可以先缓存起来,隔一段时间再写的
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-5-24 12:18:38 | 显示全部楼层
谢谢啊
flash_init();

    flash_erase_sector(254);

    while(1)
    {
     //uart_putchar(UART3,'a');
      byte i=0;
      flash_erase_sector(254); //若这边不写擦除  就会出错  但已经在while的上方写了擦除  这是什么原因
      for(i=0;i<10;i++)
      {

        flash_write(254,i*4,i+aa);

        w = flash_read(254,i*4,uint32);
        printf("%d",w);
        lptmr_delay_ms(1000);

      }
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-5-24 12:23:25 | 显示全部楼层
山外メ雲ジ 发表于 2014-5-24 09:40
这个是必须的要求,flash的特性决定的。
而且flash不宜频繁写的。可以先缓存起来,隔一段时间再写的


谢谢啊
flash_init();

    flash_erase_sector(254);

    while(1)
    {
     //uart_putchar(UART3,'a');
      byte i=0;
      flash_erase_sector(254); //若这边不写擦除  就会出错  但已经在while的上方写了擦除  这是什么原因
      for(i=0;i<10;i++)
      {

        flash_write(254,i*4,i+aa);

        w = flash_read(254,i*4,uint32);
        printf("%d",w);
        lptmr_delay_ms(1000);

      }
回复 支持 反对

使用道具 举报

发表于 2014-5-24 15:18:07 | 显示全部楼层
山川04 发表于 2014-5-24 12:18
谢谢啊
flash_init();

因为你while 循环。第一次没问题,第二次写入的时候,还是需要擦除才新的。

建议你看看我们的K60视频,flash的特点就是写入的时候,仅仅把需要写0的位清0,而需要写1的位是不做处理。
擦除就是把全部数据都初始化为1.
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-5-24 21:39:18 | 显示全部楼层
山外メ雲ジ 发表于 2014-5-24 15:18
因为你while 循环。第一次没问题,第二次写入的时候,还是需要擦除才新的。

建议你看看我们的K60视频, ...

太感谢了  但是为什么for循环的flash_write(254,i*4,i+aa);不要擦除   可不可以这样理解   往已经写过的Flash地址里再写  要擦除Flash
回复 支持 反对

使用道具 举报

发表于 2014-5-24 22:02:11 | 显示全部楼层
山川04 发表于 2014-5-24 21:39
太感谢了  但是为什么for循环的flash_write(254,i*4,i+aa);不要擦除   可不可以这样理解   往已经写过的 ...

擦除的时候,是整个扇区来擦除。
只要写入的地方不是相同的地方,之前已经被擦除过了,那就不需要重新擦除
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-5-24 22:22:45 | 显示全部楼层
山外メ雲ジ 发表于 2014-5-24 22:02
擦除的时候,是整个扇区来擦除。
只要写入的地方不是相同的地方,之前已经被擦除过了,那就不需要重新擦 ...

强烈支持,非常感谢哥们
回复 支持 反对

使用道具 举报

发表于 2015-2-1 16:26:03 | 显示全部楼层
u32 VariableUpdateBuff[]={(u32)Threshold,(u32)CenterPwm,
  (u32)PID_Value.ServoPID.Kp,(u32)PID_Value.ServoPID.Ki,(u32)PID_Value.ServoPID.Kd,
  (u32)PID_Value.MotorPID.Kp,(u32)PID_Value.MotorPID.Ki,(u32)PID_Value.MotorPID.Kd  };
  flash_erase_sector(SECTOR_NUM);                                     //擦除一个程序flash扇区,sectorNo:扇区号(K60N512实际使用0~255)
  for(int i=0;i<sizeof(VariableUpdateBuff);i++)
  {
  flash_write(SECTOR_NUM,i*4,VariableUpdateBuff[i]);          //写入数据到扇区,偏移地址为i字节,必须一次写入4字节
  }

请问下这个程序怎么执行第二次擦除时会出错?
回复 支持 反对

使用道具 举报

发表于 2015-2-1 17:24:10 | 显示全部楼层
GB15207203169 发表于 2015-2-1 16:26
u32 VariableUpdateBuff[]={(u32)Threshold,(u32)CenterPwm,
  (u32)PID_Value.ServoPID.Kp,(u32)PID_Val ...

出错是提示什么内容呢?


回复 支持 反对

使用道具 举报

发表于 2016-1-27 18:46:44 | 显示全部楼层
山外大哥我的擦除不了FLASH的怎么办啊?每次下载或擦除都是出现这个

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回列表 返回顶部