Autor Tema: Borrar PIC con bootloader  (Leído 2239 veces)

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

Desconectado lilou

  • PIC10
  • *
  • Mensajes: 4
Borrar PIC con bootloader
« en: 05 de Marzo de 2014, 08:57:46 »
Hola,

Estoy creando un bootloader-usb (aplicación + firmware) personalizado. Lo principal que interesa es que pueda programar (escribir un .hex al PIC), que ya la tengo mas o menos... Solo funciona si el PIC está inicialmente vacio y si no, el programa a escribir tiene que ocupar igual o más que el programa que haya actualmente en el PIC. Es decir, al escribir solo se sobreescribe el espacio de memoria que ocuparia el programa, y el resto de la memoria no se toca, lo cual, como os imagináis, pues no es bueno.

Asi que la idea es que borre casi por completo la Program Memory (dejando solo el bootloader) y después ya escribir.

He probado de hacer:

Código: [Seleccionar]
for(i=APPLICATION_START; i<PROGRAM_MEMORY*2; i += FLASH_ERASE_SIZE)
          erase_program_eeprom(i);

Donde APPLICATION_START es el tamaño del bootloader, PROGRAM_MEMORY es getenv("PROGRAM_MEMORY") y multiplico por 2 que son los bytes por palabra (instrucción).

Al ejecutar eso en el PIC después no funciona nada, ni si quiera el bootloader, lo cuál no entiendo, pues no he tocado su espacio de memoria  :?



Compilador CCS
PIC18F4550

Saludos ;-)

PD: Me estoy sirviendo del ex_usb_bootloader.c de CCS.
PD2: Soy informático, y lo mio es programar a alto nivel, a nivel bajo me pierdo en seguida.
« Última modificación: 05 de Marzo de 2014, 09:01:11 por lilou »

Desconectado planeta9999

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3520
    • Pinballsp
Re: Borrar PIC con bootloader
« Respuesta #1 en: 06 de Marzo de 2014, 10:51:32 »


Ten en cuenta, que el borrado se hace por PAGINAS completas, no por direcciones. Si APPLICATION START es el tamaño del bootloader, debes de considerar que a partir de la última dirección que ocupa el bootloader, NO es espacio para tu aplicación, si ese espacio forma parte de la ultima página del bootloader, si lo haces así te estás cargando el bootloader y por eso se queda colgado.

Mira el mapa de memoria de tu PIC, comprueba cual es la última dirección que ocupa el bootloader, comprueba cual es la última dirección de esa página, y a partir de ahí +1 puedes empezar a borrar la flash por páginas.

Ejemplo en C32:

         pFlash = (void*)APP_FLASH_BASE_ADDRESS;                           
         for( i = 0; i < ((APP_FLASH_END_ADDRESS - APP_FLASH_BASE_ADDRESS + 1)/FLASH_PAGE_SIZE); i++ )
         {
            
            Result = NVMemErasePage( pFlash + (i*FLASH_PAGE_SIZE) );
            // Assert on NV error. This must be caught during debug phase.
            ASSERT(Result==0);
         
         }





Desconectado lilou

  • PIC10
  • *
  • Mensajes: 4
Re: Borrar PIC con bootloader
« Respuesta #2 en: 17 de Marzo de 2014, 13:04:21 »
Gracias planeta9999, pero se ve que tenia un fallo muy embarazoso... En realidad el bootloader de CCS (ex_usb_bootloader.c) funciona bien, es decir, da igual el tamaño del programa, que él te lo va a escribir bien. El problema era de los programas con los que testeaba el bootloader, pues uno de ellos tenia el #include<usb_bootloader.h> (fichero necesario a cargar en cada programa) diferente (una version del 2007), y ese fichero es crítico, pues define los espacios de memoria para el bootlaoder y el propio programa.

Ahora tengo otro problema, la eeprom, que no se borra después de haber escrito el programa. He mirado el manual de ccs, y he visto la función erase_eeprom(), pero en la descripción pone que es para PCB (el mio es PCH). Me podríais orientar?

Saludos.
« Última modificación: 17 de Marzo de 2014, 13:09:11 por lilou »

Desconectado planeta9999

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3520
    • Pinballsp
Re: Borrar PIC con bootloader
« Respuesta #3 en: 17 de Marzo de 2014, 17:15:05 »


No te se decir, no utilizo eeprom interna, porque los PIC32, que son los únicos PIC que programo desde hace años, no tienen memoria eeprom, solo flash.
Prueba a hacerle un Debug al programa, es la mejor forma de localizar los problemas.




Desconectado lilou

  • PIC10
  • *
  • Mensajes: 4
Re: Borrar PIC con bootloader
« Respuesta #4 en: 18 de Marzo de 2014, 12:56:58 »
Crees que seria correcto ésto?

Código: [Seleccionar]
for(i=getenv("EEPROM_ADDRESS"); i<getenv("EEPROM_ADDRESS")+getenv("DATA_EEPROM"); i+=FLASH_SIZE)
    erase_program_eeprom(i);

Citar
EEPROM_ADDRESS: Returns the address of the start of EEPROM. 0 if not supported by the device
DATA_EEPROM: Returns the number of bytes of data EEPROM
FLASH_SIZE=getenv("FLASH_ERASE_SIZE"): Smallest number of bytes that can be erased in FLASH

Pero no me funciona.
« Última modificación: 18 de Marzo de 2014, 13:00:02 por lilou »

Desconectado lilou

  • PIC10
  • *
  • Mensajes: 4
Re: Borrar PIC con bootloader
« Respuesta #5 en: 28 de Marzo de 2014, 07:56:46 »
Ya lo tengo, se tiene que utilizar la instrucción write_eeprom
El bucle es desde 0 hasta EEPROM_SIZE-1.