全球最低功耗藍牙單芯片(DA14580)系統架構和應用開發框架分析


       DA14580是Dialog公司研制的藍牙單芯片。號稱全球功耗最低,是TI CC2541的四分之中的一個,是運動手環等穿戴類電子產品的經常使用芯片。

可是DA14580的開發門檻不低。適合有藍牙開發經驗的團隊來開發,不適合學習愛好者。在網絡上搜索DA14580相關的開發文章。基本上都是對官方僅有的幾篇文檔進行簡單翻譯,還不如直接閱讀英文原文。

筆者將對DA14580的系統架構和應用開發框架進行分析,之后再解說怎樣進行應用開發。

       對於藍牙單芯片應用開發來說。我們要關注的問題是:藍牙協議棧方面怎樣新增一個GATT profile(服務和特征值定義及操作)、SOC內核方面怎樣驅動外圍設備、系統應用框架上怎樣使用定時器和任務間消息通信等等。DA14580單芯片公布時並非一顆裸片,而是帶有開發平台和SDK包,還有經常使用的應用例程(如防丟proximity)。我們要做的就是通過SDK和相關的文檔去理解它整個系統架構和應用框架,在這個基礎上才干去完畢以上三個方面的開發。

一、DA14580系統架構

DA14580是基於Cortex M0架構,內置ROM、OTP和RAM。

當中ROM固化了大部分協議棧和操作系統(單任務)的代碼實現,而OTP一次性編程則是為了減少成本,實現用戶的差異化應用需求。當用戶通過SPI NORFLASH引導或者直接通過JLINK下載代碼到RAM進行調試后,就能夠通過SmartSnippets工具下載代碼到OTP。量產產品即從OTP開始引導運行。

DA14580集成的是第三方公司RW的藍牙協議棧IP,范圍包含GAT和GAP層及下面。因此我們能夠在代碼框架文件夾上看到RW開頭命名的文件夾和頭文件,官方文檔涉及到藍牙協議棧方面大部分都是RW公司出品。


二、DA14580 開發例程文件夾和SDK文件夾結構

DA14580的SDK開發平台使用keil,我們先來看看開發例程的文件夾結構,再來看SDK文件夾結構。

前者簡單一些。后者由於涉及到第三方IP、ROM等原因,文件夾實在是太多太細了。初接手真的會歇菜。

防丟(proximity,英文是接近的意思)的開發文件夾結構例如以下:


這里須要注意的是,ROM里面的固話代碼。包含協議棧和單任務操作系統的相關管理代碼也是整個project應用的一部分,僅僅只是沒有列到開發文件夾里面。

SDK文件夾架構例如以下:


三、藍牙profile和應用的角色和分工

從project的代碼文件夾結構來看,每一個profile都有一個以profile(如proxr)命名的.c文件,也有一個以profile_task(如proxr_task)命名的.c文件;對應地。每一個應用子任務也有一個app_profile(如app_proxr)的.C文件,和app_profile_task(如app_proxr_task)的.c文件。

一般地:

在操作系統ke內核看來。Profile和profile_task共同完畢一個task任務,當中app_proxr_task的task ID標識是TASK_PROXR。但app_profile和app_profile_task並非一個詳細的task任務,在代碼文件夾的app文件夾。全部的task。包含app_proxr_task和app_batt_task(電池)、app_sec_task(安全)共同組成一個task。在app.c中完畢任務創建。task的ID標識是TASK_APP。

各個app_profile_task僅僅只是完畢應用的一個子場景功能,如防丟、電池告警等。

app是主動發送消息給profile,以運行對應的藍牙GATT服務和操作,並接受回調。即app是profile的上層。

Profile任務運行GATT服務/屬性的詳細創建create、開啟服務enable和屬性特征的讀寫等操作,其調用ATT和GAP等底層接口來實現詳細功能。

Profile作為接口供給app層調用。app是通過消息通信來完畢接口調用的。

app_profile的代碼一般包含主動調用的接口實現。而app_profile_task則是接受消息回調的接口實現。兩者的分工是很清晰的。


四、應用開發框架

DA14580的應用開發框架的核心是基於狀態機和消息回調。下面分析以防丟proxr為例。

1.    狀態機

每一個任務都必須明白自己的狀態表。比如proxr的狀態表是:


狀態的初始化和轉換是由用戶主動切換的。

在某個確定的狀態時。內核會在對應的狀態響應接口集中遍歷全部發給該任務的消息。

每一個任務都會在初始化時被創建。比如proxr任務的創建是:


這時,如果有個其它的任務發一個消息給TASK_PROXR。則會在proxr_disabled中查找對應的消息回調接口,並運行回調。

2.    消息回調

接下來看看各個狀態的響應接口集,比如PROXR_CONNECTED連接狀態時的狀態響應接口集例如以下。可見,其會對兩個消息進行回調,一個是底層ATT收到對特征值的寫操作時運行回調,還有一個應用層主動改寫還有一個特征值。在筆者的防丟和計步應用中,前者是實現防丟告警功能。后者是上報計步數據。


3.    任務間通信

消息發出之后,系統即會運行proxr_jibu_update_req_handler回調。

 

另外。筆者會依據文章的閱讀量考慮進一步對DA14580的SDK進行分析。如系統啟動過程、服務建立過程以及上面說的。怎樣進行應用開發,即藍牙協議棧方面怎樣新增一個GATT profile(服務和特征值定義及操作)、SOC內核方面怎樣驅動外圍設備、系統應用框架上怎樣使用定時器和任務間消息通信等等。


很多其它原創請關注微信公眾號:嵌入式企鵝圈

                                                                              




免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM