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