Yes, as Edward already mentioned directly change of PPAGE is not very save.
I created simple example code for CRC checksum calculation over paged flash (for S12G). It doesn't need to be in non banked flash.
You can take it as inspiration:
unsigned char crc_sum;
unsigned long j, ptr;
unsigned int k;
crc_sum = 0xFF; //CRC initial value
for(j=0x010000;j<=0x0E0000;j=j+0x010000) //PPAGE increment (except last page)
{
for(k=0x8000;k<=0xBFFF;k++) //Address increment
{
ptr = j+k; //Complete address
crc_sum= CheckSumByteCRC8(crc_sum, *((unsigned char *far)ptr) , DEFAULT_CRC8_CHECKSUM);
}
}
j=0x0F0000; //last page
for(k=0x8000;k<=0xBEFF;k++) //Address increment - without reset vectors
{
ptr = j+k; //Complete address
crc_sum= CheckSumByteCRC8(crc_sum, *((unsigned char *far)ptr) , DEFAULT_CRC8_CHECKSUM);
}
if (crc_sum == CHECKSUM_STORAGE_CRC8) PTT_PTT7 = 0; //if checksum ok, LED on
FYI: CodeWarrior linker is able calculate checksum automatically (according definition in *.prm file).
Example codes for checksum calculation you can find on your disk in CodeWarrior installation directory. Default path:
"c:\Program Files\Freescale\CWS12v5.1\(CodeWarrior_Examples)\HC12\Checksums\.."
Possible CHECKSUM_METHOD= "METHOD_CRC_CCITT"|"METHOD_CRC8"|"METHOD_CRC16"|"METHOD_CRC32"|"METHOD_ADD"|"METHOD_XOR".
CheckSumByteCRC8 is function from "c:\Program Files\Freescale\CWS12v5.1\lib\hc12c\src\checksum.c" file.
If you will need complete example code, please let me know, or create new service request at Freescale support page.