如何避免使用新的flash扇区第一次读取数据出错的问题?
 #include "common.h"
#include "include.h"

float data=55.55;
int flag=0;
 void main()
{
    uint8_t ch[7]="data:";
    OLED_Init(); 
    key_init(KEY_U);
    key_init(KEY_D);
    key_init(KEY_L);
    flash_init();    
                                   //初始化flash
    data = flash_read(252,0,float); 
    while(1)
    {
        if(key_check(KEY_U) ==  KEY_DOWN)
           {
              flash_erase_sector(252);                     //擦除扇区
              flash_write(252, 0, (*((uint32*)&data)));
              flag++;
           }
        if(key_check(KEY_D) ==  KEY_DOWN)
           {
             data++;
           }
        if(key_check(KEY_L) ==  KEY_DOWN)
           {
             data--;
           }
        OLED_P8x16Str(0,0,&ch[7]);
        OLED_PrintValueF(5,0,data,4);
    }

该程序的功能是,用按键实现data的加减与储存到flash里面。可是这样执行,第一次使用新扇区的的时候会因为里面没有写入数据,而读取出错误数据(+0.q355),之后再用按键也无法写入。如和让它在使用新扇区的时候能够不产生读取错误,即只在使用新扇区的时候让它擦除和写入一次数据,之后在程序初始化的时候便不再再次执行?

0
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
spi flash偶尔出现写入错误的情况
spi flash W25Q128会偶尔出现写入错误的情况,会发现读出的值和写入的值不一致,需加入2次读出比较判断。 W25QXX_Read(&temp_date_count,0x000000,1); //W25QXX_Write((u8*)&temp_date,0x400000,135); //W25QXX_Read((u8*)&temp_data_test,0x4...
Norflash读写擦除驱动
本文叙述S29GL256P90_NOR_FLASH的驱动问题
SPI实例之FLASH芯的使用;
本实例旨在梳理W25Q128BV基本使用流程,不是涵盖其全功能,也不针对任何平台,具有通用性! 大家都知道芯片数据手册太多且太繁琐,不涉及特殊需求时而我们实际使用的仅仅是其中很小的一部分功能; 现在以W25Q128BV为例进行分析,可推广至其他芯片; 第一步: 硬件初始化,即init; 这里的硬件初始化是指初始化芯片W25Q128BV,而不是MCU的GPIO初始化,MCU对应W2
文件簇,文件扇区与flash中扇区及页的关系
文件簇其实确切点说应该叫扇区簇 我们都知道一般而言一个扇区是512字节,我们的文件系统会把连续的N(具体几个就要看文件系统的参数设定,一般为4K即8个扇区)个扇区视为一个簇,这样做是为了优化磁盘访问效率。 一个文件则由文件分配表中标识的N(视文件大小而定)个扇区簇组成,各个扇区簇之间可以为不连续的(这也就是为什么要有磁盘整理软件了)。 其实就是一个链表结构,如: 文件分配表->
STM32f103 —— 内部flash读写
#ifndef _MCU_FLASH_H_ #define _MCU_FLASH_H_ #include <stdint.h> // STM32f103C8T6 64KB FLASH,20KB RAM,1个扇区1KB,程序起始0x8000000 #define FLASH_START_ADDR ((uint32_t)0x8000000) #define FLASH_END_...
spi_flash的操作(擦除、写数据)
SPI_FLASH的擦除、写、读操作 继续在上一节中的spi_flash.c文件中编写。 明确添加代码所要实现的功能:对spi_flash进行各种操作(去保护、擦除、(烧)写操作、读操作)。 明确对spi_flash写操作的流程:去保护 -> 擦除 -> 烧写。 完成各模块的函数4.1 去保护操作(去“两层保护”:状态寄存器,数据存储区)—将“两次去保护”放在SPI_Flash_Init函数 —去
个人笔记_FLASH性质存储器扇区边界擦除算法
大部分FLASH性质存储器都有很多相似的操作规则,比如擦除方式就很特殊,最小擦出单位必须按照扇区来操作,而数据的写入地址的内容必须是擦除状态。这也是为什么EEPROM还能存在的一方面的原因吧(可以字节擦除)。由于这种特殊的性质,导致我们在利用FLASH存储数据的时候必须注意对扇区擦除的操作。这里我总结个人的两个操作技巧(以下内容是针对不带文件系统的存储器说明的,带文件系统的也可以参考)。
STM32F103使用内部Flash保存参数
 在我们应用开发时,经常会有一些程序运行参数需要保存,如一些修正系数。这些数据的特点是:数量少而且不需要经常修改,但又不能定义为常量,因为每台设备可能不一样而且在以后还有修改的可能。将这类数据存在指定的位置,需要修改时直接修改存储位置的数值,需要使用时则直接读取,会是一种方便的做法。考虑到这些数据量比较少,使用专门的存储单元既不经济,也没有必要,而STM32F103内部的Flash容量较
扇区 物理块 逻辑块 flash 基础概念
    sector:硬件(磁盘)上的最小的操作单位,是操作系统和块设备(硬件、磁盘)之间传送数据的单位block由一个或多个sector组成,是软件(OS、文件系统)中最小的操作单位;操作系统的虚拟文件系统从硬件设备上读取一个block,实际为从硬件设备读取一个或多个sector.对于文件管理来说,每个文件对应的多个block可能是不连续的;block最终要映射到sector上,所以block的...
nand flash读写出现好多错误
在u-boot下输入命令: nand read 0x800000 0 0x800 结果出来好多信息 查了一些信息,是没有nand flash标志位 标志位用来表示nand flash是大页还是小页 CFG_NAND_OR_PRELIM 的宏添加 OR_FCM_PGS 即可
Flash 扇区基本介绍
一、扇区基本介绍 1、扇区(磁盘上划分的区域)                                      磁盘上的每个磁道被等分为若干个弧段,这些弧段便是磁盘的扇区。硬盘的读写以扇区为基本单位。 磁盘的每一面被分为很多条磁道,即表面上的一些同心圆,越接近中心,圆就越小。而每一个磁道又按512个字节为单位划分为等分,叫做扇区,在一些硬盘的参数列表上你可以看到描述每个磁道的扇...
STM32 Flash 擦除 读写 成功
参考:http://download.csdn.net/detail/my_friend_ship/4166970 要点: 将数据写入flash之前,每次都要擦除,否则会写入不成功,出现的错误状态为:FLASH_Status=FLASH_ERROR_PG 写入数据成功后可以在Memory 中查看刚刚写入的数据,具体在Memory 窗口中输入:0x08010000,既可以看到此处的数据为
关于flash擦除引起的bug问题小结
u16 irlib_get_free_block(const u8 * libno) { u8 i; vu16 low, up; u16 _libno = le16_to_cpu(*(u16*)libno); u16 test = 0; if (_libno == 0) { irlib.libno0_use_sec = 1-irli
STM32F4 内部flash存放配置(优化存储)
由于STM32F4系列内部flash的块非常大,因此擦除时间比较长,并且很浪费,我一般使用中间的64KB的块做存储,前面4个16KB为启动程序,后面的几个128KB为应用程序。存储方案:使用64KB的扇区,每次配置占用1KB,每次初始化的时候从后向前判断配置是否有效,如果最后一个为有效,则下次写入会擦除扇区,并将配置写入到第0个1KB,下次写入到第1个1KB,依次类推,这样可以保证写入64次配置才...
STM32片上FLASH内存映射、页面大小、寄存器映射
本文以STM32F103RBT6为例介绍了片上Flash(Embedded Flash)若干问题,包括Flash大小(内存映射)、块大小、页面大小、寄存器。这些知识,有利于写Flash驱动。 一、怎么看Flash大小 1.1 通过型号     型号会印在MCU表面,可以通过观察获得,我的是STM32F103C8T6(以下分析基于这个型号),对照下图的STM32产品命名,可知STM
串行 spi Flash 跨页编程的注意点
spi Flash 进行 page program的时候,编程的数据为1-256个字节不等。在Datasheet中,如果编程的数据为256个字节,那么,输入的起始地址需要256个字节对齐,即需要页对齐。但如果编程的数据小于256个字节,datasheet则语焉不详。 前几天在优化spi flash驱动的时候,为了提升flash编程速度,将page从4个字节增加到12个字节。由于没有注意到跨页
stm32使用SPI对W25Q64--8M字节FLASH的读写
 先W25Q64介绍: 板上有个带SPI的FLASH产品,W25Q64,华邦公司,大容量64Mb的,也就是8M字节, (W25Q64把这个8M的容量分为128块-Block,每块64K字节,分出16个扇区,每个扇区4K字节) 即就是:W25Q64--8M  一个块--64K   一个扇区4K 最小擦除单位为一个扇区   关键点---这样我们需要给W2
FAT文件系统格式化到SPI flash上的问题(虚拟扇区与真实扇区)
FAT文件系统中标准的虚拟扇区是512bytes的数据,而SPI flash的扇区的真实大小是4096。 主要思想: 在内存中申请4096的buffer,每次写入数据,要把真实扇区的数据读出来,然后在写入内存中在填充512bytes的数据,请看如下所示的图。 上图中是读写扇区数据的流程,对于读扇区来说可以不需要特别的操作,但是对于写操作来说必须要获取flash上真实的地址扇区,然后在根据...
必须知道的stm32内部flash操作细节
1.stm32内部flash写操作只能是两个byte写入,不能一个byte一个byte的写2.写之前需要擦除,擦除后数据均为FF3.内部flash为512kb为大容量,小于512为小容量。在stm32的stm32f10x_flash.c里面FLASH_Status FLASH_ErasePage擦除页函数有区别擦2k还是擦1k,大容量擦2k,小容量擦1k4.读可以只读一个字节,例如:*(uint8...
NANDflash常见问题汇总
掉程序(这里专指使用NAND flash的主板掉程序),这是一个让工程师浑身发毛的问题,特别是用着用着程序就没有了,往往这个时候很多工程师都无法下手,问题出现的时候你可能根本不在旁边,无法看到问题现象,而且通过测量信号也很难发现问题的原因,这个时候很多工程师可能会采用更换主板器件的方式,用排除法来定位问题,基本上换一个NAND flash就可以解决问题了。这个时候很多工程师可能就会表示NAND
CCS6.0烧写程序时怎么设置选择擦除哪个扇区
仿真器与DSP成功连接后,点击CCS6.0界面左上角Tools→On-Chip Flash 就可以设置仿真器擦除哪个扇区了
NAND FLASH分区规划
由于BOOTLOADRER、PARAMS以及内核、文件系统都在NAND FLASH上,因此分区就得进行统一规划。系统的NAND FLASH分区依赖于u-boot和Linux内核两方面的设置。 U-Boot中的NAND分区     文件:include/configs/开发板.h     这是Phy3250的参数,Phy3250采用32MB的NAND FLASH,扇区大小为16KB
关于stm32的flash的擦除的理解
最近消化 正点原子《STM32不完全手册》—— 第三十一章 FLASH模拟EEPROM实验 时,对判断FLASH是否需要擦除的语句有点不理解,度娘了才知:FLASH擦除后字节存储的数据是0XFF void STMFLASH_Write(u32 WriteAddr,u16 *pBuffer,u16 NumToWrite)     {     u32 secpos;       //扇区地址
利用89C52RC的DATAFLASH实现掉电存储数据
以下蓝色字转自 http://xouou.iteye.com/blog/1815427 STC单片机的内部EEPROM是用DATAFLASH模拟出来的,不是真正的EEPROM存储器,不能用普通的方法来操作 下面是一些注意点: 1.字节写之前要先将这个字节所在扇区的其它有效数据读取到RAM暂存(这步不是必须的) 2.暂存完之后再对整个扇区(512字节)进行擦除操作,擦拭完后,整个扇区每个地
提高flash的使用寿命技巧
提高flash使用寿命的技巧 Flash器件的写入步骤如下: 1)        读取扇区内所有数据到RAM中; 2)        把需要写入的数据写到对应的RAM; 3)        擦除扇区; 4)        把RAM中的数据写入到flash中;     提高使用寿命技巧: 1.        基于flash在写入前要擦除整个扇区的特点,在成本允许的情况下,尽可能地选取扇
SPI Flash的擦写注意事项
从规格书上看,SPI flash一般支持3种擦写方式:按sector擦写,按block擦写,整片chip擦写。以KH25L3255E为例,•      Serial Peripheral Interface compatible -- Mode 0 and Mode 3•      33,554,432 x 1 bit structure or 16,777,216 x 2 bits (two I...
NandFlash---地址与区、块、页的关系-以MX30LF1G08AA为例
下面的nandflash都是以MX30LF1G08AA为例再说; 该nandflash共有 1个 Zone; 每个Zone有1024个Block; 每个Block有64 个Page; 每个page有2048+64bytes; 写入地址格式如下: 其中A0-A11位共12位来表示列地址;其实也就是每页2048+64Bytes的地址,该地址大小为0-2111; 每个block有
STM32F412擦除内部FLASH时间过长
1 前言 客户反馈在使用STM32F412的时候,擦除sector 8~11发现时间过长,从而导致意外触发IWDG复位。 2 问题分析 2.1 问题详情 通过与客户邮件和电话沟通,了解到客户主要是想使用内部FLASH暂时保存IAP升级时的程序数据,在IAP升级的过程中,需要首先擦除内部FLASH中一块足够大的空间,然后再写入升级数据。客户的工程中有使用到IWDG,喂狗间隔大约1.5S,客户
第50章 读写内部FLASH—零死角玩转STM32-F429系列
第50章     读写内部FLASH 全套200集视频教程和1000页PDF教程请到秉火论坛下载:www.firebbs.cn 野火视频教程优酷观看网址:http://i.youku.com/firege       本章参考资料:《STM32F4xx 中文参考手册》、《STM32F4xx规格书》、库说明文档《stm32f4xx_dsp_stdperiph_lib_um.chm》。
Nand Flash Yaffs系统大量写入数据失败问题的解决方法。
一个朋友的问题,我们共同分析后搞定。其实以前也遇到过同样问题,时间长了,没总结。   事发:在Nand Flash上使用2.6.14的linux kernel,三星2440的板子,连续写入文件,到一定大小限制就删除,文件写入没有超过flash保留10%的空闲,应该说还差很多。   第一步,不适用syslog写,换做自己写代码写入,出现几率降低; 第二步,fwrite换成write,几率增
flash读写简析(以stm32f107vct6为例)
概述 flash作为stm32中的存储物质,使用非常广泛。关于flash的概念什么的网上已经有很多介绍,笔者便不再赘述,分享一篇stm32的闪存中文编程手册。 相对于很多操作寄存器的例子,笔者这篇着重于用库函数处理。 代码设计写入编写代码的时候实际上非常简单。只需要几个步骤就可以完成写入。 * 解锁 FLASH_Unlock(); 这一步非常简单。只需要调用上面的解锁函数即可
ESP8266学习笔记(2)——内存分布及Flash读写接口
一、存储芯片W25Q系列 w25q 系列生产的加工的商家很多,但是里面的分布和命名规则都是一样的。比如华邦的w25q64,spi通讯接口,64就是指 64Mbit 也就是 8M 的容量。而我们平时的8266-12f的 32Mbit 就是 4M 容量。 以 w25q32 为例,里面的存储分布。w25q32把4M容量分为了 64 块,每一块又分为 16 个扇区,而每个扇区占 4K 大小。 由...
SPI方式读取外部FLASH抓取时序图
使用STM32的SPI控制器,对外部的W25X16 FLASH(2M字节)芯片进行操作。以下为逻辑分析仪抓取的时序。          以下是该FLASH芯片的命令表。          1、          1、读取器件ID。 先拉低片选信号CS,再发送命令0XAB,再发送三个字节的dummy。读取第四个字节数据,数据就是device ID。最后拉高CS,结束一次操作。    ...
LPC1788内部EEPROM使用的问题
最近使用LPC1788内部EEPROM存储数据时候发现问题:LPC1788的EEPROM扇区只有 0-62 63扇区不存在 uint32_t i, j; uint8_t count; uint8_t error = 0; debug_frmwrk_init(); _DBG(menu); EEPROM_Init(); count = sizeof(write
STM32 Flash操作(擦写)过程中器件复位导致数据丢失问题
1.问题描述 产品在运行过程中需要保存一些断电不丢失的数据,为此将数据保存在STM32内部的flash中。但是测试人员在测试的过程中,修改了数据参数,直接断电重启机器,并没有等待flash的操作时间,导致原有的数据丢失。 2. 原理分析 本产品硬件平台是基于STM32F429,采用HAL库开发。在操作内部flash这部分中,查看数据手册得知: 对于操作128KB的扇区擦写32位数据...
NOR Flash 烧写说明
在对FLASH进行写操作的时候,每个BIT可以通过编程由1变为0,但不可以有0修改为1。为了保证写操作的正确性,在执行写操作前,都要执行擦除操作。擦除操作会把FLASH的一个SECTOR,一个BANK或是整片FLASH 的值全修改为0xFF。这样,写操作就可以正确完成了。
对段、页、块、扇区的理解
段、页、块、扇区:        据我的理解:可以理解为指针的传递过程“扇区组合为块和页,页组合为段”,具体组合方式和大小按自己设定的方式用程序进行组合,段地址必须放在寄存器中,这是硬规定。        在操作系统下编程,具体组合方式和大小已经被操作系统设定了,编程人员直接使用就可以了。        如果您自己编操作系统,您也可以自行设定组合方式和大小的。       windows的
Jflash源码分析
来源:   作者:freasy 转自 http://www.dzjs.net/html/qianrushixitong/2007/0403/1858.html   后记:第一次接触JTAG是大学学习数字逻辑的时候,那个时候在maxplus里面画好原理图或者用HDL写好描述,编译之后,就使用JTAG下载到alter 的芯片里面,那个芯片就按照我们的原理动起来了!!真是神奇,当时觉得
bootloader中关于flash擦除写和ram初始化的问题
liangboone君,还有个地方没弄明白,请教下。“全局变量和静态变量的初始化值是保存在Flash中的Const段里的”:这个const段的起始地址和内容也是在s19文件里的吧。可是bootloader的s19文件和应用的s19文件,要手动合成一个s19文件后烧入mcu的flash里,其中应用的s19文件只把中断向量表的地址重映射了,const段地址应该没有变动,这样const段不会重叠吗?bo...
spi flash驱动代码分析(二)
一、spi flash裸机驱动代码 void W25q64_Init(void) { ...... } /******************************************************************************* * Function Name : W25q_ReadWriteByte * Description : W2
文章热词 机器学习教程 Objective-C培训 交互设计视频教程 颜色模型 设计制作学习
相关热词 mysql关联查询两次本表 native底部 react extjs glyph 图标 如何学习一门新的编程语言 新编程语言