NRF52832 nRF Toolbox DFU升级详细流程
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? NRF52832 nRF Toolbox DFU升級詳細流程
?
升級前的流程:(此處待完善)
1、從機廣播
廣播數據包長度31, 藍牙MAC地址(e5:f6:b1:61:f8:04), BLE_GAP_ADV_FLAGS_LE_ONLY_GENERAL_DISC_MODE,服務UUID(0xfe59)
藍牙名稱:DFU-A01-00000000
?
2、主機掃描請求
3、從機應答主機掃描 數據為從機的MAC地址
4、主機請求連接
數據有:主機MAC, 從機MAC,訪問地址, CRC init, Window Size, Window Offset, Interval, Latency, Timeout, 睡眠時鐘精度
?
5、主機查找服務
?
?
?
開始升級
?
1、首選需要建立連接,且找到相應的服務,才能啟動升級流程。
?
2、APP按下升級鍵,onUploadClicked->start->onHandleIntent->performDfu ?啟動升級
?
3、主機根據情況請求MTU參數
APP: requestMtu(requiredMtu);
NRF52832: ble_evt_handler:BLE_GATTS_EVT_EXCHANGE_MTU_REQUEST
?
4、主機使能從機通知功能。
APP: enableCCCD ->onDescriptorWrite
NRF52832: GAP自動應答
?
5、主機選擇命令對象并讀取其數據,對象信息包含最大對象大小、偏移量和到目前為止整個對象的CRC32
APP: selectObject(OBJECT_COMMAND);
NRF52832: ble_evt_handler:BLE_GATTS_EVT_RW_AUTHORIZE_REQUEST,on_ctrl_pt_write->nrf_dfu_req_handler_req_process->
nrf_dfu_obj_op->nrf_dfu_command_req->on_cmd_obj_select_request
通知方式應答命令區的現有參數:大小、偏移、CRC
?
6、主機告知從機已發送數據包數,默認為0
APP: writeOpCode(mControlPointCharacteristic, OP_CODE_PACKET_RECEIPT_NOTIF_REQ);
NRF52832: ble_evt_handler:BLE_GATTS_EVT_RW_AUTHORIZE_REQUEST,on_ctrl_pt_write->nrf_dfu_req_handler_req_process->
on_prn_set_request
?
7、主機創建一個數據包傳輸,包大小為0X87。
APP: writeCreateRequest(OBJECT_COMMAND, mInitPacketSizeInBytes);
NRF52832: ble_evt_handler:BLE_GATTS_EVT_RW_AUTHORIZE_REQUEST,on_ctrl_pt_write->nrf_dfu_req_handler_req_process->
nrf_dfu_obj_op->nrf_dfu_command_req->on_cmd_obj_create_request
GAP自動應答,通知方式應答成功
?
8、主機發送初始化數據包 Handle: 0x000d ?Handle: 0x000d 命令 嘗試3次
APP: writeInitData(mPacketCharacteristic, crc32);無應答寫
NRF52832: ble_evt_handler:BLE_GATTS_EVT_WRITE, on_write->nrf_dfu_req_handler_req_process->nrf_dfu_obj_op->
nrf_dfu_command_req->on_cmd_obj_write_request->nrf_dfu_validation_init_cmd_append
?
9、 主機發送寫請求 獲取剛發送數據的CRC值 Handle: 0x000f Value: 03 ?NRF_DFU_OP_CRC_GET-3
APP: checksum = readChecksum();
NRF52832: ble_evt_handler:BLE_GATTS_EVT_RW_AUTHORIZE_REQUEST,on_ctrl_pt_write->nrf_dfu_req_handler_req_process->
nrf_dfu_obj_op->nrf_dfu_data_req->on_data_obj_crc_request
GAP自動應答,通知方式應答偏移值,CRC值。
?
10、主機發送寫請求 執行 ?CRC校驗正確,則發的數據沒問題,可以執行。NRF_DFU_OP_OBJECT_EXECUTE-4
APP: writeExecute();
NRF52832: ble_evt_handler:BLE_GATTS_EVT_RW_AUTHORIZE_REQUEST,on_ctrl_pt_write->nrf_dfu_req_handler_req_process->
nrf_dfu_obj_op->nrf_dfu_command_req->on_cmd_obj_execute_request->nrf_dfu_validation_init_cmd_execute
簽名認證
GAP自動應答,通知方式應答執行成功。
?
11、主機選擇數據對象 從機返回 數據包一包最大尺寸4k,偏移,CRC
APP: selectObject(OBJECT_DATA);
NRF52832: ble_evt_handler:BLE_GATTS_EVT_RW_AUTHORIZE_REQUEST,on_ctrl_pt_write->nrf_dfu_req_handler_req_process->
nrf_dfu_obj_op->nrf_dfu_data_req->on_data_obj_select_request
GAP自動應答,通知方式應答包最大尺寸、偏移值,CRC值。
?
12、主機創建一個數據包傳輸,只有最后一包可能不是4k,其它包大小為4K。
APP: writeCreateRequest(OBJECT_DATA, availableObjectSizeInBytes);
NRF52832: ble_evt_handler:BLE_GATTS_EVT_RW_AUTHORIZE_REQUEST,on_ctrl_pt_write->nrf_dfu_req_handler_req_process->
nrf_dfu_obj_op->nrf_dfu_data_req->on_data_obj_create_request->nrf_dfu_flash_erase
GAP自動應答,通知方式應答成功
?
13、主機發送升級數據包,前面每包為4K,每小包244字節 Handle: 0x000d ?Handle: 0x000d 命令 嘗試3次 無應答寫
APP: writePacket(mGatt, packetCharacteristic, buffer, size);//發送升級包數據,第一小包244字節
發送完后觸發onCharacteristicWrite,如果當前包未發送完,writePacket(gatt, characteristic, buffer, size);//繼續發送下一小包
NRF52832: ble_evt_handler:BLE_GATTS_EVT_WRITE, on_write->nrf_dfu_req_handler_req_process->nrf_dfu_obj_op->
nrf_dfu_data_req->on_data_obj_write_request->nrf_dfu_flash_store
?
14、主機發送寫請求 獲取剛發送數據的CRC值 Handle: 0x000f Value: 03 ?NRF_DFU_OP_CRC_GET-3
APP: checksum = readChecksum();
NRF52832: ble_evt_handler:BLE_GATTS_EVT_RW_AUTHORIZE_REQUEST,on_ctrl_pt_write->nrf_dfu_req_handler_req_process->
nrf_dfu_obj_op->nrf_dfu_data_req->on_data_obj_crc_request
GAP自動應答,通知方式應答偏移值,CRC值。
?
15、主機發送寫請求 執行 ?CRC校驗正確,則發的數據沒問題,可以繼續傳輸。NRF_DFU_OP_OBJECT_EXECUTE-4
APP: writeExecute(mProgressInfo.isComplete());
NRF52832: ble_evt_handler:BLE_GATTS_EVT_RW_AUTHORIZE_REQUEST,on_ctrl_pt_write->nrf_dfu_req_handler_req_process->
nrf_dfu_obj_op->nrf_dfu_data_req->on_data_obj_execute_request->on_data_obj_execute_request_sched
GAP自動應答,通知方式應答執行成功。
......
......
......
?
重復12-15傳輸數據包,直到剩下最后一包
?
16、主機創建一個數據包傳輸,最后一包2776字節
APP: writeCreateRequest(OBJECT_DATA, availableObjectSizeInBytes);
NRF52832: ble_evt_handler:BLE_GATTS_EVT_RW_AUTHORIZE_REQUEST,on_ctrl_pt_write->nrf_dfu_req_handler_req_process->
nrf_dfu_obj_op->nrf_dfu_data_req->on_data_obj_create_request->nrf_dfu_flash_erase
GAP自動應答,通知方式應答成功
?
13、主機發送升級數據包,最后一包2776字節,每小包244字節 Handle: 0x000d ?Handle: 0x000d 命令 嘗試3次 無應答寫
APP: writePacket(mGatt, packetCharacteristic, buffer, size);//發送升級包數據,第一小包244字節
發送完后觸發onCharacteristicWrite,如果當前包未發送完,writePacket(gatt, characteristic, buffer, size);//繼續發送下一小包
NRF52832: ble_evt_handler:BLE_GATTS_EVT_WRITE, on_write->nrf_dfu_req_handler_req_process->nrf_dfu_obj_op->
nrf_dfu_data_req->on_data_obj_write_request->nrf_dfu_flash_store
?
14、主機發送寫請求 獲取剛發送數據的CRC值 Handle: 0x000f Value: 03 ?NRF_DFU_OP_CRC_GET-3
APP: checksum = readChecksum();
NRF52832: ble_evt_handler:BLE_GATTS_EVT_RW_AUTHORIZE_REQUEST,on_ctrl_pt_write->nrf_dfu_req_handler_req_process->
nrf_dfu_obj_op->nrf_dfu_data_req->on_data_obj_crc_request
GAP自動應答,通知方式應答偏移值,CRC值。
?
15、主機發送寫請求 執行 ?CRC校驗正確,則發的數據沒問題,可以繼續傳輸。NRF_DFU_OP_OBJECT_EXECUTE-4
APP: writeExecute(mProgressInfo.isComplete());
NRF52832: ble_evt_handler:BLE_GATTS_EVT_RW_AUTHORIZE_REQUEST,on_ctrl_pt_write->nrf_dfu_req_handler_req_process->
nrf_dfu_obj_op->nrf_dfu_data_req->on_data_obj_execute_request->on_data_obj_execute_request_sched->
nrf_dfu_validation_post_data_execute->on_dfu_complete->nrf_dfu.c::dfu_observer(關閉連接)->
nrf_bootloader::dfu_observer(重啟)
GAP自動應答,通知方式應答執行成功。
?
16、遠程用戶(從機)終止連接
APP: 等待遠程用戶(從機)終止連接
NRF52832: 復位,自然會斷開連接
?
升級完成
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
總結
以上是生活随笔為你收集整理的NRF52832 nRF Toolbox DFU升级详细流程的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ubuntu20.04编译carla0.
- 下一篇: 函数中out参数的应用