This post is older than 2 years and might not be relevant anymore
More Info: Consider searching for newer posts

NRF52832 buttonless dfu IAR

Hi.

I did the secure bootloader DFU. I attained step 8 in document.


I instal softdevice and secure bootloader to flash nRF52832. After make the ble_app_buttonless_dfu start download and debug but program not start.

If install only softdevice and buttonless_dfu then I got error "No bootloader was found".

If install softdevice and bootloader after buttonless dfu then I got not start programs.

Although security bootloader work. 
The verification was performed in the following steps:

E1. Generate new firmware.

E2. Generate new DFU .zip package.

E3. Switch the device to DFU mode, do DFU update and verify new image is running.

Help me.

  • I need to understand what to add to the advertisement to run buttonless dfu.

  • You don't need to advertise anything related to buttonless dfu in your application to do buttonless dfu. You just need to have the buttonless service in your attribute table. After the phone connect to your device it will discover the services and if there is DFU buttonless service, you will have the option to do DFU update. 

  • In project ble_app_uart function advertising_start have the form 

    static void advertising_start(void)
    {
        uint32_t err_code = ble_advertising_start(&m_advertising, BLE_ADV_MODE_FAST);
        APP_ERROR_CHECK(err_code);
    }

    In project ble_app_buttonless_dfu function advertising_start have the form 

    static void advertising_start(bool erase_bonds)
    {
        if (erase_bonds == true)
        {
            delete_bonds();
            // Advertising is started by PM_EVT_PEERS_DELETE_SUCCEEDED event.
        }
        else
        {
            uint32_t err_code = ble_advertising_start(&m_advertising, BLE_ADV_MODE_FAST);
            APP_ERROR_CHECK(err_code);
    
            NRF_LOG_DEBUG("advertising is started");
        }
    }

    What function to use advertising_start ?

  • I solved the compilation problems. I changed the function "services_init(void)" of project ble_app_uart in:

    static void services_init(void)
    {
        uint32_t           err_code;
        ble_nus_init_t     nus_init;
        nrf_ble_qwr_init_t qwr_init = {0};
        ble_dfu_buttonless_init_t dfus_init = {0};
    
        // Initialize Queued Write Module.
        qwr_init.error_handler = nrf_qwr_error_handler;
    
        err_code = nrf_ble_qwr_init(&m_qwr, &qwr_init);
        APP_ERROR_CHECK(err_code);
    
        // Initialize NUS.
        memset(&nus_init, 0, sizeof(nus_init));
    
        nus_init.data_handler = nus_data_handler;
    
        err_code = ble_nus_init(&m_nus, &nus_init);
        APP_ERROR_CHECK(err_code);
        
        //***** buttonless DFU *****
    
        // Initialize the async SVCI interface to bootloader.
        err_code = ble_dfu_buttonless_async_svci_init();
        APP_ERROR_CHECK(err_code);
    
        dfus_init.evt_handler = ble_dfu_evt_handler;
    
        err_code = ble_dfu_buttonless_init(&dfus_init);
        APP_ERROR_CHECK(err_code);
    
       //**************************
    }

    and add peer_manager_init

    nt main(void)
    {
        bool erase_bonds;
        
      //  static uint32_t pages_to_erase = 1;
        
        // Initialize.
        log_init();
        timers_init();
        buttons_leds_init(&erase_bonds);
        power_management_init();
        ble_stack_init();
        peer_manager_init();
        gap_params_init();
        gatt_init();
        services_init();
        advertising_init();
        conn_params_init();
    
        // Start execution.
        
        advertising_start(erase_bonds);

    I want start buttonless DFU with command. I get command through ble uart.  How do I may it make?

  • I got an error again.

    What do I do wrong?

    bootloader uploaded

Related