假日嵌入式藍芽開發工程師:nRF51822 (1)
Introduction
2014/10買回來的nRF51822開發版,兩年來斷斷續續學習我終於大概有點成果了。接下來想寫一些文章把這些東西紀錄一下。希望可以早日收到Google給我的100USD廣告費支票(哈)。
開發版
我手邊的開發版是淘寶買的nRF51822EK_TM,他是Nordic Semiconductor的nRF51822 EK, PCA1001仿製品,上面多放了常見的周邊(如下),可以視為原廠的加強版,而且還賣得便宜一點,像是三軸加速器感應器就直接放上去,拿來學習還滿好的。
- JLINK-OB
- MPU6050 (三軸加速度感應器 + Gyro)
- 1x 三色LED
- 3A Relay
- UART to USB (PL2308)
- 128M SPI Flash
- 1x buzzer
nRF51-EK (Evaluation Kit), PCA10001
時至今日,我大概不會推薦上面的方案。因為Nordic後來推的開發版叫nRF51-DK (PCA10028),支援Ardunino Uno Revision 3接頭。他也援mbed開發,這個很酷,板子上的J-Link會變成一個磁碟機,把ELF檔拖進去就可以燒錄。最要命的是新出的SDK已經不直接支援PCA10001,要稍微動點手腳才能用範例。我如果不是已經買了板子也懶得弄了。推薦直接到mouser電子買一片,只是要折騰一下他的網站就是... (但是真的滿便宜的)。
nRF51-DK (Development Kit), PCA10028
Mouser電子nRF510DK
讓LED閃一閃
拿到開發版當然要讓LED閃一閃,查一下data sheet,改IO pin mux,設定GPIO register。做這件事有幾個方法
- 寫ASM (饒了我吧)
- 用Keil ARM
- 用GCC
Keil ARM用起來最舒服,Nordic SDK裡的範例都提供Keil projects。只是這個方案需要買貴森森的軟體(大概12萬),或著試用版(32KB code/data),不然就用盜版吧。我相信ARM對個人使用是默許盜版,畢竟推廣CPU需要好用的工具吸引人;不過商業使用的話,該付的錢還是得給。
Keil ARM Evaluation Limitation
以前當學生用盜版可以說沒錢,現在自己靠寫程式賺錢就說不過去了。這次我試用Makefile搭配gcc,從編譯,連結,下載到開發版都自己搞定。Segger也提供免費的Ozone debugger能設斷點單步執行看記憶體。兩個搭配起來我已經能擺脫Keil ARM的依賴。這輪弄下來,我手邊整套toolchain都沒有版權問題了(可以大大方方地寫出來了)。走這路要處裡所有工具的細節,走一次這個流程其實收穫多多,這筆投資當然不會白費。另外Nordic SDK原生也支援gcc toolchain,可以從某個會動的範例來開始。
J-Link Ozone
SEGGER-RTT
研究Nordic SDK時,注意到SEGGER-RTT的潛力,可以完全打趴printf()。完成支線任務後,寫了幾篇文章(假日嵌入式系統工程師:SEGGER-RTT)
Nordic SDK
接下來我想聊一下Nordic SDK,其實他對gcc的支援很不錯,Makefile包括編譯到下載。
Nordic SDK
Development with GCC and Eclipse
但是我想說他的Makefile真的讓我不舒服,整份到處都是相對路徑,裡面有一堆../../../../../../。其實他可以定義一個variable指到SDK-root,然後用這個變數指到其他檔案。
我也很討厭他的include search path加了一大堆,只寫了一個include "xxx.h",至於到底是哪個檔案?不好意思,請閱讀include search path。我上班的地方正好有些team使用這種coding style,好處是改目錄結構可以只改Makefile,缺點就是我上面說的。我偏好include search path指到某個root path,然後所有的include都用這個點再指下去。
再下去比較接近宗教信仰了,Nordic SDK不是寫成底下的style,我看起來很不爽。
if {
...
} else {
...
}
因為看不順眼的關係,我花了很大的功夫自己重寫Maklefile做到Nordic已經搞定的事。這事沒白費,可以寫一篇介紹心得。只是真的很累,光是讓LED閃一閃就沒時間玩別的。考慮到我不是Nordic semiconductor的員工,看不爽的東西畢竟會動,那就當個快樂的用戶吧。
然後Nordic SDK的SDK-code和User-code沒有拆開得很好。舉例來說,SDK有個header file需要開某個option才支援I2C,那用戶應該怎麼做?
- 直接改SDK header file,重新編譯就可以用
- 拷貝這個header file到local folder,然後修改include search path,讓編譯器先找local file
顯然第二個好一點,但這個事我覺得Nordic SDK沒說得很清楚(或著文件我沒找到)。所以Nordic SDK應該有比較好的用法,長期下來比較好,這個也可以寫一篇文章。
BLE開發
經過一系列的折騰和妥協,我終於拿起了LBS (Led Button Service)細細閱讀了。這個範例讓手機能遙控板子上的LED,另外板子的按鈕按下去,手機也能收到這個事件。這個範例雖小,但不就是整個BLE的read/write?這個程式也值得寫文章細細分析一下,需要一點BLE protocol的底子,還有熟悉Nordic SDK的用法。
然後其實我也不知道我要用藍芽BLE做什麼,我只是隱隱約約覺得我想掌握這個技術,我總是要做點東西來驗證學習成果。想了很久,我決定做個開發工具,可以透過BLE讀寫開發版的任何記憶體位置。比起LED/Button,這個例子稍微複雜一點,之後也可以寫一篇文章來炫耀一下。
留言
我的Line ID:alois2595 / mail:alois.fang@cloudfitness.com.tw