¿Se puede utilizar la memoria flash del programa del microcontrolador para almacenar la configuración del usuario?

Muchos microcontroladores, por ejemplo, PIC18F , tienen memoria de programa flash: "La memoria de programa Flash se puede leer y escribir durante el funcionamiento normal". ¿Significa esto que puedo almacenar algunas configuraciones de usuario en la memoria del programa?

Respuestas (2)

Sí tu puedes. He hecho esto muchas veces.

Sin embargo, existen algunos inconvenientes relacionados con el uso de EEPROM separadas:

  1. La cantidad de escrituras de por vida en la memoria flash del programa es significativamente menor que la EEPROM de datos.

  2. El procesador saldrá a almorzar durante los tiempos de borrado y escritura.

  3. El programa flash se borra en bloques. No puede simplemente actualizar un solo byte. Usualmente uso un esquema de almacenamiento en caché de bloques para lidiar con esto.

Perfecto, de alguna manera parece saber que mi pregunta es realmente "¿por qué la EEPROM necesita mientras puede usar la memoria del programa tanto para el programa como para los datos del usuario" :)
Olin, ¿se borra todo el Flash cuando se graba una nueva versión de firmware en el PIC? ¿Existe una buena manera de evitar que la configuración del usuario (o los datos de calibración) en Flash se borre durante la descarga del firmware? Se trata de conveniencia durante el desarrollo de firmware. Me imagino que la configuración del usuario se almacenaría en el último bloque o Flash.
@Nick: Eso depende del programador PIC que esté usando. Muchos, incluidos todos los míos, hacen un borrado masivo, por lo que los datos de calibración se borrarían. En algunas ocasiones, he escrito una aplicación de programación especial que lee los datos de calibración, los borra en bloque y luego vuelve a escribir los datos de calibración como parte del proceso de programación normal. Algunos de los programadores de Microchip pueden actualizar solo partes de la memoria del programa. Tenga en cuenta que si activó la protección de código, el programador debe realizar un borrado masivo.
En los procesadores que no son de Harvard (estoy pensando en MSP430), puede copiar el código en la RAM y saltar a la RAM y ejecutar mientras se realiza la escritura/borrado flash. He usado esto para un cargador de arranque, para escribir y recibir simultáneamente nuevos datos de una radio.
@mark: Sí, esto también funciona en PIC32, donde también es posible ejecutarlo desde la RAM. De hecho, eso es más rápido.

Muchos PIC18 tienen memoria EEPROM, de hasta 1K de tamaño. Desafortunadamente, el PIC18F46J50 al que hace referencia no lo hace. Si la EEPROM está disponible, es una opción mucho mejor si es lo suficientemente grande para sus datos, ya que la EEPROM tiene un mínimo de 1 000 000 de ciclos de borrado/escritura y la memoria flash es de solo 10 000.

El PIC18, como la mayoría de los otros microcontroladores, usa lo que se llama una arquitectura Harvard, lo que significa que hay un área direccionable físicamente separada para programas y datos (es decir, puede tener una dirección de programa 4 y una dirección de datos 4, y no son lo mismo). Por lo tanto, no puede leer ni escribir en la memoria flash usando los métodos normales en lenguaje C o ensamblador.

En cambio, en la familia PIC18, configura una dirección de inicio en un registro de 22 bits llamado TBLPTR. Para leer bytes de la memoria flash, utiliza una instrucción TBLRD. Hay una opción para incrementar o disminuir automáticamente la dirección después de una lectura, no es necesario hacerlo manualmente.

Para escribir en la memoria flash, primero debe borrar uno o más bloques de memoria flash de 64 bytes que se sobrescribirán. Después de configurar la dirección de inicio nuevamente en TBLPTR y los valores en algunos otros registros para inicializar la operación de borrado, las interrupciones se deshabilitan y luego debe escribir 0x55 seguido inmediatamente por 0xAA en un registro; esto desbloquea el comando de borrado y es necesario para evitar que un código erróneo borre la memoria accidentalmente. Finalmente, se ejecuta el comando para realizar el borrado, seguido de la reactivación de las interrupciones.

Escribir en la memoria flash es similar a borrar, excepto que el tamaño del bloque es más pequeño. La escritura en realidad se ejecuta usando una instrucción TBLWT, que también permite el incremento/decremento automático como la instrucción TBLRD.

Además de guardar los datos de configuración, escribir en la memoria flash permite actualizar su firmware en el campo usando lo que se llama "firmware por aire". Debe tener un bloque fijo de firmware, generalmente al comienzo de la memoria del programa, que pueda recibir la actualización de un módulo Bluetooth, Wi-Fi, módulo celular o incluso una conexión por cable, y actualizar el flash por encima de un cierto punto en el programa (por ejemplo, una "valla") con código nuevo. Una vez completada la actualización, se inicia un reinicio y se pone en uso el nuevo código.

Muchos otros microcontroladores además de la familia PIC tienen la capacidad de actualizar su memoria flash; la mayoría utiliza alguna combinación de registros de configuración, un puntero de dirección e instrucciones especiales para realizar la tarea.

Ese método de "firmware por aire" parece muy interesante. ¿Elimina la necesidad de programación en el sistema (ISP)?
@student1 No elimina la necesidad de la programación inicial del chip a través de una interfaz ISP, porque tiene que poner algo de firmware en el chip para poder manejar las actualizaciones más adelante. Los microcontroladores ATmega utilizados en las placas Arduino ya tienen este tipo de firmware, llamado Bootloader, por lo que no es necesario utilizar una interfaz ISP para descargar bocetos en un Arduino. Sin embargo, si desea actualizar el Bootloader, eso requiere una interfaz ISP. Este cargador de arranque solo maneja actualizaciones a través de USB, por lo que no es realmente "firmware por aire".