Atmega16 数据表说它有
a) 16 KB 的系统内自编程闪存程序存储器和 b) 512 字节的 EEPROM。
微控制器是否可以有两个独立的 ROM,可以通过 EEPROM 技术和闪存技术进行编程?
或者我从数据表中的推论(如上所述)是错误的吗?
我知道我们的程序存储在闪存中,为什么会有人需要 EEPROM?如果我们有程序的闪存,它有什么用?
任何人都可以解释什么是“系统内自编程”一词
我所知道的:闪存技术可以将程序写入数据块,而 EEPROM 可以逐字节写入数据。
Atmega16 数据表说它有
a) 16 KB 的系统内自编程闪存程序存储器和 b) 512 字节的 EEPROM。
微控制器是否可以有两个独立的 ROM,可以通过 EEPROM 技术和闪存技术进行编程?
或者我从数据表中的推论(如上所述)是错误的吗?
我知道我们的程序存储在闪存中,为什么会有人需要 EEPROM?如果我们有程序的闪存,它有什么用?
任何人都可以解释什么是“系统内自编程”一词
我所知道的:闪存技术可以将程序写入数据块,而 EEPROM 可以逐字节写入数据。
如今,Flash 存储器用于保存程序代码,而 EEPROM(电可擦只读存储器)用于保存持久数据。回到大约 30 年前,在 Flash 出现之前,EEPROM 被用来保存程序代码。
实际上首先出现的是 ROM(只读存储器),然后是 PROM(可编程 ROM,仅一次),EPROM(可紫外光擦除的 PROM),EEPROM,最后是 Flash。ROM 仍然用于大容量、低成本的应用程序(例如会说话的贺卡)。
与当前微控制器的重要区别在于,您通常无法从 EEPROM 中执行代码,而且程序在闪存中存储数据也很尴尬。(例如,当您在数据声明中使用“const”关键字或定义字符串时,数据存储在闪存中,但编译器和链接器在幕后处理。)
EEPROM 区域可用于保存配置或您希望在重新启动后可用的其他数据,包括微控制器是否断电然后重新上电。从功能上讲,您可以将 EEPROM 视为一个非常小的硬盘驱动器或 SD 卡。
在没有 EEPROM 的微控制器上,可以将持久数据存储在闪存中,但这变得很困难,因为微控制器并不是为此而设计的,您必须找到一个不会干扰程序代码的特殊位置,并将其放在一边与链接器。另外,如下所述,您通常可以比闪存更新 EEPROM 多次。
如果您在闪存中编程数据,这并不意味着您可以在 C 程序中将数据作为变量访问,因为无法告诉编译器这些变量在您的代码中的位置(即您不能绑定 const变量到闪存的这个区域。)因此必须通过用于写入它们的特殊寄存器集来读取它们。请注意,此限制也适用于 EEPROM 中的数据,因此在这方面没有优势。
要对闪存或 EEPROM 进行编程,首先必须擦除一块内存。然后它被编程。对于闪存,写入通常也一次完成一个块。对于 EEPROM,它可以一次通过块或一个字节来完成,具体取决于微控制器。
对于闪存和 EEPROM,在内存耗尽之前,您可以更新它们的最大次数。该数字在数据表中作为最小保证值给出。EEPROM 通常比闪存高得多。对于闪存,我看到的数字低至 1000。对于 EEPROM,我看到的数字高达 1,000,000。
与闪存相比,EEPROM 的一个优势是您可以擦除它们的次数比擦除闪存的次数要多得多。
“系统内自编程”仅仅意味着微控制器可以在运行时更新自己的闪存。该功能通常用于更新该领域的代码。诀窍是在更新主程序(称为引导加载程序)时,您需要在系统中保留一些代码。该方案用于 Arduino 系统对芯片进行编程。
我将在@tcrosley 的出色答案中添加更多信息。
ATmega16 采用哈佛架构,即数据存储器与程序存储器分离的系统拓扑。引用Atmega16 数据表(第 8 页)中的相关段落:
为了最大限度地提高性能和并行性,AVR 使用哈佛架构——为程序和数据配备单独的存储器和总线。程序存储器中的指令使用单级流水线执行。在执行一条指令时,会从程序存储器中预取下一条指令。这一概念使指令能够在每个时钟周期内执行。程序存储器是系统内可重编程闪存。
哈佛架构的优点是在指令获取周期和数据访问周期之间没有总线争用,因为数据和指令不共享相同的总线,就像在您的传统 PC 架构中一样。
因此,闪存用作程序存储器,而数据存储器分为 SRAM(用于瞬态数据,如函数调用堆栈和堆 - 例如,如果您使用 C 编程)和 EEPROM(用于永久存储) .