在實際的工程中,需要在設備上保存序列號,這個序列號應該不能被升級等擦除。一般方案是在Flash上開辟一塊區(qū)間保存序列號等參數(shù)。在nRF52832的設備上,有一些UICR的寄存器,類似于NVM,可以用來保存一些參數(shù),更方便使用。
UICR寄存器的地址
從spec上,UICR的寄存器地址是從0x10001000開始,前面0x07c個地址為保留地址,從0x080開始32個寄存器用戶可以用。
UICR Register
UICR寫的三種方式
1. 通過nrjprog命令
通過nrjprog命令,可以在生產(chǎn)時寫入,程序內部讀出。比如寫 0x10001080地址,寫入值為0x00000001。該模式方便產(chǎn)線上同構自動化工具寫入序列號等參數(shù)。
nrfjprog.exe -f nrf52 --eraseuicr
nrfjprog.exe -f nrf52 --memwr 0x10001080 --val 0x00000001
2. 通過代碼初始化
通過屬性定義,寫入。該模式較為適用于那些比較固定的參數(shù),比如硬件版本號等。
const uint32_t SERIAL_ADDR attribute((at(0x10001080))) attribute((used)) = 0x1;
3. 通過NVM的接口寫入
在NVMC HAL的接口中,提供了4個寫函數(shù):
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);
注意:第一種方法和第二種方法不能混用,否則出現(xiàn)全FF,因為flash寫之前都要擦除。
UICR的讀
1. 通過nrjprog命令
nrfjprog.exe -f nrf52 --memrd 0x10001080
2. 在代碼中,將寄存器地址作為指針地址,直接讀
uint32_t val = *(uint32_t *)0x10001080;
附錄nRF52832的memory map

