號稱全球最低功耗藍牙單芯片DA14580在可穿戴市場、健康醫療、ibeacon定位等市場獲得普遍的應用,可是由於其較爲封閉的技術/資料支持致使開發人員有較高的技術門檻,網絡上也極少看到有關DA14580的開發技術分享,所以通常企業和通常技術團隊都不敢貿然採用該平臺,但一旦精通該芯片平臺的開發,便可在藍牙方案應用開發中得到較大的技術優點。微信
做者在集成電路領域有較爲深厚的積累,在DA14580平臺也有豐富的開發經驗,接下來將以一個系列文章對DA14580的硬件架構和軟件體系進行分析。如需技術諮詢,請發郵件yqwucheng@163.com聯繫。網絡
本文分析DA14580的硬件架構和睡眠、喚醒技術。睡眠和喚醒便是低功耗的核心技術。這裏從硬件的角度去分析睡眠和喚醒的原理。而睡眠和喚醒的軟件框架和實踐後續再展開。架構
1、DA14580硬件架構框架
DA14580硬件體系架構以下圖:dom
可見,DA14580包括三個部分:異步
1)使用ARM公司的cortex M0做爲CPUprocessor處理器。函數
2)使用RivieraWaves公司的IP核做爲BLEcore和基帶、射頻部分。oop
3)集成時鐘管理CMU、電源管理PMU、memory控制存儲和其餘外圍模塊控制器,如GPIO、UART、I2C、SPI和timer等等。設計
通常地,DA14580用於藍牙BLE應用時,會使用兩個外部晶振,其中16M晶振用於CPU執行相關的模塊(如M0和memory),也會分頻給部分peripheral。而32K晶振則用於BLE精確基準時鐘和睡眠時的低功耗部分電路。調試
2、DA14580低功耗(睡眠和喚醒)
藍牙單芯片的低功耗主要指的是整個硬件系統的睡眠和喚醒。而低功耗主要針對電源和時鐘管理。這是由集成電路的特性所決定的。
1. 睡眠
對於睡眠,從以上架構來看,其包括如下部分:
1) CPU睡眠,即cortex M0。根據cortex M0的體系結構,其包括兩種睡眠模式:normal sleep和deep sleep,其會映射到M0的寄存器和不一樣的硬件電路。須要注意的是,CPU在兩種模式下並無多大區別,可是各個SOC廠商在集成cortex M0時會對這兩種模式對peripheral部分進行不一樣的控制。如DA14580會在M0的deepsleep上再細分兩種模式,即extended sleep和deepsleep。前者RAM數據是能夠保持的,然後者則不保持。
2)BLE core 協議棧、基帶和RF射頻部分睡眠。對於M0的低功耗來講,有不少的指導文檔,可是RivieraWaves的BLE部分的資料極少,方案商均可能沒有,只有研發DA14580的dialog公司纔有,開發人員只有從DA14580的SDK中理解源碼,並經過不斷的調試驗證來獲取低功耗控制的經驗。這也是不少公司選擇TI而不選擇DA做爲藍牙應用的緣由。可是DA14580的功耗確實是業界最強,若是能掌握將在物聯網產業極具技術優點。
3)peripheral部分睡眠,此部分包括其餘集成模塊,如memory和UART、GPIO、TIMER、SPI、中斷控制等等。DIALOG公司在DA14580的SPEC規格書上也沒有公開系統設計的框架圖,只有部分寄存器的描述,因此要想精通DA14580的peripheral低功耗控制的方法和調試,也是要花費不少的時間。並且,睡眠和喚醒的調試是相對困難的,須要掌握方法。
4)對於以上的各個部分,咱們都是要考慮時鐘CLOCK和電源,對於高級CPU可能有動態調頻調壓,但對於藍牙單芯片,基本是disable電源和clock。
對於cortex M0來講,WFI指令對應的電路使用一種稱爲State Retention Power Gating的技術來控制電源,並且結合cotext M0的wakeup interrupt controller模塊能夠喚醒CPU。對於時鐘,則是disable 16M高頻晶振。
對於BLE,須要主動disable其時鐘[16M或者8M]和電源。BLE的時鐘源是32KHz,這裏關閉是指BLE的時鐘部分,而不是徹底disable 32K外部晶振。由於其還須要給喚醒部分提供時鐘。
對於peripheral部分,則是關閉電源和時鐘,因爲其主要使用16M晶振的分頻,因此當16M晶振中止工做時,其天然也沒有時鐘了。
2. 喚醒
對於DA14580的喚醒,其主要有兩個喚醒源。一個是同步喚醒源,來源於BLE的內部定時器(默認10秒)和BLE事件;另外一個是異步喚醒源,即喚醒中斷,能夠配置爲任意引腳喚醒,其即便用cortex M0指定的WIC技術。
WIC(wakeup interruptcontroller)是獨立於CPU和中斷控制工做的,但WIC檢測到電平變化(也能夠計數到指定數值時)即會提醒PMU給CPU供電,並啓動內部RC震盪電路提供時鐘,並維持中斷信號給CPU中斷部分,這樣CPU能夠從睡眠中喚醒。
那麼,對於DA14580的喚醒,須要注意什麼呢?
1)BLE的喚醒定時器設置
2)DA14580的外部喚醒設置
DA14580支持wakuptimer來喚醒,其可以監測任意引腳的電平變化計數,能夠是上升沿也能夠是降低沿。其經過WIC接入CPU。
3、低功耗代碼框架
以上知識只是說明如何作好睡眠和喚醒的設置工做,當CPU執行WFI指令時,即進入睡眠狀態。那麼,睡眠和喚醒的設置應該在何時執行?喚醒以後對喚醒中斷產生的消息/事件、BLE timer事件如何處理?還有CPU喚醒中斷後返回用戶態時要先作什麼事情?這些都應該是低功耗代碼框架要考慮的因素。
DA14580軟件體系決定的消息/事件是基於BLE TIMER基準時鐘的,例如內核的定時器ke-timer是BLE-CORE的組成部分,並非peripheral中的定時器。而schedule函數將處理全部pending的消息事件。這裏,假定CPU是由BLE TIMER喚醒的,這時喚醒以後BLE CORE是正常工做的,所以schedule是能夠正常執行的。以上爲同步喚醒過程。
異步喚醒便是由wakeup timer中斷喚醒,喚醒後BLE timer可能仍是disable狀態。
咱們暫且不去區分DA14580的SDK對於異步喚醒中斷產生的事件和BLE timer同步喚醒產生的事件。並基於同步喚醒給出低功耗睡眠代碼框架:
Voidmain_loop(void)
{
While(1)
{
Schedule();//處理完全部的消息事件會返回
Disable BLE;//關閉BLECORE
Disable Radio;//關閉射頻
Disable peripheral power domain;//關閉外圍控制部分
Set CPU DEEP SLEEP.//CPU 睡眠設置
WFI(); //等待中斷
Set CPU active.//喚醒以後CPU設置active狀態;在BLE TIMER喚醒中斷服務中應該要enable BLE CORE, RADIO, peripheral等部分。
}
}
若是要同時支持異步中斷及其產生的異步消息/事件,同時處理extended sleep和deep那sleep兩種模式的影響,那麼低功耗代碼框架會變得複雜。做者往後再從軟件實踐的角度詳細分析DA14580如何支持低功耗特性。
嵌入式企鵝圈原創團隊由阿里、魅族、nvidia、龍芯、炬力、拓爾思等資深工程師組成。百分百原創,每週兩篇,分享嵌入式、Linux、物聯網、GPU、Android、自動駕駛等技術。歡迎掃碼關注微信公衆號:嵌入式企鵝圈,實時推送原創文章!