藍牙芯片nRF52832的序列號參數(shù)保存

在實際的工程中,需要在設備上保存序列號,這個序列號應該不能被升級等擦除。一般方案是在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

image.png
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容