NRF52 UICR寄存器读写

通常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寄存器。

原文地址:https://www.cnblogs.com/lim11/p/11134885.html