Programación de memoria flash STM32F4

Así que tengo una placa STM32F4 y, para resumir, estoy atascado al poner un número definido por el usuario (0 - 60) en la memoria FLASH, por lo que después de reiniciar, podría usar la última configuración utilizada. ¿Cómo asigno el espacio correcto en la memoria flash para que no interfiera con mi código? ¿Cómo lo guardo?

Tiene un script de enlace que define con precisión qué espacio ocupa su programa. Puede exportar algunos símbolos y usarlos en su programa.
¿No puedes usar EEPROM para eso? Es mucho más fácil organizar el almacenamiento persistente en esta área si se ejecuta desde Flash.
STM32F4 tiene unos pocos bytes de RAM respaldada por batería. ¿Puedes agregar una batería pequeña y usarla en su lugar?
como programador, usted decide cuánto de lo que se usa y dónde. si necesita borrar este valor, entonces lo quiere solo en un bloque de borrado sin nada más, o con otros valores que desea borrar y volver a escribir, si solo necesita escribirlo una vez, entonces deje algunos bytes 0xFFFF en algún lugar entonces cámbialos.
@Tibo STM32F4 no tiene EEPROM, solo tiene memoria FLASH.
@gbulmer Necesito guardar una variable que pueda usar en caso de que haya cierres inesperados. La batería no es la opción en mi caso.
@dwelch Tengo una variable y necesito que se guarde en caso de un apagado inesperado, para usarla después de un reinicio.
puede borrar un bloque, luego escribir según sea necesario, al arrancar examinar el bloque, tomar el último valor que no sea 0xFF...FF, una vez que lo vea lleno, haga otro borrado. no tendrá que borrar cada apagado (o arranque). ahorra en desgaste.
Eche un vistazo a este documento sobre la emulación de EEPROM en RAM para STM32F4 www2.st.com/content/ccc/resource/technical/document/…

Respuestas (2)

Escriba datos en la memoria Flash a través de la emulación de EEPROM, como se describe en la Nota de aplicación AN3969: Emulación de EEPROM en microcontroladores STM32F40x/STM32F41x , aquí.

Para guardar un valor para reiniciar después de un apagado inesperado, sería mucho mejor usar un byte de RAM respaldada por batería que intentar escribir en Flash.

Una actualización de un byte en flash tiene que borrar y luego actualizar todo el 'sector'. De acuerdo con la hoja de datos de ST, el tiempo típico para un borrado de sector de 16 kB es de 250 ms para un STM32F405/7 (5.3.12 "Características de la memoria", Tabla 40 "Programación de la memoria Flash"). Si se pierde la energía mientras se actualiza el flash, todo el sector puede corromperse. Además, se borra toda la sección, por lo que no se puede usar para el código. Depende de la parte exacta de STM32, pero el sector más pequeño puede ser de 16 kB, lo que podría ser mucho que perder por un byte.

Otro problema más pequeño con Flash es que solo está garantizado para ciclos de borrado/escritura de 10k. Esto podría ser suficiente para su aplicación, pero un error en el programa podría eliminarlos en una o dos horas.

Otras cosas a considerar, mientras se escribe Flash, la CPU no podrá acceder a ese sector, por lo que no podrá actualizar el valor mágico, por lo que es posible que deba proteger el acceso al valor con algún código para verificar Flash no se está cambiando. Por lo tanto, podría ser más complejo de lo que espera usar.

La alternativa obvia, sin agregar una EEPROM externa, es usar RAM respaldada por batería. Esto es un poco más complejo de programar que usar una variable en memoria porque es parte del RTC que debe inicializarse. Sin embargo, una vez configurado, se puede leer y escribir con solo unas pocas instrucciones adicionales. Por lo tanto, su tiempo de acceso es de submicrosegundos, lo suficientemente rápido como para usarlo en una rutina de servicio de interrupción y no se desgastará.

Esto significa que debe poder acceder al pin VBat y conectarlo a una batería pequeña, por ejemplo, una batería para audífonos.

O uno usa emulación eeprom encima de flash. Básicamente, el esquema escribe continuamente bloques de <addr><data> en la página flash hasta llegar al final. La carga solo lee todos los pares y obtiene los datos en un búfer ram. Cuando la página está llena, se realiza un borrado. De esta manera, el flash rara vez se borra.