开云-你真的会在Flash上存数据么

你真的会在Flash上存数据么 时候:2024-12-14 20:01:49 手机看文章

扫描二维码随时随地手机看文章

在利用编程(IAP)应当是MCU利用进程中常见的一种功能,MCU厂商为了加快用户的产物开辟,城市在其SDK中添加相干示例,并且也有很多用户只需要简单的集成,就完成了该功能并实现产物的量产。但你是不是真的会在Flash上存数据?

起首我们需要从片内和片外存储谈起,MCU内部的非易掉性存储器绝年夜大都都是基在FLASH的(也有少部门是EEPROM的,好比NXP LPC80x系列),MCU外部的非易掉性存储器可以有FLASH,EEPROM,此中EEPROM比力常见的是I2C接口,FLASH有NAND, NOR, SPI NOR等等。

现实应当进程中,我们到底应当怎样选择呢?需要存储的数据量巨细是重要问题,我们可以按照它来年夜致设定例则

当数据量年夜在128MB时,NAND FLASH或SD(TF)卡是常见的选择,但斟酌到NAND FLASH会有坏块的问题,编写存储软件时需要斟酌磨损平衡和坏块治理的问题,想要做的很是靠得住其实不轻易。

当数据量小在128MB,年夜在2MB时,可以选择NOR FLASH或EEPROM,EEPROM手艺上的优势是经久性好,可以频频屡次编程,最高可达100W次的擦写轮回,NOR FLASH比拟EEPROM容量会更年夜,平均本钱更好,可是寿命会少个0,最年夜只能到10W次的擦写轮回。

EEPROM(AT24C02)

FLASH(IS25WP032)

当数据量小在2MB时,便可以斟酌将其放入MCU内部的FLASH中,一旦决议把数据放MCU内部FLASH时,就面对两个问题:

(1)MCU片内FLASH许诺的寿命更短,一般多是1~5W次,似乎也有几百次的,鉴在年夜佬已停线,这里就不点名了。关在这个参数切纪要参考手册,分歧厂家的参数纷歧样,统一厂家的分歧系列也可能有差别

NXP Kinetis系列MCU

STM32 F103xx

(2) 擦写进程可能需要封闭中止,固然这个不是必需的,但除非MCU的Datasheet明白有写撑持,绝年夜大都MCU都是有这方面的要求,而且IAP编程的函数需要运行在RAM或ROM中,由于擦写进程中,假如MCU没有非凡的设计(好比下图NXP Kinetis K64系列带有双Block flash是可以撑持WWR),该进程是没法进行取指的,关中止的目标是避免外部中止触发运行在FLASH上的ISR,假如用户不但愿关中止,则必需要将可能产生中止的函数Relocate到RAM中

//RAM中履行的编程函数 static status_t flash_command_sequence(flash_config_t *config) { uint8_t registerValue; __set_PRIMASK(1); #if FLASH_DRIVER_IS_FLASH_RESIDENT /* clear RDCOLERR ACCERR FPVIOL flag in flash status register */ FTFx- FSTAT = FTFx_FSTAT_RDCOLERR_MASK | FTFx_FSTAT_ACCERR_MASK | FTFx_FSTAT_FPVIOL_MASK; status_t returnCode = flash_check_execute_in_ram_function_info(config); if (kStatus_FLASH_Success != returnCode) { __set_PRIMASK(0); return returnCode; } /* We pass the ftfx_fstat address as a parameter to flash_run_comamnd() instead of using * pre-processed MICRO sentences or operating global variable in flash_run_comamnd() * to make sure that flash_run_command() will be compiled into position-independent code (PIC). */ callFlashRunCommand((FTFx_REG8_ACCESS_TYPE)( FTFx- FSTAT)); __set_PRIMASK(0); #else /* clear RDCOLERR ACCERR FPVIOL flag in flash status register */ FTFx- FSTAT = FTFx_FSTAT_RDCOLERR_MASK | FTFx_FSTAT_ACCERR_MASK | FTFx_FSTAT_FPVIOL_MASK; /* clear CCIF bit */ FTFx- FSTAT = FTFx_FSTAT_CCIF_MASK; /* Check CCIF bit of the flash status register, wait till it is set. * IP team indicates that this loop will always complete. */ while (!(FTFx- FSTAT FTFx_FSTAT_CCIF_MASK)) { } #endif /* FLASH_DRIVER_IS_FLASH_RESIDENT */ /* Check error bits */ /* Get flash status register value */ registerValue = FTFx- FSTAT; /* checking access error */ if (registerValue FTFx_FSTAT_ACCERR_MASK) { __set_PRIMASK(0); return kStatus_FLASH_AccessError; } /* checking protection error */ else if (registerValue FTFx_FSTAT_FPVIOL_MASK) { __set_PRIMASK(0); return kStatus_FLASH_ProtectionViolation; } /* checking MGSTAT0 non-correctable error */ else if (registerValue FTFx_FSTAT_MGSTAT0_MASK) { __set_PRIMASK(0); return kStatus_FLASH_CommandFailure; } else { __set_PRIMASK(0); return kStatus_FLASH_Success; }}

(3) 擦写时候对系统的影响,之前讲过擦写进程是不克不及履行FLASH code的,所以必将会让系统pending住,而这个pending时候可以在Datasheet中寻觅谜底,一般擦除是依照sector/block巨细来的,编程时依照word或page巨细来的,擦除时候一般更长,对系统影响更年夜。用户需要斟酌的是系统是不是可以接管每一个节制周期,期待1个擦除最小单元的编程时候,这是因为有可能需要编程的数据比力年夜,假如统一时候更新必将会影响到节制周期,但假如把擦写使命分派到每一个节制周期,便可以将影响下降到最小,以NXP Kinetis,擦除一个Sector典型值是14ms,每次写入Longword(8字节)所需要的时候是65us,当需要进级的时辰,在领受到进级号令的第一帧处置时,增添sector删除号令,本次运算周期会增添14ms的pending时候,然后每周期编程8字节数据。假如系统需要将数据存在内部flash上,就必需接管某一个周期增添14ms的pending,跟着flash写入次数的增多,14ms还会增年夜到114ms

在肯定了上述问题以后便可以完成存储装备的选型,但软件处置还需要留意以下几个要点,这些问题MCU厂家通常为不会供给解决方案的,需要用户按照本身的需求来完成:

冗余备份:有些时辰用户需要更新正在利用的参数/固件,斟酌到更新掉败的环境下,需要撑持参数/固件版本回退,所以需要两片备份区进行冗余备份。

Magic number or 校验码:Magic number一般就是在FLASH编程竣事时辰,写一个位数较高的(64bit)值到固定地址,利用加载数据时,先判定Magic number是不是准确,以此判定编程进程是不是完全,切记Magic number要在编程时先擦后写(第一个擦,最后一个写),不然没法起到验证结果。这类验证体例比力低级,对靠得住性要求更高的场所,一般会利用校验码的体例(CRC或MD5),特殊是参数文件经由过程通讯的体例传输到MCU中,固然通讯进程可能也有校验(好比Modbus RTU的CRC),可是没法包管数据在RAM缓冲区不产生位翻转的环境,年夜大都MCU都不撑持ECC功能,在这类环境下是没法纠错的,假如对端装备会将文件的校验码发过来进行校验,便可以免该问题的产生,固然RAM呈现位翻转的几率很是低,可是假如产生位翻转的参数是装备的庇护点或PWM死区值,一旦呈现毛病,便可能会产生装备故障或损毁,乃至呈现平安变乱。

编程进程失落电或复位:在编程的进程中呈现失落电或复位是常常呈现的一种异常环境。好比震动致使电源接触不良,或系统异常致使看门狗没法喂狗都有可能呈现,还利用POE电源对端装备直接断电都有可能造成这类异常。所有必然要斟酌在这类环境下的异常处置,好比上电加载数据的时辰,假如校验掉败,可使用一组平安数据或更新前的数据。对带操作系统的利用,建议硬件添加系统失落电检测电路,在检测到失落电事务(如24V失落电)产生时,假如当前没有写入Flash,则lock住写入历程,假如当前正在写入Flash,则当即挪用sync函数,尽快将数据从缓存写入Flash(硬件上MCU VDD加个略微年夜点的电容,多扛一段时候),不要期待系统后台写入。

二次编程:有些MCU内部的Flash是带有校验机制的,对统一地址在擦除完成后,只能进行一次编程,假如进行二次编程写入分歧数值进去,可能会除非校验掉败,致使该地址没法正常读写。

总结,这里列了一个表格,当需要IAP的时辰,可以按照所选芯片的参数判定是不是知足本身系统的需求(下表已填入示例数据):

NVM 擦除编程最小单位 擦除编程所用时候 擦除编程寿命 编程进程是不是需要关中止 编程数据的校验 编程进程中失落电/复位 EEPROM 不需要擦,可以按字节或Page写入 写周期5ms 1000000 不需要 软件添加 软件添加 NOR FLASH Sector = 4K, 最小写入Page = 256B Sector擦70ms,Page写0.2ms 100000 不需要 软件添加 软件添加 MCU FLASH Sector = 2KB, 最小写入8Byte Sector擦14ms,写65us 50000 需要 软件添加 软件添加

欲知详情,请下载word文档 下载文档

上一篇:开云-基于FPGA的图像去雾算法的实现 下一篇:开云-不容忽视的嵌入式软件兼容性问题