号称全球最低功耗蓝牙单芯片DA14580在可穿戴市场、健康医疗、ibeacon定位等市场得到广泛的应用,但是因为其较为封闭的技术/资料支持导致开发人员有较高的技术门槛,网络上也极少看到有关DA14580的开发技术分享,因此一般企业和一般技术团队都不敢贸然采用该平台,但一旦精通该芯片平台的开发,即可在蓝牙方案应用开发中获得较大的技术优势。
本文分析DA14580的硬件架构和睡眠、唤醒技术。睡眠和唤醒即是低功耗的核心技术。这里从硬件的角度去分析睡眠和唤醒的原理。而睡眠和唤醒的软件框架和实践后续再展开。
一、DA14580硬件架构
DA14580硬件体系架构如下图:
可见,DA14580包括三个部分:
1)使用ARM公司的cortex M0作为CPUprocessor处理器。
2)使用RivieraWaves公司的IP核作为BLEcore和基带、射频部分。
3)集成时钟管理CMU、电源管理PMU、memory控制存储和其他外围模块控制器,如GPIO、UART、I2C、SPI和timer等等。
一般地,DA14580用于蓝牙BLE应用时,会使用两个外部晶振,其中16M晶振用于CPU执行相关的模块(如M0和memory),也会分频给部分peripheral。而32K晶振则用于BLE精确基准时钟和睡眠时的低功耗部分电路。
二、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。
三、低功耗代码框架
以上知识只是说明如何做好睡眠和唤醒的设置工作,当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如何支持低功耗特性。