¿Hay alguna manera de conservar el contenido de EEPROM en AVR Atmega al grabar un nuevo firmware para flashear con avrdude?

Estoy terminando una aplicación que utilizará algunos parámetros no volátiles almacenados en una EEPROM AVR Atmega644P. Los valores iniciales de EEPROM se generaron utilizando el atributo EEMEM (como se describe en este tutorial ) y se grabaron en el AVR de la avrdudesiguiente manera:

avrdude -c usbasp -p atmega644p -u -U eeprom:w:application.eep

La aplicación se ejecuta y recupera los valores correctos de la EEPROM, pero si actualizo solo el firmware con avrdude -c usbasp -p atmega644p -u -U flash:w:application.hexla EEPROM parece que también se borra, ya que los valores leídos son "todos unos" en lugar de los cargados previamente. Entonces pregunto, ¿hay alguna forma de grabar el firmware en flash pero evitar que se borre la EEPROM (usando avrdude)?

Respuestas (2)

Antes de volver a flashear cualquier MCU Atmel AVR, debe borrarlo. El procedimiento de borrado por defecto borra FLASH, EEPROM y bits de bloqueo. Hay 2 formas de resolver tu problema:

  1. Lea la EEPROM, borre todo, programe todo, incluida la copia de seguridad de su EEPROM.
  2. Establezca el bit de fusible EESAVE. En este caso, la EEPROM no se borrará durante el procedimiento de borrado. Pero deberá borrar este indicador algún día después si desea borrar y/o actualizar la EEPROM.
Este problema no es específico de avrdude, sino de todos los programadores de MCU Atmel AVR.
Entonces, si alguna vez tengo que actualizar los valores de eeprom desde la aplicación en ejecución usando, digamos, la eeprom_update_bytefunción, ¿no puedo tener el conjunto de fusibles EESAVE?
El fusible EESAVE solo se relaciona con la programación de MCU externa. Su código no se ve afectado de ninguna manera, siéntase libre de escribir lo que quiera en la EEPROM.
Solo una actualización útil: acabo de probar y cuando el fusible EESAVE está configurado, conserva la EEPROM en un borrado / programa de flash, pero tampoco le impide grabar un nuevo archivo EEPROM.

Me funcionó en un ATtiny84 usando PlatformIO como IDE con el siguiente comando AVRDUDE

upload_command = avance $UPLOAD_FLAGS -U flash:w:$SOURCE:i

donde $UPLOAD_FLAGSfue establecido por el archivo de configuración platformio.ini.

Los valores de mi EEPROM se venden al por menor durante la actualización del nuevo programa, pero aún puedo leer y escribir mediante programación en EEPROM: ¡felices días!