Autor Tema: ¿Por qué mi bootloader borra más allá del limite establecido?  (Leído 4432 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado DominusDRR

  • PIC24H
  • ******
  • Mensajes: 1982
    • Sicoy
¿Por qué mi bootloader borra más allá del limite establecido?
« en: 29 de Noviembre de 2021, 12:37:03 »
Hola.

Tengo un proyecto con el PIC32MZ, XC32 v3.00 y comunicación vía Ethernet.

Estoy utilizando el bootloader ejemplo que se proporciona en Harmony 3 para actualizar el firmware del MCU.

Tengo un espacio de memoria de programa reservado para unas constantes.

Las zonas de la memoria del microcontrolador se definen de la siguiente en el archivo ld.

Código: C
  1. protected_reg : ORIGIN = 0x9FC14000, LENGTH = 0x20000-0x14000
  2. kseg1_boot_mem : ORIGIN = 0xBFC00000, LENGTH = 0x480
  3. kseg1_boot_mem_4B0 : ORIGIN = 0xBFC004B0, LENGTH = 0x1000 - 0x4B0
  4. eeprom_data (rw) : ORIGIN = 0x9D0FEFC0, LENGTH = 0x1040 /*área reservada*/

Los límites de memoria son definidos de la siguiente manera:

Código: C
  1. #define FLASH_START (0x9d000000UL)
  2. #define FLASH_LENGTH (0x100000UL)
  3. #define PAGE_SIZE (2048UL)
  4. #define ERASE_BLOCK_SIZE (16384UL)
  5. #define PAGES_IN_ERASE_BLOCK (ERASE_BLOCK_SIZE / PAGE_SIZE)
  6.  
  7. #define FLASH_END_ADDRESS (FLASH_START + FLASH_LENGTH - 0x1040UL) // 4K + 64 bytes para constantes de AWS
  8.  
  9. #define APP_START_ADDRESS ((uint32_t)(PA_TO_KVA0(0x1d000000UL)))

Descargo el programa desde MPLAB X con el ICD 3 y luego yo leo la memoria flash del dispositivo y las constantes están en la región reservada.

Luego con una aplicación móvil me conecto al bootloader y envío el comando para borrar la memoria de programa y vuelvo a leer dicha memoria con el ICD3  y las constantes en la región reservada están borradas.

La función que borra la memoria de programa es como se indica a continuación:

Código: C
  1. void bootloader_NvmAppErase( void )
  2. {
  3.       uint32_t flashAddr = APP_START_ADDRESS;
  4.  
  5.       while (flashAddr < FLASH_END_ADDRESS)
  6.      {
  7.            NVM_PageErase(flashAddr);
  8.  
  9.            while(bootloader_NvmIsBusy() == true)
  10.           {
  11.  
  12.             ClearWDT();
  13.  
  14.           }
  15.  
  16.           flashAddr += ERASE_BLOCK_SIZE;
  17.       }
  18. }

En teoría no debería borrar esa región, por la condición en el while (flashAddr < FLASH_END_ADDRESS)

¿Alguna sugerencia o comentario d elo que puede estar pasando?
« Última modificación: 29 de Noviembre de 2021, 12:49:00 por DominusDRR »
Tengo una idea algo difusa sobre MPLAB Harmony, XC32 con PIC32


 

anything