desbordamiento de eeprom

Estaba usando STM32f401RE, y almacené una serie de números en el AT24c512, operaciones de lectura y escritura de EEPROM varias veces durante la implementación del código, aproximadamente 10,000 veces cada ejecución de código. Al principio, los números de la EEPROM se leen correctamente y están correctamente escritos en ella.

Pero cuando ese dispositivo permanecerá encendido durante aproximadamente 5 a 6 horas y los datos de la EEPROM pueden ser escritos y leídos por el microcontrolador, no recibirá los números correctos.

Por ejemplo, 500 debe escribirse en la EEPROM, pero ese número que se lee de la EEPROM es 1.589.436. Que al apagar el dispositivo o escribir los nuevos números no saldrán correctamente. En tu opinión, ¿cuál es el problema? ¿Cómo puedo solucionar esto?

¿Leyó la hoja de datos para verificar cuál es la especificación de resistencia de escritura para su EEPROM? Está justo ahí en la primera página.
Las EEPROM tienen una vida útil limitada en las escrituras de memoria; cada bit de un AT24c512 se especifica para soportar 100000 ciclos de escritura. Es probable que haya un gran margen por encima de las 100 000 escrituras especificadas, pero eventualmente agotará el almacenamiento si no hace nada más que escribir datos en las mismas direcciones una y otra vez durante 6 horas.
Ahora, ¿cómo puedo leer y escribir mis datos? ahora no puedo usar EEPROM
¿Por qué ha elegido utilizar EEPROM? ¿Por qué no memoria RAM?
@Mehrshad: Piense en una estrategia diferente. No puedo imaginar que sea realmente necesario escribir/borrar con tanta frecuencia en una memoria no volátil, pero si es así, otras tecnologías pueden ser la mejor opción. Por ejemplo, echa un vistazo a esto: ti.com/lit/an/slaa526a/slaa526a.pdf

Respuestas (1)

Parece que estás desgastando la EEPROM. Todas estas celdas de memoria de puerta flotante tienen un número finito de veces que se pueden escribir y borrar antes de que se dañen irreparablemente. Verifique la hoja de datos. Debería dar los valores mínimos garantizados de "vida útil" para escrituras y borrados.

La mayoría de las EEPROM puras están clasificadas para más de 10.000 operaciones de este tipo. Sin embargo, eso es lo que aparentemente hace su código cada vez . Y, especialmente durante el desarrollo y la depuración, es muy posible que algo se haya ejecutado en un bucle y haya realizado estas operaciones muchas veces.

Su EEPROM está tostada, hecha, desgastada. Si lo reemplaza con un nuevo chip y el problema desaparece (temporalmente), eso es definitivamente lo que sucedió.

En general, si necesita una actualización frecuente de datos no volátiles, debe hacer algo más que simplemente conectar ciegamente una EEPROM. La primera estrategia es cambiar la arquitectura para que el estado no volátil no necesite actualizarse con tanta frecuencia. Si eso es imposible, entonces vive con la vida útil limitada o usa una tecnología diferente.

Otra cosa a tener en cuenta es cómo exactamente el firmware está escribiendo en la EEPROM. Estas cosas suelen tener "páginas" que se borran eléctricamente o se escriben al mismo tiempo. A veces es posible escribir bytes individuales, pero aún cuenta como un evento para toda la página.

Por lo tanto, el firmware debe ser inteligente acerca de cómo se realizan las escrituras. Por lo general, creo rutinas de interfaz que permiten leer o escribir bytes individuales al azar. Sin embargo, debajo realmente almacenan en caché una página completa. Las escrituras no van a la EEPROM física hasta que se necesita una página diferente o hasta que se llama a la rutina FLUSH explícita. A veces, un temporizador llama automáticamente a la rutina FLUSH.

Sin embargo, en todos los casos, no realiza una escritura física cuando no se cambia ningún valor. Mantengo un bit "sucio" que indica si la página en caché ha cambiado desde que se leyó desde la EEPROM. Al ir a una página diferente, no se realiza ninguna escritura si el caché actual no está sucio. También hay una lógica para verificar las escrituras de bytes individuales que no cambian el valor almacenado en caché. En ese caso, la marca sucia no se establece.

Las rutinas adecuadas de acceso a EEPROM de bajo nivel pueden ayudar, pero la aplicación también debe tener en cuenta las limitaciones de la memoria no volátil. Debe tratar de evitar, por ejemplo, saltar por todo el espacio de direcciones escribiendo pequeñas cantidades de bytes. Si tiene que hacer una escritura grande, tenga cuidado de hacerlo secuencialmente.

Por supuesto, simplemente no puede escribir un nuevo valor cada segundo, por ejemplo, y esperar que un dispositivo con una vida útil de 100 000 escrituras dure más de 28 horas. Incluso un dispositivo con una vida útil de 1 000 000 de escrituras no duraría ni 12 días en este caso.

gracias, ahora necesito guardar números y estos números son muy importantes, por lo que cuando la energía es baja o la placa se reinicia, estos números no deben borrarse. en este momento, ¿cómo puedo guardar estos números y leerlos? mientras debo leer y escribir muchas y muchas.
@Mehrshad Puede mantener los datos en la RAM y escribir el contenido de la RAM en la EEPROM una vez que detecte que la fuente de alimentación no está disponible. Al encender, copiaría los datos de la EEPROM a la RAM. Por supuesto, deberá alimentar la EEPROM y el procesador de alguna manera cuando se desconecte la alimentación hasta que se complete la transferencia de datos, un condensador grande alimentado por un diodo schottky debería ser suficiente.
bien, ¿cómo puedo detectar que la fuente de alimentación no está disponible? Estoy trabajando con STM32F401RE
@Mehrshad Si bien su microcontrolador no tiene un comparador analógico, puede usar el ADC para convertir el voltaje de entrada en un valor digital. Como el voltaje de entrada es probablemente más alto que el voltaje de suministro del microcontrolador, necesita un divisor de voltaje para medirlo, algo así. Este ADC específico también tiene una función solo para casos como este: el perro guardián analógico. Se puede configurar para generar una interrupción cuando el voltaje de entrada sale de un rango específico.
@Olin Lathrop, ¿puedo usar SRAM interna en lugar de EEPROM?
si puedo usar SRAM, ¿cómo puedo definir una variable en SRAM y guardar mis datos en SRAM?