samedi 7 août 2010

Clef USB password : sauvegarde en flash

 

Maintenant, je veux pouvoir sauvegarder les codes, ces PIC ne possèdes pas d'EEPROM donc sauvegarde en mémoire programme. 
Je pourrai utiliser la déclaration "rom unsigned char chaine1[]="bonjour";". 
Mais le problème c'est que pour réécrire une chaîne il faut effacer la zone avec le programme qui y est contenu. 
J'ai donc fait des fonctions d'écriture en flash. 
 Je suis parti des procédures en assembleur du datasheet pic18f87J50 section "6-flash program memory" Soit les fonctions :
  void flash_mem_clear( int adresse){ TBLPTRU=(adresse>>16) & 0xFF; TBLPTRH=(adresse>>8) & 0xFF; TBLPTRL=adresse & 0xFF; //efface un secteur de 1024 byte (0x400) EECON1bits.WREN=1; EECON1bits.FREE=1; INTCONbits.GIE=0; EECON2=0x55; EECON2=0x0AA; EECON1bits.WR=1; INTCONbits.GIE=1; } void flash_mem_text_to_rom(unsigned char *ramptr, int adresse){//unsigned char *ramptr do{ TBLPTRU=(adresse>>16) & 0xFF; TBLPTRH=(adresse>>8) & 0xFF; TBLPTRL=adresse & 0xFF; TABLAT=*ramptr++; _asm TBLWT _endasm EECON1bits.WPROG=1; EECON1bits.WREN=1; INTCONbits.GIE=0; EECON2=0x55; EECON2=0x0AA; EECON1bits.WR=1; INTCONbits.GIE=1; EECON1bits.WPROG=0; EECON1bits.WREN=0; adresse++; }while(*ramptr); TBLPTRU=(adresse>>16) & 0xFF; TBLPTRH=(adresse>>8) & 0xFF; TBLPTRL=adresse & 0xFF; TABLAT=*ramptr++; _asm TBLWT _endasm EECON1bits.WPROG=1; EECON1bits.WREN=1; INTCONbits.GIE=0; EECON2=0x55; EECON2=0x0AA; EECON1bits.WR=1; INTCONbits.GIE=1; EECON1bits.WPROG=0; EECON1bits.WREN=0; } void flash_mem_flash_to_text(unsigned char *ramptr, int adresse){ TBLPTRU=(adresse>>16) & 0xFF; TBLPTRH=(adresse>>8) & 0xFF; TBLPTRL=adresse & 0xFF; while(*ramptr){ _asm TBLRDPOSTINC _endasm *ramptr++=TABLAT; } _asm TBLRDPOSTINC _endasm *ramptr++=TABLAT; } 
Programme de test : 
#include #include "string.h" #include "stdio.h" #include "sauvegarde_flash_mem.h" unsigned char txt_ram[100] = "abcdefghijklmnopqrstuvwxyzxxxxxxxxxxxxxxxxxxxxxxxx"; unsigned char txt_ram2[100] = "texte en ram222222222222222222222222222222222222222222222222222"; void main (void) { fprintf(_H_USER,"\nstart\n"); printf("\nstart\n"); printf("txt_ram=%s\n",txt_ram); printf("txt_ram2=%s\n",txt_ram2); flash_mem_clear( 0x002000); flash_mem_text_to_rom(&txt_ram,0x002000 ); flash_mem_text_to_rom(&txt_ram2,0x0023F0 ); flash_mem_flash_to_text(&txt_ram, 0x0023F0); printf("\n"); printf("txt_ram=%s\n",txt_ram); printf("txt_ram2=%s\n",txt_ram2); while (1) ; }

Sauvegarde txt_ram à l'adresse 0x002000, txt_ram2 a l'adresse 0x0023F0, txt_ram est chargé par la valeur à l'adresse 0x0023F0 soit la valeur de txt_ram2.

Aucun commentaire: