闪存和EEPROM


14

Atmega16数据表说它有

a)16 KB的系统内自编程闪存程序存储器,以及b)512字节的EEPROM。

微控制器能否有两个单独的ROM,可以通过EEPROM技术和闪存技术进行编程?

还是我从数据表中得出的推论是错误的?

我知道我们的程序存储在闪存中,为什么没有人需要EEPROM?如果我们有程序的闪存,它有什么用?

也有人可以解释什么是“系统内自编程”

我所知道的是:闪存技术可以按数据块编写程序,而EEPROM可以按字节写数据。

Answers:


21

如今,闪存用于保存程序代码,而EEPROM(电可擦只读存储器)用于保存持久数据。大约30年前,在Flash出现之前,EEPROM被用来保存程序代码。

实际上,首先是ROM(只读存储器),然后是PROM(可编程ROM,仅一次),EPROM(可被紫外线擦除的PROM),EEPROM,最后是闪存。ROM仍用于大量,低成本的应用程序(例如会说话的贺卡)。

与当前微控制器的重要区别在于,通常无法从EEPROM之外执行代码,并且程序将数据存储在闪存中很尴尬。(例如,当您在数据声明中使用“ const”关键字或定义字符串时,数据将存储在闪存中,但由编译器和链接器在后台处理该数据。)

EEPROM区域可用于保存您希望在重新引导期间可用的配置或其他数据,包括微控制器已断电然后重新上电。从功能上讲,您可以将EEPROM视为非常​​小的硬盘驱动器或SD卡。

在没有EEPROM的微控制器上,可以将持久数据存储在闪存中,但这变得很困难,因为微控制器并不是真正为此设计的,您必须找到一个不会干扰程序代码的特殊位置,并将其放在一边与链接器。另外,如下所述,您通常可以更新EEPROM的次数比刷新次数多。

如果您在Flash中对数据进行编程,这并不意味着您可以在C程序中将数据作为变量进行访问,因为无法告知编译器这些变量在代码中的位置(即,您无法绑定const)因此,必须通过用于写入它们的一组特殊寄存器来读取它们。请注意,此限制也适用于EEPROM中的数据,因此在这方面没有优势。

要对闪存或EEPROM进行编程,必须先擦除一块存储器。然后进行编程。对于闪存,通常一次也要写一个块。对于EEPROM,取决于微控制器,它可以一次以块或一个字节完成。

对于闪存和EEPROM,在耗尽内存之前,最多可以更新它们的次数。数据表中给出此数字作为最低保证值。对于EEPROM,它通常比闪存要高得多。对于闪存,我看到的数字低至1000。对于EEPROM,我看到的数字高达1,000,000。

EEPROM优于闪存的一个优点是,擦除EEPROM的次数比擦除Flash的次数多。

“系统内自编程”仅表示微控制器可以在运行时更新其自己的闪存。该功能通常用于在现场更新代码。诀窍在于,您需要在更新主程序(称为引导加载程序)的同时在系统中保留一些代码。该方案在Arduino系统中用于对芯片进行编程。


谢谢您的回复,先生。因此,要在EEPROM中输入数据,我将需要一个USBUSB编程器中的EEPROM编程器来将程序转储到闪存中?先生,我说的对吗?
Jasser

1
@Jasser不,您不需要外部程序员。您将从程序中访问EEPROM。ATmega内将有一组寄存器,通过对其进行写操作,可以使您更新EEPROM。您还需要使用这些寄存器来读出EEPROM,因为它不会显示在常规地址图中。有关如何擦除,写入和读取EEPROM的信息,请参见该芯片的数据表。
tcrosley

由于我们可以在微控制器内部的EEPROM中读写数据,因此微控制器应该具有在EEPROM内部存储数据的电路,并且该电路应类似于EEPROM编程器。这又使我想到另一个问题,因为EEPROM的写入时间大约是之后的100,000次,所以我们可能无法通过寄存器将数据存储在EEPROM内。这些陈述有意义吗?@tcrosley
Jasser

1
@Jasser正确,可以更新EEPROM的次数是有限制的。这通常比可以更新闪存的次数高得多(有时高出一个数量级)。我应该在回答中提到这一点,并将对其进行更新。您引用的数字是芯片制造商的最低保证;我曾经用规格为100,000次写入的芯片做过一些测试,在检测到任何错误之前,它进行了超过500,000次。
tcrosley

1
@Jasser是的,在Flash中设置数据要困难一些。而且,正如我对答案所做的更新中所讨论的那样,您可以对EEPROM进行擦除和重新编程的次数是闪存的许多倍(通常为10倍)。
tcrosley

4

我将在@tcrosley的出色回答中添加更多信息。

ATmega16实现了哈佛架构,即系统拓扑,其中数据存储器与程序存储器分开。引用Atmega16数据表(第8页)中的相关段落:

为了最大程度地提高性能和并行性,AVR使用哈佛架构–带有独立的存储器和用于程序和数据的总线。程序存储器中的指令通过单级流水线执行。在执行一条指令时,将从程序存储器中预取下一条指令。这个概念使指令可以在每个时钟周期执行。程序存储器是系统内可重编程闪存。

哈佛架构的优点是,在指令获取周期和数据访问周期之间没有总线争用,因为数据和指令不共享同一条总线,就像在传统的PC架构中一样。

因此,闪存用作程序存储器,而数据存储器则分为SRAM(用于暂存数据,例如函数调用堆栈和堆,例如,如果您使用C编程)和EEPROM(用于永久存储) 。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.