通常NRF52系列芯片的UICR寄存器可以保存一些重要的用戶數據,而寫到此寄存器的數據掉電后是不會丟失的, 讀寫此寄存器的方法如下:
寫入方法1:
MDK開發環境直接按以下方式編寫。
const uint32_t UICR_ADDR_0x80 __attribute__((at(0x10001080))) __attribute__((used)) = 0x12345678;
const uint32_t UICR_ADDR_0x84 __attribute__((at(0x10001084))) __attribute__((used)) = 0xAAAAAAAA;
const uint32_t UICR_ADDR_0x88 __attribute__((at(0x10001088))) __attribute__((used)) = 0x55555555;
const uint32_t UICR_ADDR_0x8C __attribute__((at(0x1000108C))) __attribute__((used)) = 0x33333333;
如果是SES開發環境(如下使用SES_ARM編譯器),需用以下方式編寫。

然后在工程的.ld文件里增加以下內容:
MEMORY
{
UICR (r) : ORIGIN = 0x10001080, LENGTH = 0x04
}
SECTIONS
{
.uicr_customer :
{
KEEP(*(.uicr_customer))
} > UICR
}
這種方法在booltloader 代碼里可以找到其應用,bootloader的起始地址存在UICR->NRFFW[0]寄存器里,根據代碼注釋所描述,當向芯片flash里寫入bootloader 的Hex文件時,編譯器會將bootloader的起始地址編譯到HEX里,然后再寫到UICR->NRFFW[0]寄存器。

寫入方法2:
static void uict_write_test(void)
{
NRF_NVMC->CONFIG = NVMC_CONFIG_WEN_Wen;
while (NRF_NVMC->READY == NVMC_READY_READY_Busy){}
for(uint8_t i=0;i<32;i++)NRF_UICR->CUSTOMER[i] = 0x33445566;
NRF_NVMC->CONFIG = NVMC_CONFIG_WEN_Ren;
while (NRF_NVMC->READY == NVMC_READY_READY_Busy){}
}
此函數需放在softdevice 初始化之前調用,讀出時也一樣。
還可以通過nrfjprog命令寫入/讀出數據 ,看看寫入的數是否正確,命令如下:


寫入方法3:
直接使用nrfjprog 命令操作UICR寄存器。

