zoukankan      html  css  js  c++  java
  • 全球最低功耗蓝牙单芯片(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内核方面怎样驱动外围设备、系统应用框架上怎样使用定时器和任务间消息通信等等。


    很多其它原创请关注微信公众号:嵌入式企鹅圈

                                                                                  



  • 相关阅读:
    面试题
    关于TDD的想法
    GAMS 基础语法
    不要迷信数据
    在Microsoft AJAX Library下JavaScript的面向对象开发
    应用OOP的设计过程演化(一)
    应用OOP的设计过程演化(二)
    探索AJAX中的消息传输模式(一)
    应用OOP的设计过程演化(三)
    SecureCRT 6.0.2和SecureFX 6.0.2 软件 及 注册机
  • 原文地址:https://www.cnblogs.com/yxysuanfa/p/7185756.html
Copyright © 2011-2022 走看看