掉电存储是单片机系统中十分常用的一项功能。非易失性存储器也有很多选择,比如EEPROM、FRAM、单片机内部Flash、SPI flash、eMMC、SD卡、NAND flash等。
工程师需要根据项目的实际需求来选择存储器,一般需要考虑以下几个方面:
1、容量大小
容量是存储器选择时首先要考虑的东西。一般来说,EEPROM和FRAM容量相对较小,都在几KB;
其次是单片机内部Flash,根据不同型号的单片机,可以分配不同大小的容量,也在KB级别,通常这种小容量的存储器只适合存储一些系统参数;
然后是SPI Flash,比如W25Q128等,一般容量在几MB到几十MB,可以用于存储参数和少量数据;
最后就是SD卡、eMMC、NAND Flash等大容量的存储器了,一般都在GB级别,可以存储大量的数据。
2、读写速度
首先说说eMMC、SD卡、NAND flash等大容量存储器。这类存储器通常都会配合文件系统来使用,它们的读写速度取决于接口类型(SPI、SDIO等)、一次性写入数据大小、存储器本身速度级别限制等。通常情况下,平均速度会在几百KB~几MB/秒。
其次是单片机内部Flash和SPI Flash。Flash的特点是需要整个页(扇区或块)擦除才能写入,扇区擦除的时间一般在几十ms。因此,Flash的写入速度也会受限。但读取数据时没有此限制。
再说一下EEPROM。最常用的AT24CXX系列,IIC接口,接口速度可以达到400K甚至1M。速度貌似还可以,但要注意的是,跨页写需要有大约5ms的等待。所以,一旦写入数据需要跨页,整体速度就会大受影响。
如果需要更快的写入速度,那只能选择FRAM,铁电存储器,比如FM24CLXX系列,接口与AT24CXX兼容。铁电存储器没有页的概念,因此没有等待时间,相比EEPROM,写入速度可以大大提高。
3、擦写寿命
一般情况下,flash存储器的擦写次数在1~10万次左右,单片机内部的flash擦写次数相对较少,像STM32可以达到1万次,有些单片机的flash擦写次数只有1000次,使用时一定要注意。eeprom可以达到100万次左右,而FRAM没有擦写次数的限制。
如果需要频繁的写入,考虑使用寿命,可能需要配合磨损均衡算法来实现。SD卡是自带磨损均衡的,而其它flash或者eeprom就需要自己来实现磨损均衡算法,或是使用带磨损均衡算法的文件系统。