zoukankan      html  css  js  c++  java
  • 全球最低功耗蓝牙单芯片DA14580的硬件架构和低功耗

      号称全球最低功耗蓝牙单芯片DA14580在可穿戴市场、健康医疗、ibeacon定位等市场得到广泛的应用,但是因为其较为封闭的技术/资料支持导致开发人员有较高的技术门槛,网络上也极少看到有关DA14580的开发技术分享,因此一般企业和一般技术团队都不敢贸然采用该平台,但一旦精通该芯片平台的开发,即可在蓝牙方案应用开发中获得较大的技术优势。

      作者在集成电路领域有较为深厚的积累,在DA14580平台也有丰富的开发经验,接下来将以一个系列文章对DA14580的硬件架构和软件体系进行分析。如需技术咨询,请发邮件yqwucheng@163.com联系。

      本文分析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如何支持低功耗特性。

      嵌入式企鹅圈原创团队由阿里、魅族、nvidia、龙芯、炬力、拓尔思等资深工程师组成。百分百原创,每周两篇,分享嵌入式、Linux、物联网、GPU、Android、自动驾驶等技术。欢迎扫码关注微信公众号:嵌入式企鹅圈,实时推送原创文章!

    这里写图片描述

  • 相关阅读:
    86. Partition List
    2. Add Two Numbers
    55. Jump Game
    70. Climbing Stairs
    53. Maximum Subarray
    64. Minimum Path Sum
    122. Best Time to Buy and Sell Stock II
    以场景为中心的产品设计方法
    那些产品经理犯过最大的错
    Axure教程:如何使用动态面板?动态面板功能详解
  • 原文地址:https://www.cnblogs.com/yueqian-scut/p/5347631.html
Copyright © 2011-2022 走看看