diff --git a/src/nrf51.c b/src/nrf51.c index 83773eb1..52c97496 100644 --- a/src/nrf51.c +++ b/src/nrf51.c @@ -64,6 +64,9 @@ static const char nrf51_xml_memory_map[] = "" " " " 0x400" " " + " " + " 0x400" + " " " " ""; @@ -90,6 +93,9 @@ static const char nrf51_xml_memory_map[] = "" #define NRF51_FICR_DEVICEADDR_LOW (NRF51_FICR + 0x0A4) #define NRF51_FICR_DEVICEADDR_HIGH (NRF51_FICR + 0x0A8) +/* User Information Configuration Registers (UICR) */ +#define NRF51_UICR 0x10001000 + #define NRF51_PAGE_SIZE 1024 uint16_t nrf51_flash_write_stub[] = { @@ -177,8 +183,14 @@ static int nrf51_flash_erase(struct target_s *target, uint32_t addr, int len) return -1; while (len) { - /* Write address of first word in page to erase it */ - adiv5_ap_mem_write(ap, NRF51_NVMC_ERASEPAGE, addr); + if (addr == NRF51_UICR) { // Special Case + /* Write to the ERASE_UICR register to erase */ + adiv5_ap_mem_write(ap, NRF51_NVMC_ERASEUICR, 0x1); + + } else { // Standard Flash Page + /* Write address of first word in page to erase it */ + adiv5_ap_mem_write(ap, NRF51_NVMC_ERASEPAGE, addr); + } /* Poll for NVMC_READY */ while(adiv5_ap_mem_read(ap, NRF51_NVMC_READY) == 0)