5 votos

¿Cómo utilizar correctamente la memoria flash del STM32 como EEPROM?

Tengo que guardar ciertos parámetros en la memoria flash y estos valores deberían ser no volátiles. Pero mi programa cambiará estos parámetros y quiero que los cambios se actualicen en la memoria flash.

Tengo entendido que para sobrescribir una página de la flash, hay que borrarla primero. Y la granularidad de la operación de borrado es una página. Teniendo en cuenta todo esto, ¿cómo puedo implementarlo correctamente en el software? Cada vez que cambia un parámetro, ¿debo borrar toda la página? El tamaño de la página es de 1 kB, que es mucho espacio que todos mis parámetros juntos.

¿Es éste el único camino a seguir?

4voto

Tom Deloford Puntos 508

Sí, como ya has descubierto, no puedes borrar menos de una página a la vez.
Sin embargo, si tus parámetros ocupan mucho menos que el tamaño de una página, podrías considerar crear un esquema en el que en lugar de escribir en la misma dirección cada vez y borrar entre cada escritura, escribas en una dirección diferente dentro de la página en cada escritura. Sólo borre la página cuando esté llena.
Así que cuando quieras leer tus parámetros, empieza a leer al principio de la página, y continúa leyendo hasta que llegues a un bloque de parámetros lleno de entradas 0xff. Entonces sabrás que el bloque anterior fue el último que escribiste.

Ciertamente hay muchas otras formas de hacer este tipo de cosas, por ejemplo, se podría utilizar un campo de bits al principio de la página para indicar qué bloques dentro de la página se han escrito en lugar de tener que escanear potencialmente toda la página. Pero esto puede depender del soporte del hardware. Algunos micros, como el STM32L0, no permiten escribir nada más que 0x0000 en una ubicación de la flash si no está completamente borrada a 0xffff, lo que impide utilizarla como campo de bits y borrar un bit cada vez.

4voto

bitsmack Puntos 5415

Sí, hay que borrar una página entera (ponerla a 0xFF) antes de poder empezar a escribir en ella.

En la mayoría de las memorias flash externas se puede escribir en una página varias veces sin necesidad de borrarla, siempre y cuando se escriba en ubicaciones de bytes no utilizadas anteriormente. Consulte esta respuesta .

Sin embargo, el controlador de la memoria flash interna en los STM32 no permitirá ninguna escritura a menos que se borre toda la página.

Si quieres ir por el camino fácil, ST tiene una solución de software disponible gratuitamente que proporciona una capa de emulación de EEPROM utilizando un área de memoria flash interna. Proporciona un conjunto sencillo de funciones y maneja todas las complejidades "bajo el capó". Permite la lectura y escritura de un solo byte, y maneja el borrado por ti.

No sé qué microcontrolador estás utilizando. Aquí están los documentos de emulación de EEPROM para el STM32F0xx y STM32F10x microcontroladores.

Por ejemplo, se escribe un byte con EE_WriteVariable() . El software asigna esta ubicación a una página flash, lee esa página, inserta su byte donde corresponda, y luego programa una página nueva completa en otra página flash . Va de un lado a otro de las páginas, y te oculta todo esto.

Sin embargo, esto requiere mucho tiempo. No sólo se tarda un poco, sino que el bus de memoria puede bloquearse mientras se espera a que se complete la escritura en la memoria flash, por lo que no se puede hacer esto en aplicaciones de tiempo crítico.

Si este software no funciona para tu aplicación, puedes construir una solución tan compleja como necesites. Una vez escribí un gran sistema para manejar datos de configuración de misión crítica, cuyos datos podían cambiar sobre la marcha. Utilizaba múltiples sectores, ubicaciones redundantes, verificación de crc, nivelación de desgaste, etc. No podía confiar en una tabla de contenidos, porque ¿qué pasaba si el sistema se apagaba en medio de la actualización de la tabla de contenidos? Así que tenía una rutina para descubrir el banco de configuración flash "activo" (léase: "más recientemente escrito") en la inicialización... etc.

0voto

Rishi Puntos 29

Sí, esa es la forma de hacerlo siempre que no lo hagas a menudo porque sólo tienen unos pocos miles de ciclos de escritura antes de que la flash se desgaste. Todo se hace por página.

NO intentes usar la flash como RAM

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X