全球最低功耗蓝牙单芯片(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内核方面怎样驱动外围设备、系统应用框架上怎样使用定时器和任务间消息通信等等。
很多其它原创请关注微信公众号:嵌入式企鹅圈