精华内容
下载资源
问答
  • 不定义头文件能使用eeprom? #define Baudrate1 9600UL #define Baudrate2 115200UL #define UART1_BUF_LENGTH 32 #define UART2_BUF_LENGTH 32 这是什么?
  • pic mcu 的程序需要升级,想保留eeprom里面的数据,使用 pickit3 脱机烧写升序,如果可以怎么操作,或者由其他工具可以做到也可以。
  • 使用共用体存储各类型数据到EEPROM

    千次阅读 2014-05-23 10:53:12
    你可能发现了,使用Arduino提供的EEPROM API,只能将字节型的数据的存入EEPROM。如果要存储字节以外的数据类型,又需要怎么做呢? 一个float类型的数据,需要占用4个字节的存储空间。因此我们可以把一个float拆...
    原文地址:http://www.arduino.cn/thread-2684-1-1.html

    你可能发现了,使用Arduino提供的EEPROM API,只能将字节型的数据的存入EEPROM。如果要存储字节以外的数据类型,又需要怎么做呢?

    一个float类型的数据,需要占用4个字节的存储空间。因此我们可以把一个float拆分为4个字节,然后逐字节的写入EEPROM,来达到保存float数据的目的。
    这里我们使用共用体,把float数据拆分为4个字节。
    共用体:几个不同的变量共同占用一段内存的结构,在C语言中,被称作共用体类型结构,简称共用体。
    首先定义一个名为data的共用体结构,共用体中有两个类型不同的成员变量:
      
    union data
      
    {
      
       float a;
      
       byte b[4];
      
    };
      
    再申明一个data类型的变量col:
      
    data col;
      
    现在你可以通过col.a访问这个共用体中的float类型成员a,通过col.b访问这个共用体中的byte类型成员b。col.a和col.b共同占用四个字节的地址。给col.a赋值后,通过col.b即可拆分float的目的。

    这里我们提供一个将float类型存入EEPROM的例程。
    /*
    OpenJumper Examples 
    写入float类型到EEPROM
    奈何col  2013.2.2
    [url=http://www.openjumper.com]www.openjumper.com[/url]
    */
     
    #include <EEPROM.h>
    union data
    {
      float a;
      byte b[4];
    };
    data col;
    int addr = 0;
    int led = 13;
     
    void setup()
    {
      col.a=987.65;
      for(int i=0;i<4;i++)
      EEPROM.write(i, col.b[i]);
      pinMode(led, OUTPUT);     
    }
     
    void loop()
    {
      //LED闪烁,提示任务已完成
      digitalWrite(led, HIGH);
      delay(1000);
      digitalWrite(led, LOW); 
      delay(1000);    
    }



    读出储存在EEPROM中的float类型数据思路和写入时相同,完整代码如下:
    /*
    OpenJumper Examples 
    从EEPROM读出float类型
    奈何col  2013.2.2
    [url=http://www.openjumper.com]www.openjumper.com[/url]
    */
     
    #include <EEPROM.h>
    union data
    {
      float a;
      byte b[4];
    };
    data col;
    int addr = 0;
    int led = 13;
     
    void setup()
    {
      for(int i=0;i<4;i++)
      col.b[i]=EEPROM.read(i);
      Serial.begin(9600);     
    }
     
    void loop()
    {
      //输出
      Serial.println(col.a);
      delay(1000);    
    }


    展开全文
  • 大话flash和eeprom

    2017-10-03 11:45:17
    最近在看代码的时候,遇到了一个使用FLASH模拟EEPROM的情况,看到这个我当时是一脸蒙蔽啊,对于一个有时候连FLASH和EEPROM都分不清的人来说,怎么可能读懂用FLASH来模拟EEPROM呢?这段程序看的真是如浏览天书一般。...

    最近在看代码的时候,遇到了一个使用FLASH模拟EEPROM的情况,看到这个我当时是一脸蒙蔽啊,对于一个有时候连FLASH和EEPROM都分不清的人来说,怎么可能读懂用FLASH来模拟EEPROM呢?这段程序看的真是如浏览天书一般。上网一查,原来这个作用还挺常用的。于是痛下决心,一定要搞懂这两个纸老虎。

    EEPROM

     

    1、FLASH是什么?EEPROM又是什么?

     EEPROM的全称是“电可擦除可编程只读存储器”,即Electrically Erasable Programmable Read-Only Memory。好了,说人话,EEPROM就是一个能用来存放程序和数据的存储器。一开始并没有这种EEPROM,刚开始用的是他的太爷爷——ROM,但是ROM不能编程,出厂的时候是什么内容就永远是什么内容,不灵活。后来出现了pROM,可以自己写入一次,但是要是写错了,只能换一片,所以当时程序员要是发现自己忘写了一个分号的话......。随着科技的进步,社会主义的发展,终于出现了一种可多次擦写的epROM,但是得把芯片拿到紫外线下照一下,要是编写代码的错误率像我这么高的话,估计紫外线灯都能给他照毁了,所以还是不方便。最终终于出现了EEPROM,拯救了大批的程序员,终于可以方便的修改ROM中的程序了,妈妈再也不用担心我的学习了!现在说的EEPROM都是狭义上的EEPROM,这种ROM的特点是可以随机访问和修改任何一个字节,可以往每个bit中写入0或者1。这是最传统的一种EEPROM,掉电后数据不丢失,可以保存100年,可以擦写100w次。具有较高的可靠性,但是电路复杂/成本也高。因此目前的EEPROM都是几十千字节到几百千字节的,绝少有超过512K的。

    我们说的FLASH属于广义上的EEPROM,原来他俩是一家的啊,因为他也是电可擦除的ROM。为了区别一般的按字节为单位的擦写EEPROM,我们都叫他FLASH。

    2、但是既然是一家人为什么要分开呢?仅仅是为了区别擦写方式吗?

       通常,单片机里的FLASH都用于存放运行代码,在运行过程中不能改;EEPROM是用来保存用户数据,运行过程中可以改变,比如一个时钟的闹铃时间初始化设定为12:00,后来在运行中改为6:00,这是保存在EEPROM里,不怕掉电,就算重新上电也不需要重新调整到6:00。

    但最大区别是其实是:FLASH按扇区操作,EEPROM则按字节操作,二者寻址方法不同,存储单元的结构也不同,FLASH的电路结构较简单,同样容量占芯片面积较小,成本自然比EEPROM低,因而适合用作程序存储器,EEPROM则更多的用作非易失的数据存储器。当然用FLASH做数据存储器也行,但操作比EEPROM麻烦的多,所以更“人性化”的MCU设计会集成FLASH和EEPROM两种非易失性存储器,而廉价型设计往往只有 FLASH,早期可电擦写型MCU则都是EEPRM结构,现在已基本上停产了。在芯片的内电路中,FLASH和EEPROM不仅电路不同,地址空间也不同,操作方法和指令自然也不同,不论冯诺伊曼结构还是哈佛结构都是这样。技术上,程序存储器和非易失数据存储器都可以只用FALSH结构或EEPROM结构,甚至可以用“变通”的技术手段在程序存储区模拟“数据存储区”,但就算如此,概念上二者依然不同,这是基本常识问题。

    3、为什么用FLASH模拟EEPROM

    在许多应用场合下需要用EEPROM保存非易失性的数据,但是意法半导体为了控制成本,没有在STM32F10X系列芯片中集成EEPROM,所以我们就需要用其内部集成的FLASH通过软件模拟EEPROM来达到同样的效果。这是在别人博客里借用的一句话,其实一开始我是拒绝的,但是事实就是这样。说实话我很不喜欢他们用一些听不懂的术语。什么叫非易失性数据?能不能说人话?还得我们这些入门小白再查一遍。当计算机突然断电或意外关闭时数据不会意外丢失叫做非易失性数据!

    总结 一下,EEPROM和FLASH都属于ROM,后来由于用途不同而分开,FLASH储存用户代码,EEPROM用于存放用户数据。有些芯片内部集成了FLASH和EEPROM,但是有的并没有集成EEPROM,需要片外连接,为了节省成本,有时会采用用FLASH模拟EEPROM的方法。用空间换时间。

    stm32的FLASH分为主存储块和信息块。主存储块用于保存具体的程序代码和用户数据,信息块用于负责由stm32出厂是放置2KB的启动程序(Bootloader)和512B的用户配置信息区。主存储块是以页为单位划分的,一页大小为1KB。范围为从地址0x08000000开始的128KB内。

    当我们选择单片机的时候,单片机的片内flash容量是一个经常提到的参数,但是我们该如何判断自己写的程序是否符合单片机的flash容量呢?上网查了一下,当我们使用keil5编写程序时,运行编译完毕后在build output框内可以看到如下信息:

    Code:表示程序所占用 FLASH 的大小(FLASH)。 
    RO-data:即 Read Only-data,表示程序定义的常量,如 const 类型(FLASH)。 
    RW-data:即 Read Write-data,表示已被初始化的全局变量(SRAM) 
    ZI-data:即 Zero Init-data,表示未被初始化的全局变量(SRAM) 
    有了这个就可以知道你当前使用的 flash 和 sram 大小了,所以,一定要注意的是程序的大 小不是.hex 文件的大小,而是编译后的 Code 和 RO-data 之和。 单位:bit。所以我们这个程序的大小是

    34074+798 = 34872bit = 34.1kb

    展开全文
  • 大话FLASH和EEPROM

    2017-10-02 19:21:00
    最近在看代码的时候,遇到了一个使用FLASH模拟EEPROM的情况,看到这个我当时是一脸蒙蔽啊,对于一个有时候连FLASH和EEPROM都分不清的人来说,怎么可能读懂用FLASH来模拟EEPROM呢?这段程序看的真是如浏览天书一般。...

     

    最近在看代码的时候,遇到了一个使用FLASH模拟EEPROM的情况,看到这个我当时是一脸蒙蔽啊,对于一个有时候连FLASH和EEPROM都分不清的人来说,怎么可能读懂用FLASH来模拟EEPROM呢?这段程序看的真是如浏览天书一般。上网一查,原来这个作用还挺常用的。于是痛下决心,一定要搞懂这两个纸老虎。

    EEPROM

     

    1、FLASH是什么?EEPROM又是什么?

     EEPROM的全称是“电可擦除可编程只读存储器”,即Electrically Erasable Programmable Read-Only Memory。好了,说人话,EEPROM就是一个能用来存放程序和数据的存储器。一开始并没有这种EEPROM,刚开始用的是他的太爷爷——ROM,但是ROM不能编程,出厂的时候是什么内容就永远是什么内容,不灵活。后来出现了pROM,可以自己写入一次,但是要是写错了,只能换一片,所以当时程序员要是发现自己忘写了一个分号的话......。随着科技的进步,社会主义的发展,终于出现了一种可多次擦写的epROM,但是得把芯片拿到紫外线下照一下,要是编写代码的错误率像我这么高的话,估计紫外线灯都能给他照毁了,所以还是不方便。最终终于出现了EEPROM,拯救了大批的程序员,终于可以方便的修改ROM中的程序了,妈妈再也不用担心我的学习了!现在说的EEPROM都是狭义上的EEPROM,这种ROM的特点是可以随机访问和修改任何一个字节,可以往每个bit中写入0或者1。这是最传统的一种EEPROM,掉电后数据不丢失,可以保存100年,可以擦写100w次。具有较高的可靠性,但是电路复杂/成本也高。因此目前的EEPROM都是几十千字节到几百千字节的,绝少有超过512K的。

    我们说的FLASH属于广义上的EEPROM,原来他俩是一家的啊,因为他也是电可擦除的ROM。为了区别一般的按字节为单位的擦写EEPROM,我们都叫他FLASH。

    2、但是既然是一家人为什么要分开呢?仅仅是为了区别擦写方式吗?

       通常,单片机里的FLASH都用于存放运行代码,在运行过程中不能改;EEPROM是用来保存用户数据,运行过程中可以改变,比如一个时钟的闹铃时间初始化设定为12:00,后来在运行中改为6:00,这是保存在EEPROM里,不怕掉电,就算重新上电也不需要重新调整到6:00。

    但最大区别是其实是:FLASH按扇区操作,EEPROM则按字节操作,二者寻址方法不同,存储单元的结构也不同,FLASH的电路结构较简单,同样容量占芯片面积较小,成本自然比EEPROM低,因而适合用作程序存储器,EEPROM则更多的用作非易失的数据存储器。当然用FLASH做数据存储器也行,但操作比EEPROM麻烦的多,所以更“人性化”的MCU设计会集成FLASH和EEPROM两种非易失性存储器,而廉价型设计往往只有 FLASH,早期可电擦写型MCU则都是EEPRM结构,现在已基本上停产了。在芯片的内电路中,FLASH和EEPROM不仅电路不同,地址空间也不同,操作方法和指令自然也不同,不论冯诺伊曼结构还是哈佛结构都是这样。技术上,程序存储器和非易失数据存储器都可以只用FALSH结构或EEPROM结构,甚至可以用“变通”的技术手段在程序存储区模拟“数据存储区”,但就算如此,概念上二者依然不同,这是基本常识问题。

    3、为什么用FLASH模拟EEPROM

    在许多应用场合下需要用EEPROM保存非易失性的数据,但是意法半导体为了控制成本,没有在STM32F10X系列芯片中集成EEPROM,所以我们就需要用其内部集成的FLASH通过软件模拟EEPROM来达到同样的效果。这是在别人博客里借用的一句话,其实一开始我是拒绝的,但是事实就是这样。说实话我很不喜欢他们用一些听不懂的术语。什么叫非易失性数据?能不能说人话?还得我们这些入门小白再查一遍。当计算机突然断电或意外关闭时数据不会意外丢失叫做非易失性数据!

    总结 一下,EEPROM和FLASH都属于ROM,后来由于用途不同而分开,FLASH储存用户代码,EEPROM用于存放用户数据。有些芯片内部集成了FLASH和EEPROM,但是有的并没有集成EEPROM,需要片外连接,为了节省成本,有时会采用用FLASH模拟EEPROM的方法。用空间换时间。

    stm32的FLASH分为主存储块和信息块。主存储块用于保存具体的程序代码和用户数据,信息块用于负责由stm32出厂是放置2KB的启动程序(Bootloader)和512B的用户配置信息区。主存储块是以页为单位划分的,一页大小为1KB。范围为从地址0x08000000开始的128KB内。

    当我们选择单片机的时候,单片机的片内flash容量是一个经常提到的参数,但是我们该如何判断自己写的程序是否符合单片机的flash容量呢?上网查了一下,当我们使用keil5编写程序时,运行编译完毕后在build output框内可以看到如下信息:

    Code:表示程序所占用 FLASH 的大小(FLASH)。 
    RO-data:即 Read Only-data,表示程序定义的常量,如 const 类型(FLASH)。 
    RW-data:即 Read Write-data,表示已被初始化的全局变量(SRAM) 
    ZI-data:即 Zero Init-data,表示未被初始化的全局变量(SRAM) 
    有了这个就可以知道你当前使用的 flash 和 sram 大小了,所以,一定要注意的是程序的大 小不是.hex 文件的大小,而是编译后的 Code 和 RO-data 之和。 单位:bit。所以我们这个程序的大小是

    34074+798 = 34872bit = 34.1kb

    转载于:https://www.cnblogs.com/qsyll0916/p/7622106.html

    展开全文
  • MC9S12XE的模拟EEPROM综述

    千次阅读 2017-11-01 00:30:15
    此为本人对官方文档AN3490的翻译。 这篇文档详述了怎么使用存储控制器命令来配置和使用S12(X)微控制器上提供的模拟EEPROM。其中还综述了模拟EEPROM的实现以及应用程序应该考虑的一些事情。

    嵌入式开发中常有存储一些下电后不丢失的数据的需求,RAM访问起来很方便,但是下电后数据会丢失,而MC9S12XE提供了D-Flash和EEPROM用于存储非易失性数据。之前一直只是知道这个东西,但是一直都是看着prm中的这个地址范围干瞪眼,不知道怎么用,正好官方文档上有讲这个,赶快下下来学习学习。

    翻译的资料是公开的,在这里下载https://www.nxp.com/products/microcontrollers-and-processors/additional-processors-and-mcus/8-16-bit-mcus/16-bit-s12-and-s12x-mcus/ultra-reliable-s12xe-high-performance-automotive-and-industrial-microcontrollers:S12XE?tab=Documentation_Tab,我想应该不会有什么版权问题,如涉及版权问题,请联系我删除文章。另感谢NXP提供的学习资料。


    Overview of the MC9S12XE Emulated EEPROM

    by: Martyn Gallop
    East Kilbride, Scotland

    译者注:译者博客(http://blog.csdn.net/lin_strong),转载请保留这条。此为官方文档AN3490,仅供学习交流使用,请勿用于商业用途。

    介绍

    MC9S12XEP100是S12X微控制器家族中第一个用上低能耗0.18μ技术的。这个文档介绍了S12XE对于一个新的、具有高度灵活性和扩展性的模拟EEPROM(EEE)架构的支持。

    由于FTM存储控制器提供的高度的整合,访问与更新EEE中的数据就好似使用一个NVRAM。在配置了它之后,应用程序就可以像访问普通RAM那样访问动态的NVM数据了,但这个数据可是下电不丢失的哦。

    目标

    这篇文档的目标是详述可以怎么使用存储控制器命令来配置和使用EEE。其中还综述了EEE的实现以及应用应该考虑的一些东西。

    综述

    S12XE EEE可以大大减少典型的用软件管理EEPROM的开销。
    有以下特性:

    • 一个专用的RAM缓存,其会在重置时自动被初始化,应用程序会把它看做一个虚拟的NVRAM — 不需要为EEPROM数据配一个独立的RAM镜像。
    • 当缓存RAM内容被修改时自动地编程NVM。
    • (相比于之前的EEPROM技术)更高的 写入/擦除 性能— 通过更高的NVM转数据数据率和使用wear leveling算法。
    • 对NVM数据的硬件ECC支持。

    和典型的软件驱动一样,EEE支持让应用程序

    • 在任何时刻读/写EEE数据
    • 停止编程操作
      • 进行中的EEE写入可以暂停
      • 存储控制器可以进入空闲状态
    • 确定是否还挂起着编程操作。

    EEE架构
    图 1.EEE架构

    作为16位S12X家族的一员,EEE是针对 字对齐数据(16位) 优化设计的,之前的S12X设备的EEPROM也是基于 字对齐数据 的。RAM和flash EEE资源都是按照字组织的。

    字节数据也被EEE无缝地管理。使用字节数据与使用字对齐数据对于NVM来说开销是一样的,所以在EEE NVM存储器中使用字节数据的效率不是很高。

    字不对齐数据也由EEE清晰地管理;然而并不推荐这样用,因为这会占用更多EEE NVM时钟周期并且有数据损坏的风险,当在所有EEE数据被成功编程进EEE NVM之前发生了设备重置或者下电的话数据就有可能损坏。还有许多对现存的面向字节或面向字的EEPROM方案的考虑。(见 “跨RAM字边界的数据一致性”)

    EEE 数据频率

    S12XE EEE方案很适合于那些更新频繁的数据。尽管由EEE管理很简单,常量数据(比如那些从不或者极少更新的数据)会有一些其他的考虑,并且可能更适合于直接在模块生成期间或者由应用程序直接编程进flash存储器 — 之后会讨论更多的细节。

    为了满足不同的数据需求,EEE资源可以按照实际需要进行配置。

    注意:
    这篇文档中把那些数值从不改变或者极少改变的数据称为常量数据。不要把这与高级编程语言中的常量数据类型混为一谈(尽管放在EEE中的常量类型数据元素会产生常量EEE数据)。

    资源

    EEE子系统包含在 flash存储模块(FTM) 中。关键资源是缓存RAM和D-flash(数据flash)块。

    EEE资源可以被配置一次,典型地是在ECU模块生产期间(在特殊模式下,EEE可以为了应用开发而被重新划分)。没有被分配给EEE的缓存RAM和D-flash资源仍然可以被应用软件访问。任何分配给EEE的D-flash(EEE NVM分区)都会被自动地保护以防被应用程序不小心损坏。

    S12XEP100 EEE内存资源
    图 2.S12XEP100 EEE内存资源

    EEE资源可以

    • 被应用程序作为SRAM和小扇区flash存储器独立地使用(用户RAM和用户D-flash)
    • 被存储控制器用于支持EEE(EEE RAM和EEE NVM)
    • 混合以上两种使用方式

    存储控制器负责协调所有的NVM和EEE动作。

    地址记号

    这篇文档中的所有地址引用都是用S12X全局地址映射(带有G后缀)。这是23位线性地址格式。

    FTM存储控制器

    FTM是S12XE上的一个模块,它包含许多P-flash存储块、一个D-flash存储块和一个用于管理它们的存储控制器状态机。FTM可以被当做有三个独立的应用程序接口,每个都有自己的反馈机制(比如,标志位)。

    常用命令对象(CCOB)命令

    • 用于编程/擦除P-flash和D-flash及配置EEE
    • 参数位于CCOB寄存器内
    • FTM重置序列(包括EEE拷贝活动)可以被认为是一个隐藏CCOB命令
    • 状态和作物标志位位于FSTAT寄存器内

    EEE子系统

    • 用户数据是通过EEE RAM分区来访问的(部分或全部的缓存RAM) — 写入EEE RAM能自动地生成NVM记录。
    • 可以在EEE数据被写入后立刻地读取它
    • EEE记录被存储在EEE NVM分区(部分或全部的D-flash)
    • 可以通过ETAG计数寄存器、FSTAT寄存器中的MGBUSY标志位和EEE查询CCOB命令来监控状态。
    • 错误标志位位于FSTAT和FERSTAT寄存器中

    P-flash和D-flash读取

    • 用于读取/验证P-flash和D-flash中的代码和常量数据
    • ECC错误标志位位于FERSTAT寄存器中
    • ECC错误的细节由FECCR寄存器报告

    FTM常用命令对象(CCOB)

    FTM的初始化要通过向一个被称做常用命令对象(CCOB)的寄存器集合中写入命令信息(典型的包括数据和全局地址信息),包括六个宽度为一个字的寄存器,然后清零FSTAT命令寄存器中的CCIF标志位(CCIF标志位是通过写1来清零的)以发送命令来实现的。

    CCOB寄存器组会与存储控制器交换命令和参数信息。

    当CCOB命令完成时,CCIF就会被存储控制器置位,FSTAT寄存器内的错误标志位和状态标志位就会指示是否FTM命令被成功地执行。

    并没有像0.25μ S12X上那样的命令序列。当启动了一个命令后,在这个命令完成(比如,CCIF标志位被置位)之前是不能写CCOB寄存器的。

    在配置或控制EEE时,你必须遵循数据手册中通用的flash命令写入顺序,不管是在应用代码中还是在任何开发工具脚本中。最重要的是,在写CCOB以启动任何命令之前,必须要先等待CCIF标志位置位。还强烈建议你在执行任何命令之后都要检查下错误标志位。CCIF标志位有专用的一个中断向量。FTM命令流可以使用轮询或者中断驱动的方式来实现。

    有五种控制EEE运行的CCOB命令

    在发起任何会涉及到编程或擦除操作的FTM命令之前,必须先配置FTM时钟分频器(FCLKDIV),不然就会生产访问错误(FSTAT寄存器内的ACCERR位被置位)。

    D-Flash

    D-flash是一个独立的flash块,它带有为存储NVM数据服务的错误校验编码(ECC)。在S12XEP100上,D-flash大小为16K的字。

    D-flash

    • 被实现为16位数据 + 6位EEE syndrome
    • 一次性擦除128字
    • 必须总是以字对齐数据来编程,这样才能产生6位ECC。
    • 是面向字对齐数据的
    • 一次可以通过CCOB直接编程1到4个字。
    • 可以由EEE隐藏编程细节
    • 可以灵活的分区以使得一部分被应用程序直接访问,另一部分由EEE使用。

    缓存RAM

    缓存RAM可以灵活地分区为用户RAM或EEE RAM。用户RAM可以在任何时刻被读写。EEE RAM可以在FTM重置序列结束后的任何时刻被读写。可以通过配置EPROT寄存器来保护部分或全部的EEE RAM免于不小心的修改。缓存RAM可以基于字来访问。

    EEE记录系统是基于EEE RAM中的字对齐数据的。向EEE RAM中写入单字节数据会生成与之相关的包含这个字节的字对齐数据的单条记录。在EEE RAM中访问跨越对齐字的边界的多字节数据会透明地涉及跨多个EEE记录的存储。见”跨RAM字边界的数据一致性” 以了解更多关于数据一致性的考虑。

    为了优化EEE写入周期,如果写入EEE RAM的数据与原先的数据相同,S12XE会自动地忽略它,从而不会为 字对齐数据 创建新的NVM记录。

    在不管什么样的重置后,EEE RAM中的数据会从EEE NVM中初始化。这个拷贝过程的结束是由存储控制器置位CCIF来通知的。如果EEE RAM在复制过程中被应用访问了,CPU就会停止运行直到拷贝过程完成,这时EEE RAM数据就是有效的了(见 “重置释放”)。

    EEE有一个隐藏的数据优先级。当有许多挂起的EEE数据时,会从EEE RAM中地址最高的挂起的数据开始把数据编程进EEE NVM(见 “数据写入”)。

    配置EEE大小

    在可以使用EEE之前,必须先配置它的大小。默认的,新的设备会被完全地擦除,结果就是所有的D-falsh和缓存RAM都会被配置为用户D-flash和用户RAM,没有EEE分区。

    注意:
    D-flash和P-flash的标准装箱条件是在禁用加密下将其擦除;然而,我们推荐在工厂编程(factory programming)前擦除每个块或扇区,这样就能确保用到全部的数据保持能力。

    两个分区D-flash命令(见 “EEE CCOB命令”)之一必须在应用的生命周期内在存储控制器上运行一次以授权EEE使用以上的一些资源。

    D-flash是使用CCOB命令来分区的,有两个参数:

    ERPART = 缓存RAM中给EEE用的128字区块的数量

    DFPART = 保留作用户D-flash的128字D-flash扇区的数量

    我们在这里使用扇区和区块这两个词是因为,flash扇区是由扇区擦除边界定义的物理入口,而RAM区块只是一个想象的入口。

    这是一个定义EEE分区的合理方式。它定义了应用程序要用到的EEE和用户D-flash,然后把剩下的所有D-flash都分配给EEE以尽可能优化EEE写入周期。重置后的拷贝时间有多久主要取决于EEE NVM分区的大小。对于那些不怎么关心最大写入周期而最关心拷贝时间的应用,选择一个较小的EEE NVM以达到较短的拷贝时间可能更有利。

    配置参数被存储在D-flash中的一个非易失性信息行中,在ECU生产流程中其必须被配置一次且仅有一次。在开发中,它们可以按照需要被配置。对于每个被用作EEE的缓存RAM区块来说,需要的最小D-flash数量是:

    • (128–DFPART)/ERPART 必须至少为8
    • 如果ERPART == 1,那么(128–DFPART) 必须至少是12

    更高的比例能提高写入/擦除的效率。见 “写入周期”。

    分区命令会格式化EEE NVM以用于数据记录存储。在分区之后,所有的EEE RAM地址处的数据都被擦除,读出来都是0xFFFF。

    在分区之后,任何分配给EEE的D-flash扇区(EEE NVM)都会被自动地保护,以避免被CCOB命令不小心地修改。

    在分区时遇到的任何问题都会被FSTAT错误标志位报告(见 “MCU系统考虑”)。EEE 查询命令也可以在任意时刻被用于读取分区配置。这可以被用作分区之后的附加验证,也可以用于应用程序中来检查是否EEE被正确的配置为应用的需求。

    应该尽一切努力避免在分区过程中的重置,特别是在应用程序级别的措施,比如确保这时候不会发生外部看门狗超时。

    对于在已经开始编程EEE信息后的分区过程中的发生重置的情况,这会被FTM重置序列探测到,并报告为EEE格式故障(见 “重置行为”)。

    如果在分区过程中发生了重置(不管是在普通模式还是特殊模式下),EEE配置可以在特殊模式下恢复,通过使用 全分区D-Flash CCOB命令 或通过使用 擦除所有块CCOB命令。

    读取和写入EEE

    基本的应用程序API

    应用程序数据变量可以被直接放在EEE RAM区。

    EEE RAM中的内容会以字对齐数据记录的形式备份在EEE NVM中。可以使用 使能和禁用EEE CCOB命令来使能和禁用 EEE NVM数据的编程(见 “使能EE模拟” 和 “禁用EE模拟”)。重置后默认EEE NVM编程是禁用的。

    应用程序还要考虑当发生意外下电时,那些横跨EEE RAM字边界的变量元素的数据一致性(见 “跨RAM字边界的数据一致性”)。

    读取数据

    从应用程序的角度来看,从EEE RAM中读取数据与从设备上的RAM中读取数据没有什么差别(时钟周期可能稍微有点差别)。

    写入数据

    往EEE RAM中写入数据与往设备上的RAM中写入数据没有什么差别(时钟周期可能稍微有点差别)。

    写入EEE RAM(除了那些内容没有改变的字对齐数据)还会递增存储控制器的计数器(ETAG寄存器内)。这个计数器的值表明某一时刻挂起了多少个EEE NVM写入操作。

    如果在之前的数据被存储控制器编程入EEE NVM前(可能因为存储控制器没忙得过来或者EEE被禁用了),又有数据写入了同个EEE RAM地址,只会修改RAM的内容,计数器的值不会增加。

    存储控制器的EEE活动

    数据读取

    读取EEE RAM数据不会产生EEE活动。

    数据写入

    当使能了EEE(比如,已经执行了一个使能EEE命令),存储控制器会由非0的ETAG计数器值触发。它会自动地递减 挂起数据计数值并为EEE RAM中所有挂起的数据中地址最高的那个数据生成新的EEE NVM记录。这个活动不会与后面的CPU写EEE RAM操作产生冲突。

    挂起的EEE RAM中的地址最高的数据会首先被编程进EEE NVM中(比如,首先会为地址最接近0x13_FFFF’G的数据创建记录)。如果有需要优先写入EEE NVM的数据的话,将其放在较高的EEE RAM地址那。这个优先级只对挂起的EEE数据有作用,当正在编程较低地址的数据时,即使更高地址的EEE RAM被写入,它也必须等待进行中的那个编程过程完成。

    存储控制器CCOB命令,如那些用于编程用户D-falsh的和用于禁用编程EEE NVM的,有比挂起的EEE数据更高的优先级,并且不会和EEE活动产生冲突。

    小心:
    当EEE子系统正在访问D-flash时,任何 CPU对用户D-flash分区数据的读取都有损坏数据的风险(见 “访问用户D-flash的考虑”)。

    监控EEE活动

    ETAG寄存器保存着挂起的EEE数据的计数值(EEE RAM中还没有被存储控制器读取的新数据)。写入EEE RAM会自动地递增ETAG值,所以只要里头的值不是0就表明有挂起的EEE数据。ETAG计数值会在每次存储控制器从EEE RAM中读取数据时递减,而不是在成功把数据编程进EEE NVM后,所以即使ETAG的值为0也不代表所有的新EEE数据已经被编程进EEE NVM了。

    在任何存储控制器活动期间会置位MGBUSY标志位。当ETAG为0且MGBUSY标志位被清零,则说明所有挂起的EEE数据已经被编程并且所有的CCOB命令已经完成。

    代码示例:

    while((ETAG > 0) || (MGBUSY == 1)){ /* wait for EEE to */
    }                                    /* to finish */

    这两个元素,MGBUSY标志位和ETAG计数值,会由存储控制器自动地管理,并且是独立的,不依赖于任何活动的耗时。

    重置活动

    重置释放

    在系统通知了重置事件后,FTM重置序列就会作为MCU重置的一部分被激活。这包括core-hold阶段(CPU不活跃)以及之后的core-active阶段(CPU运行指令)。

    FTM重置序列可以被当做一个隐藏的FTM命令,执行时CCOB寄存器被锁定并且在完成时会置位CCIF。在这个序列中

    • FTM在忙,无法执行存储控制器命令
    • EEE RAM不可访问

    每个重置阶段都有相关的EEE活动。在core-hold阶段

    • EEE保护(EPROT寄存器)被配置
    • ERPART/DFPART配置被检查以确定是否配置过EEE分区

    CPU 内核锁定会在完成时被释放。如果在EEE配置期间探测到了任何错误,可以通过MGSTAT的位来确定是什么问题。

    在core-active阶段

    • EEE挂起计数器被清零
    • EEE数据被从NVM EEE拷贝到 RAM EEE

    在完成时,CCOB寄存器会被解锁,FSTAT寄存器中的CCIF标志位会被置位,在重置过程中探测到的任何错误也会在对应的MGSTAT位(很可能是ACCERR位)被置位。

    小心:
    如果CPU在CCIF标志位置位之前访问了任何EEE RAM地址,CPU将会停机直到FTM重置序列结束且RAM数据有效。
    小心:
    如果在这个序列结束之前企图发起FTM命令,命令会被无视。

    重置耗时

    重置耗时主要受到EEE拷贝和EEE NVM分区的大小影响。比如,配置所有128 D-flash扇区为EEE NVM并使用一个4MHz晶振并且没有使用IPLL(即总线频率2MHz),则core-active阶段会占用大约100ms。

    重置耗时与总线频率成线性相关,使用IPLL可以大大地降低core-active阶段的时间。IPLL模块的典型锁定时间(lock time)大约为200μs;在重置后立刻配置IPLL(比如,在加载栈指针后的C startup例程里的最开始)并尽快选择它为总线时钟可以最小化core-active阶段的时间占用 — 上例(所有D-flash都被配置为EEE NVM)在50MHz总线时钟时耗时可以降低到<5ms。

    重置断言

    在任何重置的断言(assertion)时,所有的存储控制器活动都会立即停止。任何挂起的EEE RAM数据都会丢失。任何进行中的EEE NVM编程也很可能不完整,新的EEE NVM记录也可能丢失。

    在这种情况下,如果挂起的数据没有被成功地编程进EEE NVM中,重置后的EEE RAM值会恢复到最后的那次成功编程进EEE NVM的值,或者,要是这是第一次写入EEE RAM地址,就会恢复到0xFFFF。

    如果重置或下电是应用程序故意所为的话,为了不要丢失最后的EEE数据值,EEE应该在断言重置之前被禁用或者被允许完成所有挂起的数据的编程。

    记录系统 的格式

    EEE分区命令逻辑上地把为EEE分配的物理D-flash扇区设计为一个用环形缓冲区管理的归档系统。

    扇区头

    每个扇区的起始都有一个包含两个字的头字段,这头字段定义了它的状态和擦除计数。扇区头格式被设计为能:

    • 让所有的状态转换使用单个编程操作来完成
    • 高效地使用D-flash ECC
    • 探测EEE重置条件
    • 基本地追踪扇区擦除计数(高达65534)

    数据记录

    EEE 数据被连续地存储在EEE NVM扇区内。每个EEE NVM数据记录都包含两个字段:

    • 一个16位的地址标签字段 — 指示与数据相关的EEE RAM字的地址
    • 一个16位的数据字段 — 与EEE RAM地址相关的数据

    数据记录会在需要时在下一个有效的EEE NVM记录位置被创建。EEE RAM数据与其在EEE NVM分区内对应的有效数据记录没有任何固定的位置关系。

    EEE NVM数据流

    数据记录管理流被设计为:

    • 使用单个编程操作来生成记录
    • 高效地使用D-flash ECC
    • 在重置之后探测EEE状态

    EEE NVM分区中的每个扇区都处于以下状态之一

    • 包含数据记录
    • 准备完毕(被擦除)
    • 在编程错误或者擦除错误后被标记为无效(并会被EEE流跳过)

    以下描述考虑了两个特定的包含数据记录的扇区

    • 数据记录正在被编程的扇区,Active扇区
    • 包含最旧的数据的扇区,Oldest_0扇区

    EEE Flash扇区组织结构
    图 3.EEE Flash扇区组织结构

    新写入EEE RAM的数据会生成新的EEE NVM记录,这记录会按序追加到Active扇区。

    会维持4个准备完毕状态的扇区,它们处于被擦除状态。它们会被一个自动的周期性的 拷贝/擦除 进程(数据清理)用作写缓冲区,这个进程会在每个扇区被填满新数据记录后恢复那些包含过时的旧数据记录的扇区。有这4个准备完毕状态的扇区使得错误条件能被清晰地管理。

    数据记录循环

    Active扇区被填满后,当需要编程下一个记录时:

    Ready_0 成为 Active扇区
    Ready_0+1 成为新的 Ready_0
    Ready_0+2 成为新的 Ready_0+1
    Ready_0+3 成为新的 Ready_0+2

    会启动一个数据清理周期以从Oldest_0数据扇区恢复任何有效的数据记录以释放空间并让它成为新的Ready_0+3扇区。

    数据清理周期会自动地创建Oldest_0中有效数据的新拷贝到新的Active扇区中。这样,冗余的Oldest_0被擦除并被配置为新的Ready_0+3(为了维持4个准备完毕状态的扇区)并且Oldest_0+1成为了新的Oldest_0扇区。在获得新的拷贝之前不擦除旧的有效数据是很有效率的方案。

    用这种方式,这组准备完毕的扇区随着新数据记录的创建在EEE NVM中不断前移。当碰到EEE NVM中最后一个扇区后,就循环回分区中的首个扇区,以此类推。

    这个环形特性有许多的优点:

    • 最大化flash的使用
    • 所有扇区的擦除次数很平均
    • 没有用于无效的旧数据的 写入/擦除 开销
    • 对于EEE活动期间的意外重置,可以很好的恢复
    • 只要有任何变化的数据,所有数据记录都会随着时间的流逝被刷新,这样就减少了对数据持久性的需求。

    当发生了无法解决的编程错误或者擦除错误时,这个扇区会被声明无效,并被EEE流抛弃;EEE NVM中随后的循环会自动地跳过这个扇区。这被叫做抛弃的扇区或死区。

    记录系统 的状态

    在系统重置之后,可以检查FSTAT错误标志位来查看是否发生了EEE重置错误。

    可以在重置活动后的任意时刻执行EEE查询命令来评估记录系统的状态。

    EEE流中抛弃了大量的扇区的状况被认为是个极端状况,是由于D-flash的使用已经超过了它的运行寿命。如果发生这个情况,就会生成一个错误标志位,表明EEE已经用不下去了。

    EEE可以管理的丢弃的EEE NVM扇区的数量被限制为最多24个(或者如果(128–DFPART)<= 28时的最大有效值)。对于更小的EEE NVM配置,允许抛弃的扇区数就更少了。

    比如,当ERPART = 3且(128–DFPART) = 24时,允许抛弃的扇区数最多为13个,否则EEE就会产生格式错误。

    管理EEE状态的一个更可控的推荐方式是使用EEPROM 模拟查询命令来监控抛弃的扇区数并在超过25%的分配给EEE的扇区损坏时通知系统错误。

    EEE CCOB命令

    有5个与EEE相关的CCOB命令:

    • 完全分区D-flash(Full partition D-flash) — 擦除和配置EEE记录系统(只在特殊模式下可用)
    • 分区D-flash(Partition D-flash) — 配置EEE记录系统
    • 使能EE模拟(Enable EE emulation) — 开启EEE NVM记录编程
    • 禁用EE模拟(Disable EE emulation) — 关闭EEE NVM记录编程
    • EEE查询(EEE Query) — 报告EEE参数和状态。
    注意:
    分区D-flash命令 和 EEE查询 命令在xM22E掩码组上不可用。

    分区D-flash命令 用于配置分配给EEE的资源和底层格式化EEE(为默认的擦除后的值0xFFFF)。分区存储着EEE配置参数并在每个EEE NVM扇区初始化头字段。

    有两个版本的分区命令,一个可以重分区EEE,是用于生产编程阶段和开发的;而另一个只可以分区一个已经被擦除的设备,是为了支持普通模式下的被boot loader程序或者被个由bootloader下载的应用程序初始化配置用的。在应用的生命周期间必须运行分区过程一次以分区EEE/D-flash。

    注意:
    不支持在普通模式下对EEE重分区。

    如果应用程序不需要EEE,设备应该预先配置EEE为0(ERPART = 0,DFPART = 128)以避免在应用程序中意外地对EEE进行了分区。

    完全分区D-flash

    这不是一个应用程序级别的命令。它只在特殊模式下可用,并且应该在设备首次编程时被执行。

    它会擦除所有的D-flash并初始化EEE资源。

    对于产品化的设备,只应该运行它一次以根据应用程序定义设备的EEE的大小。

    在开发过程中,这命令可以被运行多次。

    小心:
    这条命令会擦除整个D-flash,所以一定要在使用编程D-flash命令将任何应用程序静态数据编程进D-flash之前先执行这个 完全分区D-flash 命令。

    分区D-flash

    这是一个应用程序级别的命令,可以在普通模式下执行。它是用于支持串行bootloader和应用程序配置一次EEE的。

    它会初始化EEE资源。

    应该要运行它一次以配置EEE。

    想要它执行成功地话,只有在D-flash分区信息是默认的工厂装箱状态或者设备被用FTM擦除所有块命令大块的擦除后(只在特殊模式下可用) — 比如,当EEE还没有被分区。如果D-flash块没有被完全地擦除,它会产生一个ACCERR标志位。

    小心:
    这个命令要求D-flash被完全地擦除,所以一定要在使用编程D-flash命令将任何应用程序静态数据直接编程进D-flash之前先分区好D-flash。
    注意:
    D-flash和P-flash的标准装箱条件是在禁用加密下将其擦除;然而,我们推荐在工厂编程(factory programming)前擦除每个块或扇区,这样就能确保用到全部的数据保持能力。

    使能EE模拟

    在存储控制器重置过程完成后或者使用禁用EE模拟命令后,EEE应该会处于空闲状态。写入EEE RAM会递增挂起数据的计数,但是存储控制器不会把记录编程进EEE NVM。

    在执行完这条命令后,EEE应该会处于活跃状态,会为新的EEE RAM数据生成EEE NVM记录。

    这个命令可以在FTM重置活动完成后的任意时刻运行,它:

    • 会处理之前因为重置而抛弃的任何EEE NVM活动。
    • 使得存储控制器能够应答挂起的EEE数据并编程EEE记录到EEE NVM中。

    没有用于表明EEE是在使能状态还是禁用状态的标志位。即使已经使能了,再次执行 使能EEE命令 也没什么关系。

    禁用EE模拟

    使用 禁用EE命令 能确保EEE处于空闲状态。这是重置之后的EEE默认状态。

    当命令完成后,EEE应该会在暂停状态。挂起的EEE RAM数据不会产生EEE NVM记录。在使用 禁用EEE命令 后重新执行 使能EEE命令 会使得挂起的EEE RAM数据继续被编程为EEE NVM记录。

    禁用命令 可以在FTM重置活动完成后的任意时刻执行。它会阻止挂起的EEE RAM数据产生EEE NVM记录。

    没有用于表明EEE是在使能状态还是禁用状态的标志位。即使已经禁用了,再次执行 禁用命令 也没什么关系。

    EEE查询

    EEE查询命令会向应用程序汇报EEE的许多参数。

    这些参数表明EEE资源的配置(比如分区信息)和EEE记录系统的状态。

    查询EEE命令 可以在FTM重置活动完成后的任意时刻执行。建议在任意的重置之后执行这个命令,以防有任何EEE错误。

    它会按以下五个子部分详述EEE状态信息。

    DFPART配置

    表明分配给用户D-flash的D-flash扇区的数量。

    可以用这个来对比应用程序预期的配置。这个检查的主要目的是确定EEE按照预期的那样分区,并且没有人为错误导致的问题。如果D-flash没有被分区或者分配给了zero EEE的话会返回0xFF。

    ERPART配置

    表明分配给EEE RAM的128字缓冲RAM区块的数量。

    可以用这个来对比应用程序预期的配置。这个检查的主要目的是确定EEE按照预期的那样分区,并且没有人为错误导致的问题。

    (当前的Ready_0扇区的)ECOUNT值

    报告下一个可用Ready扇区(即Ready_0扇区,见”EEE NVM数据流”)已被擦除过的次数。

    EEE查询命令返回的擦除计数典型地反映了EEE NVM中D-flash扇区的磨损程度。随着准备状态的扇区组(随着新数据的写入)在EEE NVM中不断的前移,不同查询命令返回的值一般是不同扇区的。在理想状况下,所有扇区的擦除计数会很接近,在每次横跨EEE NVM分区的循环后递增。每个扇区的ECOUNT值不会溢出,它会在增长到65534的时候停止增长 — 这数字已经超过了D-flash预期的50K次擦除限制了。

    但是,如果在重置发生的时候正好在进行着数据清扫周期对扇区的更新操作,扇区的擦除计数有可能会丢失,并在下一个EEE使能命令后被重置为0。然后会重新从0开始增长。这对EEE倒是没有什么影响,因为EEE流并不在乎擦除的次数。

    在这种情况下,由EEE查询返回的那些由于重置而损坏擦除计数的扇区的计数值就无法反应EEE NVM的真正磨损程度了。除非能确保EEE活动中不会发生重置,应用程序不应该依赖于查询命令所返回的擦除次数,而是应该进一步检查这个值,比如在每次重置后保留查询返回的值,并将EEE查询返回的值与备份的值进行比对,以防扇区计数被重置了。以及/或者 周期性地运行查询EEE命令并保留对跨多个扇区的最大ECOUNT值的追踪。

    当前弃用的(或死的)扇区数

    报告被EEE弃用的扇区的数量,也就是那些由于编程操作或者擦除操作失败而被EEE弃用的扇区。

    推荐把分配给EEE NVM的总扇区数的25%被弃用作为一个系统错误来报告。比如,当这个数字大于0.25 * (128-DPFART)。见 “记录系统的状态” 以了解更多关于可弃用扇区最大数的细节。

    当前准备完毕的(或已擦除的)扇区数

    汇报准备完毕的EEE NVM扇区数,能够在 拷贝/擦除 周期中编程进数据的扇区。在大部分条件下,会有三个或四个。最起码会有一个。

    数据考虑

    跨RAM字边界的数据一致性

    由于EEE RAM是以字为基础存入EEE NVM的,需要考虑数据一致性。在EEE RAM中的任何跨字边界的数据元素都会被跨多个记录存储,并且在存储过程中如果发生了重置,有可能会损坏。

    比如,一个四字节长的long变量的位于奇地址边界,它会被存储在连续三个独立的EEE NVM记录中。如果第一个数据记录编程成功后,在编程第二个的时候发生了重置,那么这个long变量就出问题了。当前的EEPROM实现并没法发现这个变量出问题了,只能在应用级别进行验证,比如,拷贝多次或使用NVM标志位的方法。

    单字节数据元素和字对齐数据元素就不用考虑这个限制了,因为EEE设计时考虑到了它们的数据一致性。

    小心:
    只包含单字节宽和字宽数据元素的复合高等数据结构应该要排好序以保证所有的字元素对齐偶数地址边界。

    使用EEE存放常量数据

    数据清扫机制这个特性意味着常量数据的记录也会随着动态数据的刷新被周期性地拷贝。

    当需要编程一个新的记录并且所有在最旧扇区内的记录都是有效的数据(比如,因为它是常量数据,这个数据没有更新的记录),那么整个扇区都会被拷贝却没有释放任何空间。

    因此,大量的常量数据会导致在数据清扫周期拷贝和擦除许多扇区,导致相对久的清扫周期。

    如果在下电时需要保证所有数据已经被保存的话,一定要考虑它。因为常量数据的重复拷贝还会导致写周期的缓慢并会影响应用程序的写入次数。

    这对应用程序存取数据的耗时没有影响,但是会影响在下电之前等待所有挂起的数据被编程完毕的最大预期时间。

    在这种情况下,你应该直接存储常量数据到P-flash或者用户D-flash中而不是EEE中。

    使用D-Flash存放紧急数据

    数据清扫行为需要考虑的另一个因素是EEE编程紧急数据到EEE NVM中的延迟。如前所述,在编程新EEE NVM记录时如果需要,会进行数据清扫(拷贝/擦除)周期,并且特别是在有常量数据时,可能不止需要一个连续的周期。这会导致一条EEE NVM记录需要很长的编程时间。

    在这个活动进行中,其他新的EEE RAM数据不会被立刻编程进EEE NVM中。但是,可以提交存储控制器命令,可以在连续的数据清扫周期间通过执行 禁用EE模拟命令 暂停EEE。然后紧急数据就可以被编程进P-flash和用户D-flash中了。

    即使没有禁用EEE也可以执行编程P-flash或D-flash命令,但这样会与EEE对flash的编程产生争抢而可能导致编程延迟。

    当有必须在特定条件下被紧急编程进NVM的数据时,推荐直接把它存进P-flash或用户D-flash中,而不是EEE中。

    避免常量数据块

    数据清扫周期会拷贝当前最旧的那个扇区中的所有仍然有效的数据到第一个可用的准备完毕扇区中。所有的常量数据记录都会被拷贝,这样就会继续留在扇区中。通过跨记录系统铺展常量数据,可以最小化在一个数据清扫周期中需要连续的数据清扫周期的可能性。

    为了这样做,我们需要确保这个数据不被连续的编程进EEE NVM。典型地,在EEE分区后或者在生产编程期间,所有的EEE数据的初始值都将被编程进EEE RAM中。这个初始化数据集对应的EEE NVM记录的顺序可以通过它们写入EEE RAM的顺序来控制。

    最简单的方法是适当地交错常量数据记录与动态数据记录。每个EEE NVM扇区有63条数据记录。当初始化EEE数据到EEE RAM时,应该按在以下顺序写入:

    1. 写(% 常量数据 * 63)常量数据字
    2. 写(% 动态数据 * 63)动态数据字
    3. 等待EEE完成编程(在每63字写入序列之后)
    4. 重复步骤1以初始化所有的EEE RAM数据位置

    步骤3很重要,因为在循环中连续地写数据到EEE RAM中会导致记录被按照EEE地址优先级被存储,而不是按照他们被写入EEE RAM的顺序。

    访问用户D-flash要考虑的

    当EEE被激活时,读取D-flash用户分区的行为可能会被EEE访问EEE NVM的活动打断。

    为了避免冲突,在读取D-flash数组之前使用禁用EE命令来暂停EEE。或者还可以,检查ETAG值和MGBUSY标志位是否是0(表面存储控制器在空闲状态) — 以确定没有挂起的EEE NVM活动。

    当EEE被激活时,对D-flash用户分区的编程是由FTM优先级清晰的管理的。

    请考虑在启用EEE前把所有的常量用户D-flash数据拷贝到RAM中。

    写入周期

    传统上,EEPROM的定价是由写入/擦除周期的次数限制决定的,因为每次写入都需要一次擦除。由于EEE的循环特性,考虑EEE RAM的总有效写入次数是很合理的,当还处于每个EEE NVM D-flash扇区50k次擦除周期内时。

    EEE的一个写入周期可以被定义为:会产生一条新的EEE NVM数据记录的对EEE RAM地址的任何写入。

    写入EEE RAM的字不对齐数据会产生两条数据记录,这必须每次都被当做两个写入周期。这是要避免字不对齐数据的另一个原因。

    EEE实现本质上使用了Wear leveling算法。

    因为这是最简单的,大约8:1的EEE NVM:EEE RAM分区比例会导致每个EEE RAM字地址对应大约4个NVM数据记录。

    一般情况下,实际的EEE写入周期性能不会是 EEE NVM与EEE RAM分区比例 的一个简单的函数,而是与 用到的EEE RAM字数据与EEE NVM分区的大小的比例 关系更大。比如,如果只使用一个EEE字数据,却使用了16K字的EEE NVM,会导致实际的EEE NVM:EEE RAM为16384:1。

    然而,EEE数据大小:EEE NVM分区大小 并不是全部参数。EEE中数据的更新率也是函数的一部分。更新更频繁的数据会比没那么频繁的数据产生更多的EEE NVM记录。

    还有,由于记录系统的循环特性,常量EEE数据的EEE NVM记录也会被数据清扫进程周期性地进行拷贝,会导致额外的 写入/擦除 开销。

    由于这许多相互关联的参数,根据给定的数据需求来计算写入荷载超出了这篇文档的大纲。然而,可以使用S12XE_EEE_Calculator工具来评估,可以在www.freescale.com的S12XE design tools 页中下载它。

    当前的MC9S12XEP100规范中,对于使用D-flash的所有全部16K字只用于EEE RAM中的一个字对齐数据这种情况(EEE NVM:EEE RAM = 16384),保证在汽车温度范围内,最少325百万次写入周期和平均3200百万次写入周期。

    MCU系统的考虑

    状态标志位组

    关于FTM故障探测覆盖率

    FTM和EEE子系统上专业的故障探测是为了确保应用能在发生任何故障的时候都能获得通知。这不是因为S12XE flash技术的故障率很高。

    起码在发表这篇文章的时候,这个flash的所有测试数据都证明它特别可靠,故障率很低。

    EEE 标志位总结

    这个部分提供了EEE专用错误报告的总结。如果使用了EEE,推荐启用flash错误中断来处理错误标志位,因为他们中的许多都表明发生了关键的EEE故障。

    EEE关键故障标志位

    以下标志位要是有任意一个置位了,都说明存在关键的问题。只要置位了一个,就应该认为EEE没法使用。

    访问错误(ACCERR)位会被以下置位:

    • 如果在没有定义EEE分区时使用了 使能EEE和弃用EEE命令。
    • 如果调用任意分区D-flash命令时指定了不合理的分区比例。
    • 如果没有定义EEE分区却调用了使能EEE命令
    • 在FTM重置序列中初始化EEE RAM时遇到了错误。

    在以下行为会在重置之后置位MGSTAT0和MGSTAT1:

    • 如果EEE分区已经定义了,却调用了分区D-flash命令。
    • 读取EEE分区信息时发生无法恢复的故障 — 这种情况下,EEE会被禁用,ERPART被设为0x0000,DFPART被设为0xFFFF
    • 在读取flash配置字段中的EEE保护字节时探测到了双bit错误 — 这种情况下,EPROT寄存器会加载0x7F,也就是EEE RAM被完全保护。

    当在重置之后探测到了MGSTAT位被置位了,考虑使用COP来产生一个系统重置或者使用一个非法访问以重启重置序列。

    以下两个标志位报告了关键的运行状况,应该认为EEE子系统运行缓慢。EEE RAM数据可以被继续地读写。在这些位被置位的时候,会阻止编程EEE记录到EEE NVM中。

    EEE 错误中断0(ERSVIF0)标志位会被置位,如果

    • 存储控制器无法重新格式化某个EEE NVM扇区
    • 没有可用的准备完毕状态扇区
    • 发生编程或擦除故障的数据扇区已经达到最大限制数量(见”记录系统的状态”)。

    EEE 错误中断1(ERSVIF1)标志位会被置位,如果

    • 存储控制器无法改变某个EEE NVM扇区的状态。

    EEE警告标志位

    以下标志位典型地报告了会导致从EEE流中抛弃一个扇区的状况。EEE可以继续工作,直到抛弃的数量达到极限或者没有可用的准备完毕状态扇区了。

    EEE擦除错误中断标志位(ERSERIF)会被置位,如果

    • EEE擦除操作失败。扇区会被EEE抛弃

    EEE编程错误中断标志位(PGMERIF)会被置位,如果

    • EEE编程操作失败。扇区会被EEE抛弃

    当这两个标志位之一被置位时,可以用 查询EEE命令 来确定当前可用的和抛弃的扇区数并通知系统发生了错误(见 “EEE查询”)

    保护违反

    这个标志位是EEE的系统等级错误标志,而不是一个EEE子系统标志位。

    EEE保护违反标志位(EPVIOLIF)会被置位,如果

    • 有想要写入被EPROT设置保护的EEE RAM区域的行为。写操作会被阻止并且不会影响EEE活动。

    EPROT寄存器定义哪块EEE RAM区域受到写保护,它不保护对D-flash的访问。D-flash的EEE NVM区域是被自动保护的。

    EEE和D-Flash ECC

    单bit错误能自动被ECC校正,这样读取的就是正确的数据。所以EEE不会报告单bit错误。

    数据记录上的双bit错误是由EEE管理的。他们不会直接被直接标记为ECC读取错误。

    当在编程一条数据记录的任何部分时发生了重置,就有可能发生一个双bit错误。一条记录含有两个16位数据字段和两个ECC syndromes,而重置可能发生在编程它们中的任意一个时发生。EEE重置恢复流会认为带有ECC故障的记录是由于重置而损坏的记录,并清晰地管理它们。

    对于由于重置而中断的记录编程,EEE会认为它是在重置之前它还没有被编程进EEE NVM的挂起的EEE RAM那样(而在传统的EEPROM中,如果在编程数据时发生了重置,很可能会发生数据损坏或者数据边际编程)。

    当探测到双bit错误时,拷贝进程会认为记录损坏了并直接忽略它。损坏的数据记录中的数据和地址信息都是不可信的,所以无法得知到底是哪个EEE RAM地址的数据损坏了,也无法得知正确的数据值到底是什么。

    D-flash编程操作包含一个边际验证(margin verify),因此D-flash的数据可靠性很棒。由于EEE NVM数据被周期性地修改,EEE方案会随着时间刷新所有的数据记录(通过数据清扫机制)。尽管如此,D-flash数据的保留时间还是要考虑的,特别是在有可能长期不使用EEE或者数据循环率特别低的情况下。

    低能耗模式

    等待模式或者背景调试模式对FTM没有任何作用。

    如果MCU正在执行一个停止命令:

    • 任何进行中的CCOB命令会在进入等待模式之前完成。
    • 在启用EEE时,任何挂起的EEE数据仍然会在存储控制器停止活动、系统时钟停止之前被编程进EEE NVM。

    时钟的考虑

    FTM状态机的时钟来自于系统总线时钟,而底层NVM时钟(用于编程和擦除脉冲)则来自于外部振荡器。

    在所有的NVM操作期间,包括所有EEE活动和重置之后的EEE拷贝,使用一个更快的总线时钟可以最小化FTM耗时。

    由于S12XE上的IPLL模块并不需要外部组件,可以在任何硬件上启用它。底层(flash硬件)编程和擦除时间不依赖于总线频率;因此,不使用IPLL也不会影响FTM编程和擦除功能,尽管会加长命令执行的时间。IPLL锁频所需要的时间总是比EEE数据拷贝过程短,因此通过在启动代码中,重置并初始化栈指针后,立刻使能和选择IPLL能够大大地加速拷贝过程(见 “重置耗时”)。

    小心:
    FTM时钟需要振荡器时钟;因此,在快速唤醒或者自时钟(self-clock)模式下,任何需要编程或擦除的FTM操作都是不支持的。
    在使用快速唤醒模式时确保不要启用EEE。
    在自时钟模式中断例程的一开始就禁用EEE。

    调试的考虑

    通常来说,对EEE RAM做的那些事情对于调试器应该是透明的(在拷贝活动完成后)。对EEE RAM的读写应该与对系统RAM的读写没有差别,事实上调试器确实可以把它们当成一个东西。

    在EEE拷贝过程中通过BDM读取EEE RAM可能读不到有效数据,要等待EEE拷贝完成且CCIF标志位置位之后才行。在EEE拷贝过程中应该避免通过BDM写EEE RAM。其实这不太可能发生,因为尽管调试器可能会在重置之后立刻刷新展示窗口,但它应该不会往EEE RAM中写入数据。

    当你要调试任何EEE NVM管理活动时,比如检查ETAG值和MGBUSY标志位,要明白以下方式有助于避免冲突。

    存储控制器的运行是独立于CPU和XGATE的,它没有冻结模式,因为如果存储控制器的时钟在flash阵列上为高电压时被停止了,可能会对flash造成损害。对于任何HC12/S12/S12X NVM状态机包括EEPROM编程都是这样的。可以通过在CPU停止同时EEE启用时通过BDM写入EEE RAM来观察到。EEE NVM记录会被编程,并在下电后新的数据仍然会保留。

    这个的副作用就是在开发过程中即使你暂停了CPU(通过断点或者单步调试),存储控制器也不会停止,它会继续运行直到编程完了全部挂起的数据。断点时的系统状态,由于调试器需要一段时间来读取,可能与真正的实时状态不一样。比如,如果应用程序中有一个循环测试 ((ETAG > 0) || (MGBUSY == 1)) ,然后你单步调试它,它会在第一次就通过这个测试;然而如果不是用单步测试的话,实际上会循环多次。如果你使用循环来等待CCIF由状态机或一个外部EEPROM置位,对于S12 EEPROM也会是这样的情况。

    还要考虑FTM的重置活动。重置CPU为特殊单芯片模式(比如,通过BDM缆)会导致CPU进入BDM active模式而等待BDM的命令。FTM重置序列会在重置之后花费一段时间来完成EEE拷贝。开发工具的活动或者脚本必须在执行重置之后先验证CCIF位被置位,然后再去执行FTM命令或者访问EEE RAM。在第一种情况下,命令会被忽略。第二种情况下,读取的EEE RAM数据直到CCIF标志位置位前都是不可信的。推荐在任何重置之后还要检查下FSTAT寄存器中的错误标志位。

    EEE耗时的一些注释

    在普通运行下,EEE重置过程完成后,对EEE数据的访问耗时就是对EEE RAM的读或写。重置耗时在”重置耗时”中进行了描述。

    在高层,EEE记录编程的耗时是无法预测的,依赖于 拷贝/擦除 机制。正在存储到NVM中的挂起数据的状态只可以由ETAG值和MGBUSY标志位的状态来判断。见 “监控EEE活动”。

    在这篇文档发表的时候,每个EEE命令和活动的耗时计算公式可以在S12XE data sheet中找到。EEE耗时取决于 NVM 写入/擦除 和 数据处理 活动。一个参数是固定的,由flash阵列的物理特性以及固定的振荡器时钟频率决定。另一个参数与总线频率成比例,所以在使用EEE时使用尽可能快的总线时钟总是个好事。

    在更快的总线时钟下,编程一个字数据记录到EEE NVM中的平均时间会比在0.25μ S12X EEPROM中修改一个字的时间明显的快(在50MHz fbus时,一个NVM记录的平均时间<1ms)。而FTM编程任意独立数据记录的操作的时间则不一定是快点还是慢点,这是由于数据清扫机制(在这里会产生拷贝和擦除的开销)的周期性特性。当存在整个扇区都是常量数据的时候这点就特别明显(对于EEE数据需要在下电之前被写入的场合中,这是首要考虑因素)。对于那些极少或没有扇区包含常量数据的情况,更快的总线速率通常会使在EEE中更新2K字比在传统的EEPROM中快。

    如”使用EEE存储常量数据”中所述,碰到一个装满常量数据的EEE NVM扇区会产生额外的拷贝/擦除周期。在50MHz时,每个装满常量数据记录的EEE NVM扇区会让 拷贝/擦除 周期多花费大约38ms。连续的装满常量数据记录的EEE NVM扇区会使这个时间成比例的上升。在启用EEE并修改数据时,这也决定了FTM要延迟多久才能干其他事情。

    EEE NVM擦除操作被边沿验证,可能花费 ~5ms到 ~20ms,这取决于扇区之前被擦除过的次数。这意味着EEE数据清扫周期耗时在新的设备上最快,然后随着时间以及EEE NVM擦除次数的增加会渐渐变慢。

    词汇表

    ACCERR — 存储控制器访问错误标志位。
    字对齐(Aligned word) — 处于偶地址上的16位元素。
    API — 应用程序编程接口,Application programming interface。
    BDM — 背景调试模块,Background debug module。
    缓存RAM(Buffer RAM) — 用于EEE的缓存RAM。
    字节数据(Byte data) — 8位数据元素。
    CCIF — 存储控制器命令完成中断标志位。
    CCOB — 存储控制器常用命令对象。当执行FTM命令时的常用寄存器。
    常量EEE数据(Constant EEE data) — 从不或者极少被应用程序更新的EEE数据
    Core active阶段 — 重置序列中CPU内核在运行的那部分
    Core hold阶段 — 重置序列中CPU内核不在运行的那部分
    CPU — 中央处理单元,Central processing unit
    数据清扫周期(Data clean-up cycle) — EEE D-flash扇区 拷贝/擦除 操作。
    D-flash — 被优化用于NVM数据存储的Flash存储器。
    DFPART — 分配来给应用程序直接访问的D-flash扇区的数量。
    ECC — 错误校正码,Error correction coding。
    ECOUNT — EEE D-flash扇区擦除计数。
    ECU — 电子控制单元,Electronics control unit。
    EEE — 模拟EEPROM子系统
    EEE RAM — 分配给EEE的缓存RAM
    EEE NVM — 分配给EEE的D-flash
    EEE分区(EEE Partition) — EEE资源配置。
    ERPART — 分配为EEE RAM的256字节缓存RAM区块的数量。
    EEPROM — 电可擦可编程只读存储器,Electrically erasable programmable read-only memory。
    EPROT — 存储控制器EEE保护寄存器。
    ETAG — 包含挂起的EEE数据计数器的存储控制器寄存器。
    FTM — S12XE NVM和存储控制器模块。
    FTR — EEE配置flash比RAM比例。
    FERSTAT — 存储控制器flash错误状态寄存器。
    FSTAT — 存储控制器flash状态寄存器。
    IP — 知识产权,Intellectual property。
    IPLL — 带内滤波器的锁相环。
    MGBUSY — 存储控制器忙标志位。
    字不对齐 — 处于奇地址上的16位元素。
    NVM — 非易失性存储器,Non-volatile memory。
    NVRAM — 非易失性RAM,Non-volatile RAM。
    RAM — 随机访问存储器,Random-access memory。
    系统RAM(System RAM) — CPU和XGATE数据使用的主RAM。
    用户D-flash(User D-flash) — 应用程序直接可用的D-flash扇区。
    用户RAM — 没有分配给EEE的缓存RAM
    Wear leveling — 一项用于最大化EEE NVM写入/擦除性能的技术。
    字数据(Word Data) — 作为16位元素访问的数据。
    ‘G — S12X全局地址的标记
    0x — 十六进制的标记

    展开全文
  • 实验例程视频和PPT-EEPROM24C02实验.zip(视频2-使用I2C总线的24C02怎么操作、视频1-I2C总线的原理和程序模拟、I2C总线协议、EEPROM实验等)
  • 1.今天在调试项目电路板时,发现EEPROM怎么都无法正常读写,更换了一颗相同型号的24C02芯片,还是不能正常读写; 2.电路板是重新打样的,对应的程序没有变更,因此问题应该出现在硬件上; 3.经过对原理图的检查,...
  • 44b0实验-通过IIC总线读写EEPROM实验

    千次阅读 2010-08-07 14:44:00
    不过有一点我需要解释下:EEPROM的slave address是怎么确定的呢?查看EEPROM芯片24C08的手册,发现有个Table 3. Device Select Code如下(注意我们使用的芯片M24C08这一行)查看了一下硬件电路图,我发现管脚E2是...
  • 为什么单片机中既有FLASH又有EEPROM

    千次阅读 2017-09-17 13:57:48
    单片机运行时数据都存储在RAM中,在掉...这就需要使用EEPROM或FLASHROM等存储器来实现。 ROM最初不能编程,出厂什么内容就永远什么内容,不灵活。后来出现了PROM,可以自己写入一次,要是写错了,只能换一片。随着不断
  • 终于知道怎么设置自动补全代码了。 本实验利用串口通讯观察实验结果。 准备一些数据->串口输出展示->使用IIC->写入EEPROM->稍等->使用IIC->读取EEPROM->校验结果->串口输出展示 #include...
  • FLASH和EEROM使用【转】

    2018-10-26 11:53:00
    最近在看代码的时候,遇到了一个使用FLASH模拟EEPROM的情况,看到这个我当时是一脸蒙蔽啊,对于一个有时候连FLASH和EEPROM都分不清的人来说,怎么可能读懂用FLASH来模拟EEPROM呢?这段程序看的真是如浏览天书一般。...
  • 使用环境:我这里是操作mpu6050,如果是操作eeprom是没有问题的,基本随便怎么干都没问题,操作mpu6050有问题的朋友可以过来看看,这里在硬件iic上前前后后花费了很多的时间和功夫,中间也遇到各种问题也解决了各种...
  • S32K144之FlexNVM详解

    2020-08-13 15:38:18
    1、使用RAM模拟EEPROM,在NVM里面备份,最大模拟4K EEPROM,NVM使用32K和使用64K备份,有什么区别 2、如果NVM使用了32K备份,那么剩下的32K拿来干嘛? 之前也一直没有细看过,于是仔细地去看了看,总结记录如下,...
  • 这个文档描述了怎么使用CodeWarrior的调试器在D-Flash/EEPROM中加载初始化的变量。这个特性只用于**large**地址模型。
  • 以前写的一个项目,通过USB把MCU的程序下载到EEPROM中保存(这个是上位机程序);...软件要求通过授权文件的方式进行授权使用怎么处理授权可以看说明及源程序)。 用到了CSV文件的读取,ini文件读写。
  • 我最近在调试9054+FPGA...一个问题是我使用PLX软件能够检测到9054,并且可以配置EEPROM,但是往local地址写东西,发现怎么也写不进去(FPGA在调试状态下检测LHOLD 和LA[31..2],没有波形)。楼主有没遇到过这种情况??
  • 那么传递到ECU的哪段地址呢,这个是要设计时预先对memory进行分配好APP和数据区域,确定好flash的各个区段是怎么划分给那部分使用的(boot区,app区,标定数据区,eeprom区); ...
  • Linux Intel网卡IGB驱动修改mac地址

    千次阅读 2018-12-20 17:58:03
    实然心血来潮,想研究一下Intel网卡mac地址是怎么设置的。本文使用IGB驱动,适合于i211等网卡。 MAC地址对于网络来说十分重要,观察过几个网络驱动,发现在Linux内核中,MAC来龙去脉无非以下几个: 1、通过某种...
  • I2C协议与AT24C02学习

    千次阅读 2018-03-25 16:58:10
    目录 目录 ...EEPROM学习 ...需要驱动磁力计,使用的I2C总线,所以博主只能拿起正点...记得以前博主的同学说,面试的时候让他讲出I2C还是SPI总线的大体过程,那时候还是啃linux的东西,心想怎么可能知道,这么复...
  • RAM与FLASH

    2017-05-02 17:49:00
    以前一直使用STM32但是对 变量 或 函数 的存储域没做任何了解;只知道你需要存储的东西就放在Flash的后面几页就好了;这次接触到STM8发现编译器里面有特别的存储查看器就打算看看到底是怎么存储的 我用的芯片是 STM...
  • 2、iic的特点,时序是怎么样的 3、单片机如何读取EEPROM 4、单片机如何读写flash 5、如何驱动LCD屏幕 6、会usb、can协议吗, 7、会ucos系统吗 8、线程、进程之间的关系 笔试题: 1、已知一个数组a[10],...
  • 固件安装

    2021-02-23 15:08:55
    固件(firmware)一般存储于设备中的电可擦除只读存储器EEPROM(Electrically Erasable Programmable ROM)或FLASH芯片中,一般可由用户通过特定的刷新程序进行升级的程序。 固件是指设备内部保存的设备"驱动程序",通过...
  • BootLoader刷新概述

    2021-06-05 11:14:07
    那么传递到ECU的哪段地址呢,这个是要设计时预先对memory进行分配好APP和数据区域,确定好flash的各个区段是怎么划分给那部分使用的(boot区,app区,标定数据区,eeprom区); 3,刷新的软件数据通过上位机基于各自...
  • 但是这次总是返回0x37,单步跟踪看到return的的确是0,但是返回值赋给一个变量后就变成0x37,这个驱动以前使用过没有问题,这次不知道怎么抽风了 IIC驱动是在独立C文件中,调用是在另一个文件里面,通过头文件extern...
  • 盗用IP攻防战

    千次阅读 2008-12-08 09:20:00
    众所周知,校园网或小区接入Internet,一般都使用网卡MAC地址来识别用户,假如你修改了自己网卡的MAC,即可盗用别人的IP免费上网。例如已知校园网中某合法用户的IP为202.201.101.01,要盗用该IP免费上网,...
  • 在无源传感器的第一个修订版中,我能够同时安装13.56 MHz天线和NFC eeprom存储器,这对我来说是最棒的“收获”功能! 在1.8V时,最好的情况下可获得3 mA的电流。对于这样的电位差,找到数字温度传感器并不是一件容易...
  • 今天介绍的这块电动牙刷是使用了高端的磁芯结构声波式的。 无线充电电动牙刷电路图,各功能结构图: 电动牙刷充电控制电路: 充电控制电路主要由电磁感应次级线圈、全桥整流二极管及三极管开关控制电路组成。 市面上的...
  • 使用芯片是stc12c5a60s2, 芯片信息: 8051-based microcontroller with 1T(1-clock) High-Speed Core, Dual DPTR, 36-44 I/O Lines, 2 Timers/Counters, 2 PCA Timers, Alternative build-in ...

空空如也

空空如也

1 2
收藏数 31
精华内容 12
关键字:

eeprom怎么使用