發表文章

目前顯示的是 8月, 2020的文章

Nordic nRF52 OTA (BLE DFU) part III - buttonless dfu

圖片
上次說要談談buttonless dfu的。 Buttonless DFU主要的想法很簡單,只是取代基本DFU要人去按住Button 4不放,再Reset的機制。因為Reset時會先執行Secure Bootloader, 而Secure Bootloader會先檢查是否Button 4有被按住,若被按住就執行DFU的功能,否則就去執行我們燒進去的firmware。Secure Bootloader除了檢查Button 4的狀態外,再檢查retention register GPREGRET,看看是否內容值為(BOOTLOADER_DFU_START = 0xB1) ,若為此值就執行DFU。透過這個做法,在要做DFU時,不用人去按Button 4, 只要將GPREGRET寫入適當的值,再Reset就可以了。 在SDK v13之後,加入了DFU Buttonless特徵值,前面談到的寫入GPREGRET的動作由這個特徵值來做外,手機APP也可以透過這個特徵的存在與否來判斷設備是否支持Buttonless DFU。等於是訂定了一個標準,讓nRF Connect, nRF Toolbox或自己寫的APP可以很容易的來支持Buttonless DFU。 了解原理後,要為自己的專案加入這個功能才是比較有挑戰的。但官方也提供了example code, 所以並不難!example code存在SDK以下目錄: \examples\ble_peripheral\ble_app_buttonless_dfu 所以打開它,把程式看一看,大約880行的main(),其實也不多! 不要被嚇到,開個玩笑而已。 以下會告訴大家主要的重點,並不需要全部都看啦! 1. 在SES中,打開example code, 看一下project explorer, 比對一下自己的專案裡是否存在如下圖的這四個.c檔。如果沒有,就自己加進去。加進去之後build一下,看是不是可以build成功,沒成功的話,看一下原因是什麼,可能要加一下include path或是常數定義之類的。 在SES裡,include path的設定方式為,先選擇專案,再按options圖示,或右鍵選options。就會出現如下圖的視窗。注意要先選Common (箭號1),然後左邊選項選Preprocessor (箭號2), 再按下 (箭