Autor Tema: PIC32MM Escritura/Lectura Flash memory  (Leído 327 veces)

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

Desconectado YOANMESA

  • PIC10
  • *
  • Mensajes: 5
PIC32MM Escritura/Lectura Flash memory
« en: 01 de Agosto de 2019, 16:56:45 »
Saludos mundo !

Estoy iniciando en este campo de la programación y tengo un proyecto en el cual requiero almacenar un dato en la memoria flash de mi PIC 32MM0064GPL028; he estado leyendo los manuales y varios foros para ayudarme pero no he sido capaz de escribir un dato en la memoria flash, creo que si puedo leer pero tampoco tengo seguridad por que no he escrito nada.

adjunto parte de mi código esperando que alguien me pueda ayudar. gracias.

en el ejemplo estoy tratando de almacenar un entero, pero realmente requiero almacenar una variable tipo char.

int  Data1;

Void main ()
{
    //  Suspend or Disable all Interrupts
        __asm__ volatile ("di");

    //  config WREN
        NVMCONbits.WREN = 1;

    //  choose NVM operation
        NVMCONbits.NVMOP = 0b0001;

    //  enable WR
        NVMCONbits.WR = 1;

    //  store first key security in NVMKEY registers
        NVMKEY = 0xAA996655;

    //  store second key security in NVMKEY registers
        NVMKEY = 0x556699AA;

    //  store 0x00008000 in NVMCONSET registers
        NVMCONSET = 0X00008000;
 
    //  Clear address that i want writer.
        NVMADDRCLR = 0X00008000;
   
    //  select address where i want writer.
        NVMADDRCLR = 0X00008000;
 
    //  NVMDATA0 = 21;

    //  config WREN
        NVMCONbits.WREN = 0;

    // enable all interrups
       __asm__ volatile ("ei");

    // read date saved
       int  datasave = ((int *)(PAGE + 0x200)) ;
       Data1 = &datasave; 

    return ;     
    }
 

Desconectado planeta9999

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3520
    • Pinballsp
Re:PIC32MM Escritura/Lectura Flash memory
« Respuesta #1 en: 01 de Agosto de 2019, 18:45:18 »
 
Te pongo el fuente de lo que yo hice cuando programaba para los PIC32, es parte del código de un bootloader encriptado. Necesitaba almacenar algunos datos en flash, y también modificarlos en el momento de activar cada placa con un número de serie único.

Aquí la definición de los datos en flash, cada uno en una dirección concreta.

Código: C
  1. unsigned int __attribute__ ((space(prog), address(NUMERO_SERIE))) Device_ID = 0x00000000; // Nº serie dispositivo
  2. unsigned int __attribute__ ((space(prog), address(CODIGO_PRODUCTO))) Product_ID = 0x00000000; // Identificador producto
  3. unsigned int __attribute__ ((space(prog), address(VERSION_FIRMWARE))) Vers_firmware = 0x00000000; // Version firmware
  4. unsigned int __attribute__ ((space(prog), address(PROTECCION))) Contador_usos = 0xFFFFFFFF; // Contador usos black-list


Y aquí, ejemplo de grabación de algunos de los datos definidos anteriormente en la flash.

Código: C
  1.        
  2. /********************************************************************/
  3. /***********  Inicializa producto con Nº Serie y Codigo producto ****/
  4. /********************************************************************/
  5. unsigned int Inicializa_producto()
  6. {
  7. // Cargo nuevos valores para Nº serie y Codigo producto.
  8.         unsigned int Num_dispositivo;
  9.         unsigned int Codigo_producto;
  10.         Num_dispositivo = (hexRec[20]*0x1000000) + (hexRec[21]*0x10000) + (hexRec[22]*0x100) + hexRec[23];
  11.         Codigo_producto = (hexRec[24]*0x1000000) + (hexRec[25]*0x10000) + (hexRec[26]*0x100) + hexRec[27];
  12.  
  13. // cargo página desde 0x09D0xxxx, FFF bytes en matriz
  14.         unsigned int pageBuff[1024]; // matriz 1024 elementos para guardar pagina (1024*4=4096 bytes)
  15.         unsigned int *userFlashPage;
  16.         userFlashPage = PAGINA_FLASH_VARIABLES; // Inicio pagina a copiar
  17.         memcpy((void *)pageBuff, (void *)userFlashPage, 4096);
  18.        
  19. // Reemplazo Numero serie de producto y Codigo producto
  20. // Device=ID es el elemento 000 = 0, y  Vers_firmware es 004 = 1 en matriz
  21.         pageBuff[0] = Num_dispositivo;
  22.         pageBuff[1] = Codigo_producto;
  23.  
  24. // Borro pagina 0x9D00xxxx, total 4096 bytes
  25.         NVMemErasePage((void *)PAGINA_FLASH_VARIABLES);  
  26.  
  27. // Recargo matriz temporal modificada en pagina 0x9D0xxxx, total 4096 bytes
  28.         unsigned int ix;
  29.         for(ix = 0; ix < 1024; ix++)
  30.                 {
  31.                    NVMWriteWord((void *)(userFlashPage + ix), pageBuff[ix]);
  32.                 }
  33. }
  34.  
« Última modificación: 01 de Agosto de 2019, 18:47:38 por planeta9999 »