pic33epxxx flash geheugen (bootloader)

hallo,

Ik zou graag een bootloader willen maken voor een Pic33ep256mu806.
Ik ben begonnen met het wissen van een deel flash geheugen, maar hier loop ik al vast ...
Volgens de datasheet zou het volgende 1 "row of flash " moeten wissen:

pic asm code:


;Define the address from where the programming has to start
.equ PROG_ADDR, 0x022000;
; Load the destination address to be written
MOV #tblpage(PROG_ADDR),W9

MOV #tbloffset(PROG_ADDR),W8

MOV W9,NVMADRU
MOV W8,NVMADR;
; Load the two words into the latches
CALL Load_Write_Latch_Word;
 Setup NVMCON for word programming
MOV #0x4001,W0

MOV W0,NVMCON;

; Disable interrupts < priority 7 for next 5 instructions; Assumes no level 7 peripheral interrupts
DISI#06

; Write the key sequence
MOV#0x55,W0

MOVW0,NVMKEY
MOV#0xAA,W0

MOVW0,NVMKEY

; Start the write cycle
BSET NVMCON,#15

NOP
NOP

Mijn vraag:

- Als ik (in Proton) het volgend programma schrijf :

pic basic code:

[
Device 33EP256MU806 



Config ficd = JTAGEN_off
Config fpor = boren_off,fpwrt_pwr1
Config FWDT = fwdten_off , PLLKEN_OFF
Config foscsel = FNOSC_frcpll,ieso_oFF
Config fosc = FCKSM_csdcmd

OSCCON = %0000000100000000
CLKDIV = %0011000000001010
PLLFBD = %0000000110000100
RCON.5 = 0
 
Declare Xtal = 120



     

 
TRISC.13 = 1 
ANSELC.13 = 0 
  

DelayMS 1000
Declare Hserial_Baud = 9600 
Declare HRSOut1_Pin = PORTG.6                
Declare HRSIn1_Pin = PORTC.13                

    
        
RPINR0 =  %0111011100000000     ; int1 op pin g7
RPINR18 = %0000000000111101   ; uart rx1
RPOR13 =  %0000000100000000   ;uart tx1


Dim MESSAGE As Byte 
Dim TELLER As Dword  

MESSAGE = 0 
For TELLER = 0 To 100
HRSOut "."
HSerIn 4 ,verder ,[MESSAGE]
verder:

If MESSAGE = 250 Then 
HRSOut "START BOOTPROCES"
GoTo BOOTLOAD 
EndIf 
Next









GoTo main 

BOOTLOAD: 

INTCON2.14 = 1 

   Asm
    .equ PROG_ADDR,0x3d8
   Mov #tblpage(PROG_ADDR),W0
   Mov W0,NVMADRU
   Mov #tbloffset(PROG_ADDR),W0
    Mov W1,NVMADR
    
    EndAsm
 

   NVMCON = %0100000000000011
    Disi #06
    ; Write the KEY Sequence
    Mov #0x55,W0
    Mov W0,NVMKEY
    Mov #0xAA,W0
    Mov W0,NVMKEY
    ; Start the erase operation
    Bset NVMCON,#15
    ; Insert two NOPs after the erase cycle (required)
    Nop
    Nop
   
   HRSOut " Wissen klaar"


main: 


HRSOut "1 "
HRSOut 10 
HRSOut 13 
DelayMS 1000 

HRSOut "2"
HRSOut 10 
HRSOut 13 
DelayMS 1000 


HRSOut "3"
HRSOut 10 
HRSOut 13 
DelayMS 1000 


HRSOut "4"
HRSOut 10 
HRSOut 13 
DelayMS 1000 
GoTo main 

Dan zal dus (als ik 250 stuur naar de rx van de Pic) , de bootloader gestart worden en vanaf adres "3d8" de volgende 1024 instructies gewist worden.?

Als ik in Proton kies voor vieuw--> plugin-->ide HEX vieuw...
Dan is de laatste regel van de tekst : $003d8 $8000 $000 $0000 $0000
Dus het laatste programma adres van het flash is 3d8 ?
Dus als ik de laatste regel zou wissen ( zoals dat gedaan wordt in de Proton code ) , dan zal mijn programma niet meer compleet zijn en dus niet meer (goed werken ) ?
Waarschijnlijk is mijn redenering compleet fout, maar kunnen jullie me aub. vertellen waarom dit niet werkt(en hoe het dan wel moet ) ?

Dan had ik nog wat vragen:

- waarom ziet de Proton --> "ide HEX vieuw..." functie er anders uit dan wanneer ik het .HEX bestand gewoon in een tekstdocument open ?

- wat doet de volgende asm instrcutie precies ? :
Mov #tblpage(PROG_ADDR),W0

- kan ik de bootloader in het begin van het flash programmeren en alles wissen (behalve de bootloader ) ?

Arco

Special Member

De blocksize voor erase acties varieert per PIC. Bij de pic24 die ik veel gebruik is het 1536 bytes per block.
Ik gebruik ook de onderste 8 blocks voor bootloader en erase de rest...

Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com

Dag Arco , ik denk dat ik ongeveer het hele www heb afgezocht op samples en uitleg over pic33e-bootloaders, maar ik begrijp er nog niets van.
Kun je/ iemand wat uitleg geven over de registers die gebruikt worden voor het schrijven / wissen van flash geheugen?

Ik snap het nut niet van bv. TBLPAG, volgens https://zavax.wordpress.com/2013/08/03/designing-bootloader-for-microc… zou het TBLPAG ALTIJD "0xFA" moeten zijn. Maar waarom ? ,

Ook snap ik niet wat bytes/instructions,rows inhoudt ... (hoeveel instrucions per row ? hoeveel bytes per row ...?

En als ik een bootloader schrijf (in het begin van het flash ), en het programma NA de bootloader.(bv. de bootloader van 0x200 tot 0x600, en het programma van 0x700 tot einde_flash_geheugen ?
Kan ik dan de bootloader alles laten wissen behalve bootloader en hem een nieuw programma laten schrijven vanaf 0x700 ?

Arco

Special Member

Ik gebruik Mikrobasic, dat heeft een FLASH_Erase(block_to_erase) functie, wel zo handig... ;)

Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com