49 void doWriteLatchFlash(uint16_t u16_addrhi, uint16_t u16_addrlo, uint16_t u16_wordhi, uint16_t u16_wordlo) {
    51   __builtin_tblwtl(u16_addrlo,u16_wordlo); 
    52   __builtin_tblwth(u16_addrlo,u16_wordhi); 
    55 #if (defined(__PIC24E__) || defined(__dsPIC33E__))    62 void LoadTwoWords(uint16_t wordhi, uint16_t wordlo, uint16_t word2hi, uint16_t word2lo) {
    64   asm(
" mov W0, TBLPAG");
    66   __builtin_tblwtl(0,wordlo);     
    67   __builtin_tblwth(0,wordhi);     
    68   __builtin_tblwtl(2,word2lo);    
    69   __builtin_tblwth(2,word2hi);   
    74 void WriteMem2(uint16_t addrhi,uint16_t addrlo,uint16_t val) {
    82   asm(
"mov W0, NVMKEY");
    85   asm(
"bset NVMCON,#15");
    89   asm(
"1:       btsc NVMCON,#15");    
   105   u32_a.u16.ls16 = __builtin_tblrdl(u16_addrlo);   
   106   u32_a.u16.ms16 = __builtin_tblrdh(u16_addrlo);   
   117   uint16_t u16_save_SR;
   118 #if (defined(__PIC24E__) || defined(__dsPIC33E__))   123   NVMADRU = u16_addrhi;
   128   asm(
"mov W0, NVMKEY");
   130   asm(
"mov W0,NVMKEY");
   131   asm(
"bset NVMCON,#15");
   137   while (NVMCON & 0x8000)
   140   uint16_t u16_save_TBLPAG;
   143   u16_save_TBLPAG = TBLPAG;
   151   asm(
"tblwtl  %0,[%0]"::
"r"(u16_addrlo));
   153   __builtin_write_NVM();
   157   while (NVMCON & 0x8000)
   160   TBLPAG = u16_save_TBLPAG;
   169   uint16_t u16_save_SR;
   177   __builtin_write_NVM();
   181   while (NVMCON & 0x8000)
   195   uint16_t u16_byteCnt;
   197 #if (defined(__PIC24E__) || defined(__dsPIC33E__))   200   uint16_t u16_ICnt, u16_numInstructions;
   202   ASSERT(u16_len <= FLASH_PAGEBYTES);
   206   u16_numInstructions = u16_len/3;
   207   if (u16_len % 3 != 0) u16_numInstructions++;
   208   u16_numInstructions += (u16_numInstructions%FLASH_ROWSIZE);
   209 #if (defined(__PIC24E__) || defined(__dsPIC33E__))   211   for (u16_ICnt = 0, u16_byteCnt=0; u16_ICnt<u16_numInstructions; u16_ICnt += 2,u16_byteCnt += 6) {
   212     u32_a.u8[0] = pu8_data[u16_byteCnt];
   213     u32_a.u8[1] = pu8_data[u16_byteCnt+1];
   214     u32_a.u8[2] = pu8_data[u16_byteCnt+2];
   216     u32_b.u8[0] = pu8_data[u16_byteCnt+3];
   217     u32_b.u8[1] = pu8_data[u16_byteCnt+4];
   218     u32_b.u8[2] = pu8_data[u16_byteCnt+5];
   220     LoadTwoWords(u32_a.u16.ms16,u32_a.u16.ls16,u32_b.u16.ms16,u32_b.u16.ls16);
   221     WriteMem2(u32_pmemAddress.u16.ms16, u32_pmemAddress.u16.ls16,0x4001);
   222     u32_pmemAddress.u32 += 4;  
   225   for (u16_ICnt = 0, u16_byteCnt=0; u16_ICnt<u16_numInstructions; u16_ICnt += 1,u16_byteCnt += 3) {
   226     u32_a.u8[0] = pu8_data[u16_byteCnt];
   227     u32_a.u8[1] = pu8_data[u16_byteCnt+1];
   228     u32_a.u8[2] = pu8_data[u16_byteCnt+2];
   230     doWriteLatchFlash(u32_pmemAddress.u16.ms16, u32_pmemAddress.u16.ls16,u32_a.u16.ms16,u32_a.u16.ls16);
   231     if ((u16_ICnt+1)%FLASH_ROWSIZE == 0) {
   235     u32_pmemAddress.u32 += 2;  
   248   uint16_t u16_byteCnt;
   251   ASSERT(u16_len <= FLASH_PAGEBYTES);
   252   for (u16_byteCnt=0; u16_byteCnt<u16_len; u16_byteCnt += 3) {
   254     pu8_data[u16_byteCnt] = u32_a.u8[0];
   255     pu8_data[u16_byteCnt+1] = u32_a.u8[1];
   256     pu8_data[u16_byteCnt+2] = u32_a.u8[2];
   257     u32_pmemAddress.u32 += 2;
 
void doWriteLatchFlash(uint16_t u16_addrhi, uint16_t u16_addrlo, uint16_t u16_wordhi, uint16_t u16_wordlo)
uint32_t doReadLatchFlash(uint16_t u16_addrhi, uint16_t u16_addrlo)
A union type for byte, word, or dword access for 32 bit values. 
void doReadPageFlash(union32 u32_pmemAddress, uint8_t *pu8_data, uint16_t u16_len)
void doErasePageFlash(uint16_t u16_addrhi, uint16_t u16_addrlo)
void doWritePageFlash(union32 u32_pmemAddress, uint8_t *pu8_data, uint16_t u16_len)
unsigned char uint8_t
An abbreviation for an 8-bit unsigned integer.