Para guardar un valor para reiniciar después de un cierre inesperado, sería mucho mejor usar un byte de RAM respaldado por batería que intentar escribir en Flash.
Una actualización de un byte en flash tiene que borrarse y luego actualizar todo el 'sector'. Según la hoja de datos de ST, el tiempo típico para un borrado de sector de 16 kB es 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 alimentación mientras se está actualizando el flash, es posible que todo el sector esté dañado. Además, se borra todo el sector, por lo que no se puede utilizar para el código. Depende de la parte exacta de STM32, pero el sector más pequeño podría ser 16kB, lo que podría ser mucho para perder por el bien de un byte.
Un problema adicional más pequeño con Flash es que solo está garantizado para 10k ciclos de borrado / escritura. Esto podría ser suficiente para su aplicación, pero un error en el programa podría quemarse en una o dos horas.
Otras cosas a considerar, mientras se está escribiendo 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 comprobar Flash no se está cambiando. Por lo tanto, podría ser más complejo de lo que espera utilizar.
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 que se configura, se puede leer y escribir con solo unas pocas instrucciones adicionales. Por lo tanto, el tiempo de acceso es inferior al microsegundo, lo suficientemente rápido para usarlo en una rutina de servicio de interrupción, y no se desgastará.
Esto significa que necesitas poder acceder al pin VBat y conectarlo a una batería pequeña, por ejemplo. una batería para audífonos.