蓝牙芯片nRF52832的序列号参数保存

在实际的工程中,需要在设备上保存序列号,这个序列号应该不能被升级等擦除。一般方案是在Flash上开辟一块区间保存序列号等参数。在nRF52832的设备上,有一些UICR的寄存器,类似于NVM,可以用来保存一些参数,更方便使用。

UICR寄存器的地址

从spec上,UICR的寄存器地址是从0x10001000开始,前面0x07c个地址为保留地址,从0x080开始32个寄存器用户可以用。

UICR Register

UICR写的三种方式

1. 通过nrjprog命令

通过nrjprog命令,可以在生产时写入,程序内部读出。比如写 0x10001080地址,写入值为0x00000001。该模式方便产线上同构自动化工具写入序列号等参数。
nrfjprog.exe -f nrf52 --eraseuicr
nrfjprog.exe -f nrf52 --memwr 0x10001080 --val 0x00000001

2. 通过代码初始化

通过属性定义,写入。该模式较为适用于那些比较固定的参数,比如硬件版本号等。
const uint32_t SERIAL_ADDR attribute((at(0x10001080))) attribute((used)) = 0x1;

3. 通过NVM的接口写入

在NVMC HAL的接口中,提供了4个写函数:
void nrf_nvmc_write_byte ( uint32_t address, uint8_t value )
void nrf_nvmc_write_bytes ( uint32_t address, const uint8_t * src, uint32_t num_bytes)
void nrf_nvmc_write_word ( uint32_t address, uint32_t value)
void nrf_nvmc_write_words ( uint32_t address, const uint32_t * src, uint32_t num_words)
在0x10001080写0x00000001即为:
nrf_nvmc_write_word(0x10001080, 0x00000001);

注意:第一种方法和第二种方法不能混用,否则出现全FF,因为flash写之前都要擦除。

UICR的读

1. 通过nrjprog命令

nrfjprog.exe -f nrf52 --memrd 0x10001080

2. 在代码中,将寄存器地址作为指针地址,直接读

uint32_t val = *(uint32_t *)0x10001080;

附录nRF52832的memory map

image.png

你可能感兴趣的:(蓝牙芯片nRF52832的序列号参数保存)