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.