如何在MCU掉电后保存之前运行时的数据?



我用的MCU是TI的Cortex M3 9B92,我想知道在MCU掉电之后,我怎样做就能够保存之前程序运行时的数据。

  • 是实时数据呢还是其他数据?

    如果不是实时数据,需要外扩一个flash或者eeprom之类的存储器件。

    如果是实时数据,考虑外扩一个铁电ram,或者考虑换一个带有铁电ram的mcu。掉电后数据不丢失。

  • 我能否用MCU的内部flash来实现呢?是实时数据,掉电后,我要保存程序关闭时运行的状态。

  • 内部的flash可以用来保存数据,模拟成eeprom使用。但是flash的编程-擦除循环寿命约10万次(典型值),如果用来保存实时数据,估计寿命上有问题。所以还是建议使用铁电存储。

    不过,LM3S的库函数提供了flash操作的API接口,,使得Flash存储器可以在应用程序的控制下进行擦除、编程等操作。你可以查看一下手册。如果用来做普通的数据存储,代替eeprom还是可以的。

    Flash存储器是由一组可独立擦除的1KB区块所构成的。对一个区块进行擦除将使该区块的全部内容复位为1。编程操作是按字(32位)进行的,每个32位的字可以被编程为将当前为1的位变为0。但是,Flash保护机制是按照2KB区块划分的,每个2KB的区块都可被标记为只读或只执行,以提供不同级别的代码保护。

    Flash的操作时序是由Flash控制器自动处理的。但是,如此便需要得知系统的时钟速率以便对内部的信号进行精确的计时。为了完成这种计时,必须向Flash控制器提供每微秒钟的时钟周期数。由软件负责通过函数FlashUsecSet( )使Flash控制器保持更新。

    执行:Flash内容当作程序代码,由CPU取指令机制自动读出,访问次数无限制;

    读取:Flash内容当作固定数表,可以由应用程序读出,访问次数无限制;

    擦除:按1KB区块整体地被擦除,该区块的全部位内容变成1,擦除时间约20ms;

    编程:对已擦除的Flash内容按32位字的方式进行写操作,能将位1改为0,编程时间约20μs。

    Flash控制器以2KB区块为基础向用户提供两种形式的基本保护策略:编程保护、读取保护。具体可以查看一下手册。