// //====================================================================== // 写入 //====================================================================== void c_eep::wirte(uint8 *source, uint32 tarAddr, uint16 len) { // //------------------------------------ // 0. 关闭系统中断 nvic.globalDisable(); // //------------------------------------ // 1. 开启内部高速时钟 RCC->CR |= ((uint32_t)RCC_CR_HSION); while((RCC->CR & RCC_CR_HSIRDY) == 0); // //------------------------------------ // 2. 解锁 Init(); // //------------------------------------ // 3. 擦除并写入数据 EraseSector(tarAddr); ProgramPage(tarAddr, len, source); // //------------------------------------ // 4. 锁定 UnInit(); // //------------------------------------ // 5. 关闭内部高速时钟 RCC->CR &= ~((uint32_t)RCC_CR_HSION); while(RCC->CR & RCC_CR_HSIRDY); // //------------------------------------ // 6. 开启中断 nvic.globalEnable(); }
int SSD_Write(void*p, int size) { int r; EraseSector(FILE_ADDR_BEIGN); r = ProgramPage(FILE_ADDR_BEIGN, size, p); return r; }
static int uploadApp(void) { int retval = 0; uint8_t recvEndAddr; uint32_t flashMemory = APP_ADDR_START; uint32_t blockNum = 0; uint32_t recvCnt = 0; uint8_t* pAppBuffer = (uint8_t *)FLASH_BUFFER_ADDR; __disable_irq(); /* Erase the last sector which includes the application id */ retval = EraseSector(LAST_SECTOR_ADDR); if (0 != retval) return retval; /* receive user application firmware data */ retval = receiveAppData(&recvCnt, (uint8_t *)&recvEndAddr); if (0 != retval) return retval; /* receive firmware data */ while(1) { pAppBuffer = (uint8_t *)FLASH_BUFFER_ADDR + (blockNum << 10); if (*pAppBuffer > recvEndAddr) // reach at receive address tail { EraseSector(recvEndAddr); break; } /* Write flash */ flashMemory = APP_ADDR_START + (blockNum << 10); if (blockNum%4 == 0) { initAppBufData((uint32_t *)pAppBuffer); retval = EraseSector(flashMemory); } /* Write App data to falsh */ if (0 == retval) retval = ProgramPage(flashMemory, APP_DATA_BLOCK_SIZE, pAppBuffer); if (0 == retval) { blockNum++; continue; } else break; } __enable_irq(); return retval; }
void WriteFlashPage(u16 a, const u8 *buf) { // Uses r0, r1, r29, r30, r31 u8 page[MaxFlashPageSize]; Assert(PageSize() <= sizeof(page)); RenableRWW(); DwReadFlash(a, PageSize(), page); if (memcmp(buf, page, PageSize()) == 0) { ShowPageStatus(a, "unchanged"); return; } int erase = 0; for (int i=0; i<PageSize(); i++) { if (~page[i] & buf[i]) {erase=1; break;} } if (erase) { ShowPageStatus(a, "erasing"); EraseFlashPage(a); } memset(page, 0xff, PageSize()); if (memcmp(buf, page, PageSize()) == 0) { return; } ShowPageStatus(a, "loading page buffer"); LoadPageBuffer(a, buf); ShowPageStatus(a, "programming"); ProgramPage(a); RenableRWW(); }
// Reprogram the new settings if flash writing is allowed static void program_cfg(cfg_setting_t *new_cfg) { uint32_t status; uint32_t addr; cortex_int_state_t state; addr = (uint32_t)&config_rom; state = cortex_int_get_and_disable(); status = EraseSector(addr); cortex_int_restore(state); if (status != 0) { return; } memset(write_buffer, 0xFF, sizeof(write_buffer)); memcpy(write_buffer, new_cfg, sizeof(cfg_setting_t)); state = cortex_int_get_and_disable(); status = ProgramPage(addr, sizeof(write_buffer), write_buffer); cortex_int_restore(state); if (0 != status) { return; } }