天天看点

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

继续阅读