天天看點

nrf52832進入DFU更新之前卡死問題

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;
}
           

繼續閱讀