|
#define NVMC_CONFIG 0x4001E504 // NVMC配置寄存器地址
#define NVMC_ERASEALL 0x4001E50C // NVMC全芯片擦除寄存器地址
#define NVMC_READY 0x4001E400 // NVMC就绪状态寄存器地址
#define CTRL_AP 0x01C00000 // CTRL-AP基地址
#define CTRL_AP_ERASEALL 0x01 // 全芯片擦除命令
/ Poll NVMC ready state.
uint8_t wait_for_nvmc_ready(void)
{
uint32_t ready;
do {
if (!swd_read_word(NVMC_READY, &ready)) {
return 0;
}
} while (ready == 0);
return 1;
}
uint8_t swd_unlock_nrf52833(void)
{
uint32_t ap_lock;
// Step 1: 读取CTRL-AP的APLOCK状态,确认是否被锁定
// if (!swd_read_word(CTRL_AP, &ap_lock)) {
// return 0;
// }
// printf("ap_lock = 0x%x\n",ap_lock);
// if (ap_lock & 0x01) {
// APLOCK位设置,表示芯片被读保护
// Step 2: 进入擦除模式,设置NVMC.CONFIG寄存器为擦除模式
if (!swd_write_word(NVMC_CONFIG, 0x02)) {
return 0; // 设置擦除模式失败
}
printf("触发全芯片擦除\n");
// Step 3: 触发全芯片擦除,写入NVMC.ERASEALL
if (!swd_write_word(NVMC_ERASEALL, 0x01)) {
return 0;
}
printf("等待擦除完成\n");
// Step 4: 等待擦除完成,轮询NVMC_READY寄存器
if (!wait_for_nvmc_ready()) {
return 0;
}
// Step 5: 擦除完成后,读取CTRL-AP,确认APLOCK位是否清除
if (!swd_read_word(CTRL_AP, &ap_lock)) {
return 0;
}
if (ap_lock & 0x01) {
return 0; // APLOCK未被清除,解锁失败
}
//}
// 读保护已解除
return 1;
}
按照上面的执行下来,没有什么用,有没有大神,指导一下。
|
|