在實際的工程中蜜唾,需要在設(shè)備上保存序列號杂曲,這個序列號應(yīng)該不能被升級等擦除。一般方案是在Flash上開辟一塊區(qū)間保存序列號等參數(shù)袁余。在nRF52832的設(shè)備上擎勘,有一些UICR的寄存器,類似于NVM颖榜,可以用來保存一些參數(shù)棚饵,更方便使用。
UICR寄存器的地址
從spec上掩完,UICR的寄存器地址是從0x10001000開始噪漾,前面0x07c個地址為保留地址,從0x080開始32個寄存器用戶可以用且蓬。
UICR Register
UICR寫的三種方式
1. 通過nrjprog命令
通過nrjprog命令欣硼,可以在生產(chǎn)時寫入,程序內(nèi)部讀出恶阴。比如寫 0x10001080地址诈胜,寫入值為0x00000001。該模式方便產(chǎn)線上同構(gòu)自動化工具寫入序列號等參數(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;