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?
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.
brahans
jms
Mehrshad
Anónimo
micrófono