nrf52832 SDK版本:nRF5_SDK_13.0.0_04a0bfd
找到進入DFU BootLoader的函數,如下
static void on_hvc(ble_dfu_t * p_dfu, ble_evt_t * p_ble_evt)
{
ble_gatts_evt_hvc_t * p_hvc = &p_ble_evt->evt.gatts_evt.params.hvc;
if (p_hvc->handle == p_dfu->control_point_char.value_handle)
{
// Enter bootloader if we were waiting for reset after hvc indication confimation.
if (p_dfu->is_waiting_for_reset)
{
(void)bootloader_start();
}
}
}
之是以會開始,原因在于bootloader_start()被開發者在其他任務事件裡面調用了,這種卡死現象并不是100%複現,本人也是線上調試發現的。線上調試時,停止運作,程式會一直卡在__iar_SB +addr。
當然,如果使用線上調試是可以100%複現的,在bootloader_start()中err_code = sd_softdevice_vector_table_base_set(NRF_UICR->NRFFW[0]);處設定斷電,如果運作還能跳轉到bootloader就沒有問題,如果bootloader_start()在其他任務時間調用,該斷點處繼續運作就不會一直卡住。
static uint32_t bootloader_start(void)
{
uint32_t err_code;
err_code = sd_power_gpregret_clr(0, 0xffffffff);
VERIFY_SUCCESS(err_code);
err_code = sd_power_gpregret_set(0, BOOTLOADER_DFU_START);
VERIFY_SUCCESS(err_code);
err_code = sd_softdevice_disable();
VERIFY_SUCCESS(err_code);
err_code = sd_softdevice_vector_table_base_set(NRF_UICR->NRFFW[0]);
VERIFY_SUCCESS(err_code);
NVIC_ClearPendingIRQ(SWI2_IRQn);
interrupts_disable();
NVIC_SystemReset();
return NRF_SUCCESS;
}