Flash y EEPROM

La hoja de datos de Atmega16 dice que tiene

a) 16 Kbytes de memoria de programa Flash autoprogramable en el sistema y b) 512 Bytes EEPROM.

¿Puede un microcontrolador tener dos ROM separadas que se puedan programar a través de la tecnología EEPROM y la tecnología Flash?

¿O es incorrecta mi inferencia (como se indicó anteriormente) de la hoja de datos?

Sé que nuestro programa está almacenado en la memoria flash, entonces ¿por qué alguien necesitará EEPROM? ¿De qué sirve si tenemos memoria flash para el programa?

Además, ¿alguien puede explicar cuál es el término "Autoprogramable en el sistema"?

Lo que sé: la tecnología Flash puede escribir el programa en bloques de datos, mientras que EEPROM puede escribir datos byte por byte.

Respuestas (2)

Hoy en día, la memoria Flash se usa para almacenar el código del programa, y ​​la EEPROM (memoria de solo lectura borrable eléctricamente) se usa para almacenar datos persistentes. Hace unos 30 años, antes de que apareciera Flash, las EEPROM se usaban para almacenar el código del programa.

En realidad, la ROM (memoria de solo lectura) fue lo primero, luego la PROM (ROM programable, solo una vez), la EPROM (PROM borrable con luz ultravioleta), la EEPROM y finalmente la memoria flash. Las ROM todavía se utilizan para aplicaciones de bajo costo y gran volumen (por ejemplo, tarjetas de felicitación parlantes).

La diferencia importante con los microcontroladores actuales es que, por lo general, no se puede ejecutar código fuera de la EEPROM, y es complicado que los programas almacenen datos en flash. (Los datos se almacenan en flash cuando, por ejemplo, usa la palabra clave "const" en una declaración de datos, o define una cadena, pero el compilador y el enlazador manejan eso detrás de escena).

El área de EEPROM se puede usar para almacenar la configuración u otros datos que desea que estén disponibles durante los reinicios, incluso si el microcontrolador se ha quedado sin energía y luego se vuelve a encender. Funcionalmente, puede pensar en la EEPROM como un disco duro muy pequeño o una tarjeta SD.

En los microcontroladores sin EEPROM, es posible almacenar datos persistentes en la memoria flash, pero esto se vuelve difícil ya que los microcontroladores no fueron realmente diseñados para esto, y debe encontrar un lugar especial que no interfiera con el código del programa y dejarlo a un lado. con el enlazador. Además, como se menciona a continuación, generalmente puede actualizar la EEPROM muchas veces más que la memoria flash.

Si programa datos en flash, esto no significa que pueda acceder a los datos como variables en su programa C, porque no hay forma de decirle al compilador dónde están estas variables en su código (es decir, no puede vincular una const variable a esta área de flash). Por lo tanto, la lectura debe realizarse a través del conjunto especial de registros que se utilizan para escribirlos. Tenga en cuenta que esta restricción también se aplica a los datos en EEPROM, por lo que no tiene ninguna ventaja en este sentido.

Para programar flash o EEPROM, primero se debe borrar un bloque de memoria. Entonces se programa. Para flash, la escritura generalmente también se realiza bloque a bloque. Para las EEPROM, se puede hacer por bloques o un byte a la vez, dependiendo del microcontrolador.

Tanto para flash como para EEPROM, hay un número máximo de veces que puede actualizarlos antes de que se agote la memoria. Este número se da en la hoja de datos como un valor mínimo garantizado. Por lo general, es mucho más alto para las EEPROM que para la memoria flash. Para flash, he visto números tan bajos como 1000. Para EEPROM, he visto números tan altos como 1,000,000.

Una ventaja de las EEPROM sobre la memoria flash es que puede borrarlas muchas más veces de las que puede borrar la memoria flash.

"Autoprogramable en el sistema" simplemente significa que el microcontrolador puede actualizar su propio flash mientras se ejecuta. La función generalmente se usa para actualizar el código en el campo. El truco es que debe dejar algo de código en el sistema mientras se actualiza el programa principal, llamado gestor de arranque. Este esquema se utiliza en el sistema Arduino para programar el chip.

Gracias por su respuesta señor. Entonces, para ingresar datos dentro de EEPROM, ¿necesitaré un programador EEPROM como en un programador USBASP para volcar el programa dentro de la memoria flash? ¿Tengo razón, señor?
@Jasser No, no necesitas un programador externo. Accederá a la EEPROM desde dentro de su programa. Habrá un conjunto de registros dentro del ATmega que, al escribir en ellos, te permitirán actualizar la EEPROM. También necesitará usar estos registros para leer la EEPROM, ya que no aparecerá en el mapa de direcciones normal. La información sobre cómo borrar, escribir y leer la EEPROM estará en la hoja de datos del chip.
Dado que podemos escribir o leer desde la EEPROM dentro del microcontrolador, el microcontrolador debería tener un circuito para almacenar datos dentro de la EEPROM y debería ser similar al programador de EEPROM. Esto nuevamente me lleva a otra pregunta que, dado que la EEPROM se puede escribir aproximadamente 100,000 veces, después de eso, es posible que no podamos almacenar datos dentro de la EEPROM a través de los registros. ¿Son significativas estas declaraciones? @tcrosley
@Jasser Correcto, hay un límite en la cantidad de veces que puede actualizar la EEPROM. Esto suele ser mucho más alto (a veces un orden de magnitud más) que la cantidad de veces que puede actualizar el flash. Debería haber mencionado eso en mi respuesta, y lo actualizaré. El número que indicó es un mínimo garantizado por el fabricante del chip; Una vez hice algunas pruebas con un chip que estaba especificado para 100 000 escrituras, y superó las 500 000 antes de que se detectaran errores.
Además, si almacenamos el programa en la memoria flash, eso será incómodo porque contiene el código del programa principal y también los datos se toman como bloques con flash, por lo que recuperar datos de flash puede ser más difícil en comparación con un lugar separado que está totalmente asignado. para datos, es decir, la EEPROM. Esta es la razón por la que no se almacenan datos dentro de la memoria flash. ¿Es esto correcto señor?
@Jasser Sí, es un poco más difícil configurar los datos en flash. Además, como discutí en mi actualización de mi respuesta, puede borrar y reprogramar la EEPROM muchas veces más (generalmente 10x) que el flash.
Muchas gracias por su valioso tiempo señor. Espero que nos volvamos a encontrar @tcrosley.
La declaración The important difference is that you cannot execute code out of EEPROMes incorrecta. Los módulos que contienen código que se ejecuta en el lugar y almacenan el primer código que se ejecuta en el reinicio (por ejemplo, BIOS, monitor de arranque, etc.) a menudo se denominan EEPROM. EEPROM se desarrolló después de enmascarar ROM, PROM y EPROM como una forma de almacenar dicho código.
@Melab Me refería a los microcontroladores modernos que usan Flash para el almacenamiento de sus programas y solo tienen una pequeña cantidad de EEPROM disponible para datos. Sí, soy consciente de que los primeros microprocesadores usaban EEPROM para el almacenamiento de programas antes de que Flash se hiciera popular, después de las EPROM borrables por UV. Trabajé con ambos durante muchos años en el período de 1980. Voy a corregir puede responder.

Agregaré más información a la excelente respuesta de @tcrosley.

El ATmega16 implementa una arquitectura Harvard , es decir, una topología de sistema donde la memoria de datos está separada de la memoria de programa. Citando el párrafo relevante de la hoja de datos de Atmega16 (página 8):

Para maximizar el rendimiento y el paralelismo, el AVR utiliza una arquitectura Harvard, con memorias y buses separados para programas y datos. Las instrucciones en la memoria del programa se ejecutan con una canalización de un solo nivel. Mientras se ejecuta una instrucción, la siguiente instrucción se obtiene previamente de la memoria del programa. Este concepto permite ejecutar instrucciones en cada ciclo de reloj. La memoria del programa es una memoria Flash reprogramable en el sistema.

La arquitectura de Harvard tiene la ventaja de no tener contención de bus entre los ciclos de obtención de instrucciones y los ciclos de acceso a datos, ya que los datos y las instrucciones no comparten el mismo bus, como en la arquitectura de PC convencional.

Por lo tanto, la memoria flash se usa como memoria de programa, mientras que la memoria de datos se divide entre SRAM (para datos transitorios, como la pila de llamadas a funciones y el montón, si está programando en C, por ejemplo) y la EEPROM (para almacenamiento permanente) .