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

9

Muchos microcontroladores, por ejemplo, PIC18F , tienen memoria de programa flash: "La memoria de programa Flash es legible y grabable durante el funcionamiento normal". ¿Esto significa que puedo almacenar algunas configuraciones de usuario en la memoria del programa?

estudiante1
fuente

Respuestas:

12

Sí tu puedes. He hecho esto muchas veces.

Sin embargo, hay algunos inconvenientes en relación con el uso de EEPROM por separado:

  1. El número de escrituras de por vida en la memoria flash de programa es significativamente menor que la EEPROM de datos.

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

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

Olin Lathrop
fuente
Perfecto, parece que de alguna manera sabes que mi pregunta es realmente "por qué la necesidad de EEPROM mientras puedes usar la memoria del programa para los datos del programa y del usuario" :)
estudiante1
Olin, ¿se borra todo el Flash cuando se graba una nueva versión del firmware en el PIC? ¿Hay una buena manera de evitar que la configuración del usuario (o los datos de calibración) en el Flash se borren durante la descarga del firmware? Esto se trata de conveniencia durante el desarrollo del firmware. Me imagino que la configuración del usuario se almacenaría en el último bloque o Flash.
Nick Alexeev
66
@Nick: Eso depende del programador PIC que estés usando. Muchos, incluidos todos los míos, borran en masa, por lo que los datos de calibración se borrarían. En algunas ocasiones escribí una aplicación de programación especial que leía los datos de calibración, borraba a granel y luego escribía 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 hacer un borrado masivo.
Olin Lathrop
En los procesadores que no son de Harvard (estoy pensando en MSP430), puede copiar el código en la RAM, saltar a la RAM y ejecutar mientras se lleva a cabo la escritura / borrado flash. Lo he usado para un gestor de arranque, para escribir y recibir simultáneamente nuevos datos de una radio.
markrages
@mark: Sí, esto también funciona en PIC32, donde también es posible ejecutar desde RAM. De hecho, eso es más rápido.
Olin Lathrop
6

Muchos PIC18 tienen memoria EEPROM, hasta 1K de tamaño. Lamentablemente, el PIC18F46J50 al que hace referencia no lo hace. Si 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 el flash es de solo 10,000.

El PIC18, como la mayoría de los otros microcontroladores, utiliza lo que se llama una arquitectura de 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 memoria flash utilizando 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 aumentar o disminuir automáticamente la dirección después de una lectura, no tiene que hacerlo manualmente.

Para escribir en la memoria flash, primero debe borrar uno o más bloques de 64 bytes de memoria flash 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 desactivan y luego debe escribir 0x55 inmediatamente seguido de 0xAA en un registro; Esto desbloquea el comando de borrado y es necesario para evitar que el código errante borre accidentalmente la memoria. Finalmente, se ejecuta el comando para borrar realmente, seguido de volver a habilitar 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 se ejecuta realmente usando una instrucción TBLWT, que también permite un incremento / decremento automático como la instrucción TBLRD.

Además de guardar los datos de configuración, escribir en la memoria flash le permite a uno actualizar su firmware en el campo utilizando lo que se denomina "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 cierto punto en el programa (por ejemplo, una "cerca") con un nuevo código. Una vez completada la actualización, se inicia un restablecimiento 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 usa alguna combinación de registros de configuración, un puntero de dirección e instrucciones especiales para llevar a cabo la tarea.

tcrosley
fuente
Ese método de "firmware por aire" parece muy interesante. ¿Elimina la necesidad de programación en el sistema (ISP)?
estudiante1
@ student1 No elimina la necesidad de una programación inicial del chip a través de una interfaz ISP, ya que debe colocar algún 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 a un Arduino. Sin embargo, si desea actualizar el Bootloader, eso requiere una interfaz ISP. Este Bootloader solo maneja actualizaciones a través de USB, por lo que no es realmente "firmware por aire".
tcrosley