發表文章

Nordic nRF52 BLE firmware programming tutorial

圖片
開始使用Nordic nRF52系列晶片,弄清楚如何開發這個平台的firmware,也有數周了。當然Nordic官網有提供許多的文件,包括開發板的手冊,nRFSDK的文件,softDevice的文件,晶片SoC的規格書,還有開發者論檀。其實文件數量多的驚人! 但到現在我個人覺得最適合給入門者看的文件是: 1.  ble-advertising-a-beginners-tutorial 2.  ble-services-a-beginners-tutorial 3.  ble-characteristics-a-beginners-tutorial 這3篇文章在2015,2016年間寫的,後來也有幾度小修改,目前大概維持在nRFSDK 15.0.0,可現在2020/5, Nordic nRFSDK已經出到16.0.0了。 個人看文件的習㥜是從前往後看,結果在下載範例程式後,一編譯就出現許多錯誤訊息,試著去解,發現根本解不完。後來想想,文章裡說範例程式是由examples/ble_peripherial/ble_app_template修改簡化而來,那麼同樣由nRFSDK 16.0.0裡的這個ble_app_template範例程式複製一個出來再改成其他名字,當然也是可以正常編譯的。然後試著把文章的範例裡的main.c複製過去取代原本的main.c,結果可以正常編譯了!這樣就可以往下繼續閱讀和試著依文件改程式看BLE的行為如何變化了。結果一路順利看到文章結束。沒想到文章後的留言也很有看頭! 有人抱怨範例程式不能編譯,但也有人說可以解,而解法就和我想的一樣!所以其實文章真的不要只從前往後看,這種貼文,因為常有更新,也許先看看後文或者前後都翻閱一下,才不會浪費了許多時間。 除了這個版本問題外,這幾篇真得寫得不錯,是很好的入門文件。 以下筆記幾個重點: --------------------------------------------------- 第1篇 廣播 (1) 範例程式如前文所述,由最新SDK的ble_app_template專案複製,再蓋上範例程式的main.c就可以。 (2) 設備名稱由 #define DEVICE_NAME 定義 (3) BT ADDRESS可以在gap_para...

nRF5SDK CMSIS Configuration wizard

圖片
所有nRF5 SDK裡的範例專案都有一個sdk_config.h, 用來設定許多子功能的開啓和參數的選擇,它使用了一個特定的設定格式,可以由CMSIS Configuration wizard工具來開始和編輯。當然它基本上也只是C的#define指示詞的用法,但有個GUI工具可以用,總是方便的多。 ------------------------------------------------------------------ 對於使用armgcc工具鏈的朋友來說只要下make sdk_config指序即可: 例如: nRF5_SDK_16/examples/ble_peripheral/ble_app_blinky/pca10056/s140/armgcc$ make sdk_config 就會出現這個CMSIS Configuration wizard工具了。展開點選到想要的項目就可以勾選啓用或選取想設定的參數值。 如果出現Failed to load module "canberra-gtk-module"的錯誤訊息,可以下以下指序補安裝套件: sudo apt install libcanberra-gtk-module libcanberra-gtk3-module ------------------------------------------------------------------ 對於SES工具的朋友來說,也可以使用這個工具: 官方文件file:///nRF5_SDK_16.0.0_offline_doc/nrf5/sdk_config.html有說明: 如圖,只要加入一些說明到tools.xml檔去 接著在SES就可以在sdk_config.h按右鍵,選CMSIS Configuration wizard  Ctrl+Y同樣就可以出現這個工具了。

nRF52 TMP102 讀取温度值

圖片
TMP102是一個温度感測器,可以用I2C或TWI界面來和MCU溝通。 而Nordic的藍牙晶片到了nRFSDK 15之後,已經提供很多的範例程式,I2C或TWI存取的寫法也有提供。最基本的scan 是否有設備存在的程式範例就是 /examples/peripheral/twi_scanner。本文以這支範例程式來試驗讀取TMP102温度值的程式寫法。 ---------------------------------------------------------------------------- 硬體接線   依以下方式,只要接4條線。左為nRF52840 DK腳位,右為TMP102腳位。 P0.27  -> SCL P0.26 -> SDA GND -> GND VDD nRF -> 1.4 - 3.6V 如下圖,這四個腳位都在右上角P4, P20 ---------------------------------------------------------------------------- 程式寫法   打開twi_scanner這支程式,在main()之前加入以下程式: #define TMP_ADDRESS (0x48) /**  * @brief read TMP102 temperature  */  void read_tmp102(void)  {     uint8_t tmp_data[2];     uint8_t tmp_data_le[2];     uint16_t *tmp = (uint16_t *) &tmp_data_le[0];     nrf_drv_twi_rx(&m_twi, TMP_ADDRESS, tmp_data, 2);     tmp_data_le[0] = tmp_data[1];     tmp_data_le[1] = tmp_data[0];     float tmp102 = (*tmp...

Nordic nRF52 OTA (BLE DFU)

透過藍牙傳輸做韌體更新的方法,我自己習慣用OTA(over the air)來稱呼。但其實不同的廠家有不同的名稱,有人叫SUOTA(software update over the air),Nordic則稱做DFU(device firmware update)。又有兩種管道可以使用:USB, BLE。透過藍牙傳輸做韌體更新的就是BLE DFU。 怎麼做到,有原廠文件說明,參考以下連結: getting-started-with-nordics-secure-dfu-bootloader 其主要運作方式依靠secure bootloader提供服務,讓nRF Connect, nRF Toolbox等master code可以由藍牙將新韌體傳送給裝置做更新。而Nordic的nRFSDK裡的範例程式就有提供secure bootloader原始檔給大家使用,當然也不能讓任意人傳任意的韌體就可以更新你的裝置!所以secure bootloader在收到master code送來的dfu package時會先檢查其中的數位簽章,符合才會往下做。理論上這是不可能破解的!因為這個架構,所以secure bootloader存有public key,而在産生dfu package時就要使用private key來製作簽章。 那産生public key / private key的工具,nordic也幫大家準備好了,就是nrfutil,安裝方法: Mac OSX: pip3 install nrfutil --upgrade Linux: pip install nrfutil --upgrade 最好檢查一下版本不要太舊: (我裝的是6.1.0) nrfutil version 産生private key的指令: nrfutil.exe keys generate private.key 産生public key的指令: nrfutil keys display --key pk --format code private.key --out_file public_key.c -----------------------------------------------------------------------------...

燒錄Micropython 1.12至nRF52840 Dongle

圖片
前面貼文 曾提到如何把Micropython燒錄到nRF52840-DK, 現在談談如何燒錄到nRF52840 Dongle。畢竟Dongle體積小巧,便宜。要整合到自己的專案,可行性較高。 首先nRF52840 Dongle (pca10059)是沒有除錯器的,所以我們要準備外部的除錯器,最常見的除錯器就是JLink。如果你手上有nRF52840-DK的開發板,這個板子上就有JLink OB除錯器。可以參考 Eric Pietrowicz的貼文 ,雖然他在談的是把CircuitPython燒錄到nRF52840 Dongle的方法,但其實作法本質是一樣的。 另外nRF52840 Dongle也被Google的一個 開源專案OpenSK 使用,同樣也要燒錄其firmware到板子上去。所以作法類似,但他們使用一種叫做TC2050的特別線,這條線不便宜,好處是可以不用焊接。但我想反正pca10059不貴,而且之後也會接一些元件來玩,總之是會焊東西上去的,也就不在意現在焊幾個jumper。 因為我一開始把一塊pca10059弄壞了,所以先警告大家要小心! 不過,後來我又把這塊板子救回來了,過程大概是這樣的,我先依照Eric Pietrowicz的接線方法,把nRF52840-DK當做除錯器來使用,主要是使用P20的接頭來接線到pca10059的(VBUS, GND, SWDIO, SWDCLK)。然後下: nrfjprog --family nrf52 --eraseall nrfjprog --program build-pca10059-s140/firmware.hex --sectoranduicrerase -f nrf52 --reset 看起來沒有錯誤訊息,就試著把pca10059接到USB埠去,結果使用終端機去連都沒有反應。 之後我懷疑前面的燒錄並沒有成功,是不是燒到nRF52840-DK自己的晶片去了?就使用nRF Connect的programmer檢查,果然pca10059原本的bootloader還在,nRF Connect的programmer還可以連得上,也可以燒錄firmware上去。這可能要怪我當時並沒有把接腳焊好,而只是用線繞繞,甚至用膠帶貼著,或者用手壓住而己有關。總之,之後下nrfjprog --famil...

LEGO 76112 Batman Part II - 自製蝙蝠車搖桿2

在 之前的文章 提到積木蝙蝠俠座車是用手機的BLE藍牙連線來控制的。如果想要改成用joystick摇桿來操作的話,也是可以做的哦! 第1步:   這個我們之前已經完成了,就是先了解手機是如何透過BLE來下指令給蝙蝠車。詳見之前文章,簡單回顧一下,目前我找出了3個指令: 指令1:控制LED燈的顏色,但因為組起來後被積木有點擋住,所以變不同的顏色其實看不出太好的效果。 0800813211510000  不亮 0800813211510001 各種顏色 到 0800813211510009 指令2:控制左邊輪子的轉速 08 00 81 01 11 51 00 DA 指令3:控制右邊輪子的轉速 08 00 81 00 11 51 00 DA 第2步:   準備一個BLE藍牙晶片,我想使用Nordic nRF52840 Dongle,因為只要$10美金,而且板子很小就一個随身碟的大小。要在這個平台上寫BLE藍牙有許多選擇,目前看來還是使用Micropython之類的比較簡單。我 前一篇文章 有提到如何把Micropython環境燒錄到板子上。只是目前先用nRF52840-DK, 還沒有去試燒錄到nRF52840 Dongle!一旦環境準備好,就可以開始寫程式了。 動手寫程式之前,先來看一個 example code , 這支是由Micropython之父Damien George寫的哦! 接著我會用到這支範例程式的39 - 70行。打開你的终端機軟體,連上板子後,複製貼上剛剛說的39 - 70行,然後: >>> dev = find_device_by_name("Smart Hub") >>> dev ScanEntry >>> p = Peripheral() >>> p.connect(dev.addr()) >>> p.getServices() [Service(handle: 0x01), Service(handle: 0x05), Service(handle: 0x0c)] >>> s = p.getServices() >>> s [Service...

在Nordic nRF52晶片上跑Micropython

圖片
雖然在Micropython官方網站上主要的支持晶片中沒有看到Nordic nRF52, 但其實已經有支持了。只是目前還在開發早期階段中。可以先嘗鮮一下,但要有心理準備,有很多東西還不完備。 Tony D!的影片是一個不錯的開始! 另外官方網站關於nRF平台的說明,其實就放在 GitHub 。這裡放了程式碼以及簡單的安裝說明。 我使用nRF52840 DK開發板來嘗試: 這個板子大了一點,用在開發階段還不錯,如果真的要拿來用,可以改用nRF52840 Dongle,不但體積小巧,售價也便宜!只是燒錄firmware時較麻煩,下次有空時再來談。或者看看 這篇文章 。 同樣地,這個平台Micropython官方沒有編好的firmware, 必須自己編! 1. 先找個環境來做編譯的工作,可以是Linux, Mac OSX, 或是Raspberry pi; 之前我使用過Raspberry pi來編ST NUCLEO-F401RE開發板。這一次改用Mac來試試。依 GitHub 說明,要使用git clone指令把Micropython的source code都複製下來,但嘗試了幾次都沒有成功編譯,都會出現錯誤訊息,主要是編譯tinyusb時會有程式碼找不到!想來是開發中的版本還不太完整吧!於是就在官方網站(http://micropython.org/download/)如下圖箭頭所指處,下載1.12的原始程式: 解壓縮(放到micropython-1.12目錄去)後再編,果然就正常編成功了! 編譯方法: % cd micropython-1.12 % make -C mpy-cross % cd ports/nrf % make BOARD=pca10056 註:這裡可能碰到一些問題,看一下錯誤訊息在說什麼,再去解就可以了。例如,可能會說沒有gcc-arm-none-eabi; 那就去安裝這個工具,我在之前的 貼文 有提到這個工具。這個工具裡有很多執行檔,例如ld, ar, cc1等等,因為Mac會阻擋未簽證的程式執行,所以要在系統偏好設定的安全性與隱私權畫面裡設定它們可以執行。 2. 準備soft device 編成功的話,會出現一個 build-pca10056 的目錄,這個目錄裡可以找到 firmwa...