nRF54L15におけるUICRレジスタを使用したデータ保存方法
この記事では、nRF54L15のUICRレジスタを活用して基本的なデータを永続化する手法について説明します。
UICRレジスタの概要
UICR(User Information Configuration Registers)は、ユーザー固有の設定情報を格納するための不揮発性メモリレジスタです。
すべてのUICRレジスタはRW1保護機能を備えており、一度書き込みを行うと再度書き込むにはErase All操作が必要になります。
デフォルトのリセット値は0xFFFFFFFFです。
実装方法
製造工程においてJ-LINKプログラマとnrfutilツールを組み合わせてレジスタにデータを書き込み、アプリケーションからその情報を読み取るという流れになります。
以下では、UICRレジスタにMACアドレスを保存し、読み取り時にBluetoothアドレスとして設定する例を示します。
3.1 UICRからのMACアドレス読み取りと設定処理
この関数はbt_enableより前に呼び出す必要があります。
#include <hal/nrf_uicr.h>
#include <sdc_hci_vs.h>
void load_device_config_from_storage(void)
{
int result_code;
uint8_t device_mac[6];
// nRF54L15のUICRベースアドレス: 0x00FFD000
// OTP領域オフセット: 0x500
volatile uint32_t *config_base = (volatile uint32_t *)(0x00FFD000 + 0x500);
// OTP領域の最初の2レジスタを読み取り(MACアドレスが格納されていると仮定)
uint32_t config_reg_0 = config_base[0];
uint32_t config_reg_1 = config_base[1];
// レジスタが適切にプログラムされているか確認
if (config_reg_0 != 0xFFFFFFFF && config_reg_1 != 0xFFFFFFFF) {
device_mac[0] = (config_reg_0 >> 0) & 0xFF;
device_mac[1] = (config_reg_0 >> 8) & 0xFF;
device_mac[2] = (config_reg_0 >> 16) & 0xFF;
device_mac[3] = (config_reg_0 >> 24) & 0xFF;
device_mac[4] = (config_reg_1 >> 0) & 0xFF;
device_mac[5] = (config_reg_1 >> 8) & 0xFF;
sdc_hci_cmd_vs_zephyr_write_bd_addr_t address_command = {
.bd_addr = {device_mac[0], device_mac[1], device_mac[2],
device_mac[3], device_mac[4], device_mac[5]},
};
result_code = sdc_hci_cmd_vs_zephyr_write_bd_addr(&address_command);
} else {
printk("Configuration storage not initialized, fallback to default\n");
// デフォルト設定または代替処理
}
printk("Loaded MAC Address: %02X:%02X:%02X:%02X:%02X:%02X\n",
device_mac[0], device_mac[1], device_mac[2],
device_mac[3], device_mac[4], device_mac[5]);
}
3.2 nrfutilによるUICRへのデータ書き込み
以下のコマンドでUICRレジスタにデータを書き込めます。nrfutilのインストール方法については関連資料を参照してください。
nrfutil device recover // デバイスの完全消去
nrfutil device program --firmware combined_firmware.hex // ファームウェア書き込み
nrfutil device x-write --address 0x00FFD500 --value 0xddccbbaa // UICRアドレス0x00FFD500に書き込み
nrfutil device x-write --address 0x00FFD504 --value 0x8877ffee // UICRアドレス0x00FFD504に書き込み
nrfutil device reset // デバイスリセット
nrfutil device protection-set All // 読み取り保護を有効化
3.3 動作検証
nRF54L15DK開発ボードとperipheral_uartサンプルプロジェクトを使用して検証を行います。