void Flash_Init(void) { uint8_t i; for (i = 0; i < USED_SIZE / 4; i++) { Using_Values[i] = 0xFFFFFFFF; } SYS_UnlockReg(); _FMC_ENABLE_ISP(); //SYS_LockReg(); }
void DataFlashRead(uint32_t addr, uint32_t size, uint32_t buffer) { /* This is low level read function of USB Mass Storage */ int32_t len; /* Modify the address to MASS_STORAGE_OFFSET */ addr += MASS_STORAGE_OFFSET; len = (int32_t)size; UNLOCKREG(); _FMC_ENABLE_ISP(); while(len >= FLASH_PAGE_SIZE) { FMC_ReadPage(addr, (uint32_t *)buffer); addr += FLASH_PAGE_SIZE; buffer += FLASH_PAGE_SIZE; len -= FLASH_PAGE_SIZE; } _FMC_DISABLE_ISP(); LOCKREG(); }
void Flash_Init(void) { SYS_UnlockReg(); _FMC_ENABLE_ISP(); //SYS_LockReg(); }
void DataFlashWrite(uint32_t addr, uint32_t size, uint32_t buffer) { /* This is low level write function of USB Mass Storage */ int32_t len, i, offset; uint32_t *pu32; uint32_t alignAddr; /* Modify the address to MASS_STORAGE_OFFSET */ addr += MASS_STORAGE_OFFSET; len = (int32_t)size; UNLOCKREG(); _FMC_ENABLE_ISP(); if ( len == FLASH_PAGE_SIZE && ((addr & (FLASH_PAGE_SIZE-1)) == 0) ) { FMC_Erase(addr); while (len >= FLASH_PAGE_SIZE) { FMC_ProgramPage(addr, (uint32_t *) buffer); len -= FLASH_PAGE_SIZE; buffer += FLASH_PAGE_SIZE; addr += FLASH_PAGE_SIZE; } } else { do { alignAddr = addr & 0x1FE00; /* Get the sector offset*/ offset = ( addr & (FLASH_PAGE_SIZE-1) ); if ( offset || (size < FLASH_PAGE_SIZE) ) { /* Non 4k alignment. Note: It needs to avoid add MASS_STORAGE_OFFSET twice. */ DataFlashRead(alignAddr - MASS_STORAGE_OFFSET, FLASH_PAGE_SIZE, (uint32_t)&g_sectorBuf[0]); } /* Update the data */ pu32 = (uint32_t *)buffer; len = FLASH_PAGE_SIZE - offset; if (size < len) len = size; for (i=0;i<len/4;i++) { g_sectorBuf[offset/4 + i] = pu32[i]; } FMC_Erase(alignAddr); for(i=0;i<16;i++) { FMC_ProgramPage(alignAddr + (i << 8), (uint32_t *) g_sectorBuf + (i << 8)); } size -= len; addr += len; buffer += len; } while (size > 0); } _FMC_DISABLE_ISP(); LOCKREG(); }