//irgendwo deklarieret und mit 0 initialisiert: // Each bit represents one Flash block. Assumes an unsigned long int has 32 bits. UINT32 flashPageStatus[NUMBER_OF_FLASH_BLOCKS/32]; // prüfe ob die Page von pageAddress schon gelöscht ist oder nicht // wenn nicht: lösche die Page und schpeichere es in flashPageStatus BOOL TrackPageErase(UINT32 pageAddress) { UINT32 pageNumber; UINT32 nvmResult; // Calculate page address pageNumber = (pageAddress - PROGRAM_FLASH_BASE) / FLASH_PAGE_SIZE; // Check the bit that tracks that page // // Note: Each bit tracks 1 page so each word tracks 32 pages // Word position = PageNumber / 32 // Bit position = PageNumber % 32 if (!(flashPageStatus[pageNumber/32] & (1 << (pageNumber%32))) ) { nvmResult = NVMErasePage((void*)pageAddress); if(!nvmResult) { flashPageStatus[pageNumber/32] |= ( 1 << (pageNumber % 32) ); return TRUE; } else { /* Error while erasing page */ return FALSE; } } return TRUE; } // schreibe im Flash (in diesem Fall wortweise) BOOL WriteToFlash() { UINT32 currentAddress; UINT8 i, len; UINT32 val; UINT32* pData; BOOL retVal = FALSE; len = IntHex32Packet.dataLen; /* Get physical address */ currentAddress = ((IntHex32Packet.baseAddress << 16) | (IntHex32Packet.loadOffset)); /* transforme to virtual address*/ currentAddress |= 0x80000000; pData = (UINT32*)(IntHex32Packet.data); for(i=0; i<(len>>2); i++) { if(NVMWriteWord((void*)currentAddress, *pData)) { //Error retVal = TRUE; } pData++; currentAddress += 4; } if((len%4)==1) { val = 0xFFFFFF00 | IntHex32Packet.data[len-1]; if(NVMWriteWord((void*)currentAddress, val)) { //Error retVal = TRUE; } } else if((len%4)==2) { val = 0xFFFF0000 | (IntHex32Packet.data[len-2] <<8); val = val | IntHex32Packet.data[len-1]; if(NVMWriteWord((void*)currentAddress, val)) { //Error retVal = TRUE; } } else if((len%4)==3) { val = 0xFF000000 | (IntHex32Packet.data[len-3] <<16); val = 0xFFFF0000 | (IntHex32Packet.data[len-2] <<8); val = val | IntHex32Packet.data[len-1]; if(NVMWriteWord((void*)currentAddress, val)) { //Error retVal = TRUE; } } return retVal; }