int flashWrite( uint32_t *address, uint32_t value ) { uint8_t page = PAGE_FROM_ADDRESS(address); // prevent erase of reserved pages if (page < 124 || page > 251) return 1; // page contains sketch if (page <= PAGE_FROM_ADDRESS(&_etextrelocate)) return 2; // do not write to flash if the BLE radio is active while (RFduinoBLE_radioActive) ; // enable flash write NRF_NVMC->CONFIG = (NVMC_CONFIG_WEN_Wen << NVMC_CONFIG_WEN_Pos); while (NRF_NVMC->READY == NVMC_READY_READY_Busy) ; // 22 to 43 us *address = value; // disable flash write NRF_NVMC->CONFIG = (NVMC_CONFIG_WEN_Ren << NVMC_CONFIG_WEN_Pos); while (NRF_NVMC->READY == NVMC_READY_READY_Busy) ; // success return 0; }
int flashPageErase( uint8_t page ) { // prevent erase of reserved pages if (page < 124 || page > 251) return 1; // page contains sketch if (page <= PAGE_FROM_ADDRESS(&_etextrelocate)) return 2; // do not erase flash if the BLE radio is active while (RFduinoBLE_radioActive) ; // enable flash page erase NRF_NVMC->CONFIG = (NVMC_CONFIG_WEN_Een << NVMC_CONFIG_WEN_Pos); while (NRF_NVMC->READY == NVMC_READY_READY_Busy) ; // erase page NRF_NVMC->ERASEPAGE = (page << 10); // multiply by 1024 while (NRF_NVMC->READY == NVMC_READY_READY_Busy) ; // disable flash page erase NRF_NVMC->CONFIG &= ~(NVMC_CONFIG_WEN_Een << NVMC_CONFIG_WEN_Pos); while (NRF_NVMC->READY == NVMC_READY_READY_Busy) ; // success return 0; }
void writeBlockToFlash(uint32_t* to, uint32_t* from, int numWords) { uint8_t page = PAGE_FROM_ADDRESS(to); if (page > LAST_PAGE || page < FIRST_PAGE) { debug_log("Invalid block write address\r\n"); while(1); } else { flashWorking = true; sd_flash_write(to, from, numWords); } }