Datasheet

2007-2019 Microchip Technology Inc. DS30009905F-page 65
PIC24FJ256GA110 FAMILY
5.6.2 PROGRAMMING A SINGLE WORD
OF FLASH PROGRAM MEMORY
If a Flash location has been erased, it can be
programmed using table write instructions to write an
instruction word (24-bit) into the write latch. The
TBLPAG register is loaded with the eight Most Signifi-
cant Bytes of the Flash address. The TBLWTL and
TBLWTH instructions write the desired data into the
write latches and specify the lower 16 bits of the
program memory address to write to. To configure the
NVMCON register for a word write, set the NVMOPx
bits (NVMCON[3:0]) to ‘0011’. The write is performed
by executing the unlock sequence and setting the WR
bit, as shown in Example 5-7. An equivalent procedure
in C, using the MPLAB C30 compiler and built-in
hardware functions, is shown in Example 5-8.
EXAMPLE 5-7: PROGRAMMING A SINGLE WORD OF FLASH PROGRAM MEMORY
(ASSEMBLY LANGUAGE CODE)
EXAMPLE 5-8: PROGRAMMING A SINGLE WORD OF FLASH PROGRAM MEMORY
(C LANGUAGE CODE)
; Setup a pointer to data Program Memory
MOV #tblpage(PROG_ADDR), W0 ;
MOV W0, TBLPAG ;Initialize PM Page Boundary SFR
MOV #tbloffset(PROG_ADDR), W0 ;Initialize a register with program memory address
MOV #LOW_WORD, W2 ;
MOV #HIGH_BYTE, W3 ;
TBLWTL W2, [W0] ; Write PM low word into program latch
TBLWTH W3, [W0++] ; Write PM high byte into program latch
; Setup NVMCON for programming one word to data Program Memory
MOV #0x4003, W0 ;
MOV W0, NVMCON ; Set NVMOP bits to 0011
DISI #5 ; Disable interrupts while the KEY sequence is written
MOV #0x55, W0 ; Write the key sequence
MOV W0, NVMKEY
MOV #0xAA, W0
MOV W0, NVMKEY
BSET NVMCON, #WR ; Start the write cycle
NOP ; Insert two NOPs after the erase
NOP ; Command is asserted
// C example using MPLAB C30
unsigned int offset;
unsigned long progAddr = 0xXXXXXX; // Address of word to program
unsigned int progDataL = 0xXXXX; // Data to program lower word
unsigned char progDataH = 0xXX; // Data to program upper byte
//Set up NVMCON for word programming
NVMCON = 0x4003; // Initialize NVMCON
//Set up pointer to the first memory location to be written
TBLPAG = progAddr>>16; // Initialize PM Page Boundary SFR
offset = progAddr & 0xFFFF; // Initialize lower word of address
//Perform TBLWT instructions to write latches
__builtin_tblwtl(offset, progDataL); // Write to address low word
__builtin_tblwth(offset, progDataH); // Write to upper byte
asm(“DISI #5”); // Block interrupts with priority < 7
// for next 5 instructions
__builtin_write_NVM(); // C30 function to perform unlock
// sequence and set WR