發表文章

目前顯示的是 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), 再按下 (箭

Nordic nRF52 OTA (BLE DFU) part II

圖片
前文 提到nRF52實作OTA的方法,但只談了前半部,因為後半部較簡單,本來不想寫了! 只寫一半不太完整,以下簡單記錄後半部如何做。 前文提到以下: 1 做private key, public key 2 利用public key, 做出secure bootloader 接下來把secure bootloader燒錄到nRF52晶片去,可以用nRF Connect, 或IDE (例如SES)來做。 然後查看手機或電腦的nRF Connect App來查看裝置,應該可以看到DfuTarg這個名字的裝置,這就是在運作中的Secure bootloader了。 接下來要製作要更新的firmware包裝檔: 1 在IDE裡建置專案(例如,SES裡Build, F7),然後找到建置出來的.hex檔,複製到你要的目錄去,這個目錄裡放置你之前建立的private key檔案。 2 在這個目錄下指令: nrfutil pkg generate --hw-version 52 --application-version 1 --application ble_app_xxx_pca10040_s132.hex --sd-req 0xcb --key-file private.key hid_dfu_package.zip 注意:   --application-version 用來註記程式版本,要等於或大於之前的   --application 用來指定建置出來的.hex檔   --sd-req 用來指定使用的soft device, 可以使用以下指令查詢: % nrfutil pkg generate --help  ... --sd-req TEXT                   The SoftDevice requirements. A comma-                                   separated list of SoftDevice firmware IDs (1                                   or more) of which one must be present on the                  

GNU Arm Embedded Toolchain can not execute on Mac Catalina

圖片
How to install GNU Arm Embedded Toolchain on Mac Catalina? One way is go to the web site  to download this tool, and follow the install instruction written in readme.txt. For the Mac, readme.txt is in the share/doc/gcc-arm-none-eabi folder. But Mac Catalina would stop GNU Arm Embedded Toolchain to execute. Sure, you can manually permit this tool (e.g. arm-none-eabi-gcc) to execute by open the System Preferences and then open the Security & Privacy pane to allow it to run. Just like this paper described. But you must do this every time. This is too annoying. The second way would be better. Using Homebrew to install GNU Arm Embedded Toolchain for us. See this page to do it. And no more can not execute problems. After install this Toolchain by using Homwbrew. We need to know where these tools are installed. % which arm-none-eabi-gcc /usr/local/bin/arm-none-eabi-gcc % sudo find / -name arm-none-eabi-gcc Password: /usr/local/bin/arm-none-eabi-gcc /usr/local/var/homebrew

LEGO 76112 Batman Part III - 自製蝙蝠車搖桿3

圖片
  終於要把這個系列的貼文做個結束了, 因為工作忙, 加上有一些技術問題要解決, 所以從今年初抽空慢慢做, 到最近才完工。簡單的說, LEGO 76112 Batmobile這台車是由手機透過BLE來控制的, 但是媽媽不給小孩碰手機! 我只好想辦法自己做一個搖桿來搖控這台車。   這系列貼文的前兩篇: 1.  自製蝙蝠車搖桿1 2.  自製蝙蝠車搖桿2   經過考慮, 決定只用一個BLE晶片來做和batmobile溝通的工作, 這是最直接省錢的。當然另外還要有一個搖桿, 本來想用兩個搖桿的, 因為這台車是有兩個馬逹, 官方手機APP的操作界面也是設計兩個按鈕來控制這兩個馬逹。但後來, 硬體的工作弄得有點累, 就先偷懶一下了。 圖1. 正面   圖1, 可見一個BLE晶片的板子, 左上角有Nordic字樣的藍色板子, 這是nRF52840 Dongle。右邊則是搖桿, 基本上和PS2搖桿或XBOX搖桿上所採用的搖桿零件是一模一樣的。不信, 自己拆解看看, 也可以看iFix it的網站資料, 真的是一樣的零件哦! 這個搖桿在電子賣埸都找得到, 有不同價位, 便宜的台幣25元, 貴的100+, 200+, 我用起來, 發覺都一樣! 建議可以買最便宜的就好! 至於最大塊的綠色洞洞板, 只是用來當骨架, 方便固定零件。因為可能日後還要把零件拿下來, 所以都只是用電線假固定。 圖2. 側面 圖2, 側面可以看到nRF52840 Dongle, 焊接了3個藍色的排針和3個黃色的排針, 從上面往下: P0.02 P0.29 P0.31 GND VDD OUT VBUS 用到了P0.02, P0.29, GND, VDD OUT; 另2支針腳沒有使用! nRF52840 Dongle板子後面的SB2要切斷 (open), SB1要焊起來 (close)。P0.02, P0.29用來連接搖桿的類比輸出。GND接地, VDD OUT則接電池正極3V。 圖3. 背面   圖3, 將CR電池座用雙面膠固定; 這樣的組裝, 我試了, 剛好適合右手單手握持。接線, 沒有幾條, 電池, 搖桿, nRF52840 Dongle的電源接在一起(VCC接VCC, GND接GND); 然後就只有搖桿的兩軸類比輸出接到nRF52840 Don