01
前言
本文檔指導(dǎo)用戶快速地對 BlueNRG SDK 有一個直觀、清晰的認識,了解其軟件架構(gòu),以便順利地學(xué)會利用 SDK 開發(fā)自己的用戶固件。
本文檔所述 SDK 為 BlueNRG-LP/LPS 芯片的 SDK。閱讀本文檔前,用戶應(yīng)先了解BlueNRG-LP/LPS 芯片的一些基本特性,以及其配套開發(fā)板的燒錄方式。
02
SDK 目錄
從 ST 官網(wǎng)下載 SDK 的安裝包,成功安裝后,即可獲得一個 SDK 目錄。見圖 1:
圖1.SDK 目錄
各個目錄的功能說明見表 1:
表1. SDK 目錄說明
BlueNRG SDK 安裝目錄為用戶工程師開發(fā) BlueNRG 平臺提供了一個便捷的入口,舉例來說,有以下幾個場景:
1. 硬件工程師設(shè)計 PCB 前,可通過 Docs 目錄找到硬件設(shè)計指導(dǎo)文檔。完成 PCBA 制作后,可自行使用 Navigator 工具通過串口燒錄 Firmware 下的應(yīng)用固件,驗證板子功能。
2. 當工程師想用板子進行功耗、射頻測試時,也可在 Firmware 目錄下找到合適的已經(jīng)編譯好的固件(測 SOC 藍牙功耗可用 Beacon,測射頻參數(shù)可用 DTM)
3. 固件工程師可在 Projects 目錄下找到豐富的例程,并且可使用 KEIL、IAR、WiSE 任一個IDE 打開工程、編譯、下載。
03
SDK 例程
SDK Projects 目錄包含了以下三類例程:
1. Periph_Examples:包含了芯片外設(shè)驅(qū)動例程。
2. External_Micro :包含了外部單片機的例程,應(yīng)用于 BlueNRG 芯片在系統(tǒng)中作為協(xié)處理器的場景。
3. BLE_Examples :包含了藍牙相關(guān)的所有例程,這些例程的工程特性展示如下:
表2. BLE 例程說明
04
快速實現(xiàn)用戶固件功能
本章節(jié)指導(dǎo)用戶如何快速地在 SDK 中找到相應(yīng)的 API 接口和位置,以便掌握在 SDK 例程上添加自己的配置和用戶邏輯代碼的方式。
在對 SDK 提供的例程的功能有所了解之后,假設(shè)用戶面臨的一個開發(fā)任務(wù)是:
1. BLE 從機功能,包含以下配置:
a. 一個服務(wù),一個特征,特征具備 Write、Notify 屬性
b. 設(shè)備廣播名為“Hello”
2. 使用手機 BLE 工具和設(shè)備通訊,打印通訊過程產(chǎn)生的數(shù)據(jù)
3. 自定義協(xié)議,實現(xiàn)以下功能:
a. 控制 LED 亮滅
b. 定時 1s 上傳心跳包,內(nèi)容為連接后的秒計數(shù)值
c. 每次按鍵上傳按鍵事件通知
基于以上任務(wù),我們可以選擇 BLE_SerialPort 工程作為基礎(chǔ)工程并以此來進行固件開發(fā)。
4.1. 驗證原始工程
在添加用戶代碼之前,我們最好先驗證了原始工程(BLE_SerialPort)的功能,確保開發(fā)環(huán)境正常。新建一個用戶工程目錄,比如,test_sdk1.3.0,然后從 SDK 目錄拷貝以下文件到我們的用戶工程目錄,見圖 2:
圖2.用戶工程目錄
打開 Projects > BLE_SerialPort 的 Keil 工程,勾選“Browse Information”選項,以便使能工程內(nèi)函數(shù)的跳轉(zhuǎn),同時選中 Server 工程配置,見圖 3,圖 4:
圖3.Browse Information
圖4.選中 Server 工程配置
編譯、下載工程到開發(fā)板,工程運行起來后,應(yīng)能見到以下打印信息:
圖5.BLE_SerialPort 工程 LOG 信息
使用 STBLE Toolbox 工具掃描該設(shè)備,應(yīng)能看到設(shè)備名為“Sport_LP”,見圖 6:
圖6.STBLE Toolbox 掃描頁面
至此,原始工程已經(jīng)正常運行起來了。該工程實現(xiàn)了自定義服務(wù)、特征的功能,并能通過串口和手機進行數(shù)據(jù)的收發(fā)。要完成此次開發(fā)任務(wù),我們只需在特定位置修改一些代碼即可。
4.2. 配置 BLE 從機功能
原始工程有兩個特征,一個負責(zé)發(fā)(TX_CHR_UUID),一個負責(zé)收(RX_CHR_UUID)。按照要求,我們需要把他們合并為一個可以收、發(fā)的特征。圖 6 演示了定義新的特征 UUID 并注釋掉舊的兩個特征 UUID 的方式:
圖7.特征 UUID
協(xié)議棧提供了 ble_gatt_chr_def_t 類型結(jié)構(gòu)體,用戶可以定義一個結(jié)構(gòu)體變量并賦值,以此來聲明一個特征。圖 7 展示了我們所需的特征配置的相關(guān)賦值過程,圖中可見特征的 UUID 聲明,特征 notify、write 屬性聲明,特征的特征描述符聲明等信息。另外,舊的兩個特征應(yīng)該注釋掉。
圖8.定義特征
將新的特征配置賦值給服務(wù)聲明,特征的數(shù)量修改為 1 個:
圖9.特征聲明賦值給服務(wù)聲明
上述服務(wù)、特征相關(guān)的數(shù)據(jù)結(jié)構(gòu)配置完畢,我們還需要將這些配置通過 API 傳遞給協(xié)議棧。
首先,需要先定義一個新的句柄,所謂句柄,簡單地說,用戶在進行數(shù)據(jù)收發(fā)的時候,需要選擇在哪個特征上進行數(shù)據(jù)收發(fā),此時便需要句柄來指定特征(句柄本質(zhì)上便是 attribute 的handle 字段)。原來的兩個句柄也要注釋掉,見圖 10
圖10. 句柄
然后,將上文定義好的服務(wù)、特征通過 aci_gatt_srv_add_service 函數(shù)一次性傳送給協(xié)議棧,協(xié)議棧對這些配置進行解析、構(gòu)建完整的 ATT 屬性表,保存在內(nèi)存中。之后,用戶可使用aci_gatt_srv_get_char_decl_handle 接口獲取已分配好的句柄(見圖 11),此后的數(shù)據(jù)交互過程將頻繁使用該句柄。
圖11. 獲取句柄
至此,GATT 相關(guān)的配置已經(jīng)完成。但是,由于上層大量引用了舊的兩個句柄進行數(shù)據(jù)收發(fā),因此此時編譯會出現(xiàn)比較多的錯誤,此處暫不處理這些錯誤,先完成其他的 BLE 配置。
接下來修改藍牙地址,并修改廣播名,見圖 12:
圖12. 藍牙地址和廣播名
廣播名的長度改變后,應(yīng)注意指定其長度:
圖13. 廣播名長度
LOCAL_NAME 設(shè)置的是廣播包里的設(shè)備名,當設(shè)備連接成功后,主機會從 GAP Profile 的device name 特征里獲取另外一個設(shè)備名,此處應(yīng)保持這兩個名字一致:
圖14. 設(shè)備名
圖15. 設(shè)置設(shè)備名
至此,關(guān)于藍牙的應(yīng)用配置即告完畢。接下來可進行數(shù)據(jù)通訊相關(guān)的配置、實現(xiàn)。
4.3.和手機進行通訊
上一小節(jié)配置完從機功能后,編譯會產(chǎn)生大量錯誤,是因為 BLE 的通訊過程會比較多地引用舊的句柄。循著解決這些編譯錯誤的操作,我們能了解到 BLE 通訊的過程。具體操作如下:
全局搜索舊的發(fā)送句柄(TXCharHanlde),我們找到了用于數(shù)據(jù)發(fā)送的協(xié)議棧 API,修正之 :
圖16. 發(fā)送 Notify
手機使能訂閱后,會通過圖 17 的回調(diào)函數(shù)通知上層。此時應(yīng)該修改為新的特征句柄,同時,添加一些打印指示 notify 的使能、禁用狀態(tài):
圖17. 使能訂閱回調(diào)
添加新的特征句柄全局變量聲明,注釋掉舊的:
圖18. 句柄聲明
關(guān)于舊的發(fā)送句柄(TXCharHanlde)的問題已經(jīng)全部解決。繼續(xù)搜索舊的接收句柄(RXCharHanlde),我們應(yīng)能找到設(shè)備接收手機數(shù)據(jù)的函數(shù)接口,將其中的句柄替換為新的特征句柄,見圖 19:
圖19. 數(shù)據(jù)接收回調(diào)函數(shù)
至此,我們應(yīng)該能通過全部編譯過程,并且已經(jīng)找到了數(shù)據(jù)發(fā)送、接收的位置。此時可以在這些位置添加數(shù)據(jù)發(fā)送、接收的打印函數(shù)。接收數(shù)據(jù)的用戶接口見圖 20:
圖20. 用戶接收 BLE 數(shù)據(jù)
關(guān)于發(fā)送數(shù)據(jù),原始工程實現(xiàn)了以下處理流程:
1. 從串口接收數(shù)據(jù)
2. 解析數(shù)據(jù)為命令并緩存這些命令
3. 通過輪詢的方式,不斷將命令緩沖區(qū)里的命令發(fā)送出去
該處理流程不適用于我們的任務(wù)要求,我們需要先取消這部分功能,見圖 21
圖21. 取消原有的數(shù)據(jù)處理流程
然后設(shè)計自己的發(fā)送函數(shù),見圖 22:
圖22. 自定義 BLE 數(shù)據(jù)發(fā)送函數(shù)
至此,藍牙的通訊功能已經(jīng)全部實現(xiàn)完畢。用戶可通過:
? Data_Received()接口接收數(shù)據(jù)
? user_send_data_over_ble()接口發(fā)送數(shù)據(jù)
4.4.添加其它功能
根據(jù)任務(wù)要求,我們還需實現(xiàn)下面三個功能:
1. 控制 LED 亮滅
2. 定時 1s 上傳心跳包,內(nèi)容為連接后的秒計數(shù)值
3. 每次按鍵上傳按鍵事件通知下面開始逐個實現(xiàn):
4.4.1. 控制 LED 亮滅
首先,實現(xiàn) LED 亮滅處理函數(shù),
圖23. LED 命令處理函數(shù)
將其添加到 BLE 數(shù)據(jù)接收函數(shù)處,見圖 24。LED 控制功能實現(xiàn)完畢。
圖24. 接收數(shù)據(jù)后進行 LED 命令處理
4.4.2. 每秒上傳心跳包
首先,實現(xiàn)心跳上傳處理函數(shù),實現(xiàn)當設(shè)備連接后,每秒上傳一個 4 字節(jié)的計數(shù)值,并使用0xaa 作為命令字。見圖 25:
圖25. 心跳上傳處理
將心跳處理函數(shù)添加到系統(tǒng)任務(wù)處理函數(shù) App_Tick 中,App_Tick 會在 main loop 中不斷地被調(diào)用。心跳包需要在藍牙連接成功并且使能了訂閱之后才可以發(fā)送。另外,使用 timeout_flag變量來控制其每秒只被調(diào)用一次,實現(xiàn)方法如下:
圖26. 心跳處理
上述 timeout_flag 變量需要使用每秒循環(huán)的軟件定時器來周期性置位。軟件定時器的應(yīng)用方式很簡單。
首先,實例化一個定時器,并定義超時回調(diào)函數(shù):
圖27. 軟件定時器實例化
然后,在 Serial_port_DeviceInit 函數(shù)的末端位置注冊超時回調(diào)函數(shù)并啟動定時器。
圖28. 啟動定時器
4.4.3. 上傳按鍵事件
首先,實現(xiàn)按鍵回調(diào)函數(shù),該函數(shù)在按鍵按下時被調(diào)用。發(fā)送按鍵事件前,應(yīng)檢查此時藍牙是否處理連接、已訂閱狀態(tài)。見圖 29:
圖29. 按鍵回調(diào)
按鍵中斷服務(wù)函數(shù)中調(diào)用:
圖30. 按鍵中斷服務(wù)函數(shù)
至此,開發(fā)任務(wù)的要求已經(jīng)全部實現(xiàn)完畢。接下來進行功能驗證。
4.5.驗證功能
用戶工程運行起來后,用 STBLE Toolbox 掃描,可見廣播名已經(jīng)修改過來了。
圖31. 用戶工程廣播名
連上設(shè)備并點擊 Notify 開關(guān)以使能訂閱,可觀察到底部已經(jīng)開始接收到設(shè)備的心跳包數(shù)據(jù)(以 AA 開頭的 5 字節(jié)數(shù)據(jù)),該數(shù)據(jù)每秒鐘變化一次,見圖 32:
圖32. 使能訂閱
通過 LOG 也能觀察到心跳包發(fā)送情況,此時如果按動按鍵,也能觀察到按鍵事件已經(jīng)發(fā)送:
圖33. 用戶工程 LOG
05
小結(jié)
跑完了上述用戶任務(wù)開發(fā)的流程后,相信用戶對 BlueNRG SDK 的軟件架構(gòu)應(yīng)有所理解了。BlueNRG SDK 的軟件層次架構(gòu)為 STM32 典型的三層架構(gòu),分別為驅(qū)動層、中間層、用戶層:
圖34. 軟件層次架構(gòu)
上述添加用戶功能的整個過程,其實只改動到了用戶層的功能,用戶層包含以下幾個文件:
圖35. 用戶層文件
這些文件的含義是:
? serial_port.c,用戶應(yīng)用邏輯的實現(xiàn)
? BLE_SerialPort_main.c,程序入口,程序主流程
? gatt_db.c,BLE GATT 層功能的實現(xiàn)
? rf_device_it.c,存放所有的中斷服務(wù)函數(shù)
上述用戶固件的功能,大多都在 serial_port.c 中實現(xiàn)。BLE_SerialPort_main.c 函數(shù)則實現(xiàn)了系統(tǒng)的主要流程。簡單來說,BlueNRG SDK 的裸機系統(tǒng)即是一個前后臺系統(tǒng)。藍牙事件、按鍵中斷等屬于前臺處理,負責(zé)置位相關(guān)標志位和狀態(tài),main 函數(shù)的 while1 屬于后臺處理,運行藍牙協(xié)議棧、用戶任務(wù)處理等后臺任務(wù),見圖 36:
圖36. 系統(tǒng)流程
BlueNRG SDK 中的絕大多數(shù)例程都使用了本文檔所述的軟件架構(gòu),即前后臺系統(tǒng)。該軟件架構(gòu)比較簡單,優(yōu)點是用戶能非??焖俚卣莆掌淞鞒?,能夠依據(jù)本文檔的示例快速構(gòu)建自己的用戶功能。缺點是功能比較簡單,用戶需要在此基礎(chǔ)上再添加一個調(diào)度器以應(yīng)對復(fù)雜功能的要求。
審核編輯:劉清
-
單片機
+關(guān)注
關(guān)注
6039文章
44588瀏覽量
636758 -
soc
+關(guān)注
關(guān)注
38文章
4184瀏覽量
218578 -
固件
+關(guān)注
關(guān)注
10文章
559瀏覽量
23088 -
協(xié)處理器
+關(guān)注
關(guān)注
0文章
75瀏覽量
18200 -
DTM
+關(guān)注
關(guān)注
0文章
8瀏覽量
7409 -
SDK
+關(guān)注
關(guān)注
3文章
1040瀏覽量
46052 -
BlueNRG
+關(guān)注
關(guān)注
0文章
15瀏覽量
9653
原文標題:實戰(zhàn)經(jīng)驗 | 快速入門 BlueNRG SDK 固件開發(fā)
文章出處:【微信號:STM32_STM8_MCU,微信公眾號:STM32單片機】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論