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)
;
}
Aucun commentaire:
Enregistrer un commentaire