号称全球最低功耗蓝牙单芯片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、自动驾驶等技术。欢迎扫码关注微信公众号:嵌入式企鹅圈,实时推送原创文章!