软件著作权申报材料模板软件设计说明书.docx
- 文档编号:16563659
- 上传时间:2023-07-14
- 格式:DOCX
- 页数:21
- 大小:406.34KB
软件著作权申报材料模板软件设计说明书.docx
《软件著作权申报材料模板软件设计说明书.docx》由会员分享,可在线阅读,更多相关《软件著作权申报材料模板软件设计说明书.docx(21页珍藏版)》请在冰点文库上搜索。
软件著作权申报材料模板软件设计说明书
XXXX智能耳机底层驱动软件设计说明书
1、引言
1.1、编写目的
本设计说明书针对XXXX智能耳机(以下简称智能耳机)的底层驱动软件而编写。
目的介绍系统的各个模块,为进行后面的实现作准备。
1.2、定义
MCU:
MicroControllerUnit
BLE:
BluetoothLowEnergy
SDK:
SoftwareDevelopmentKit
1.3、参考资料
设备接入接口协议V2.3
微信蓝牙外设协议1.0.4
微信硬件平台技术方案
微信硬件平台介绍
微信硬件平台框架说明及接入流程
微信硬件平台蓝牙demo需求
XXXX智能耳机MCU软件需求说明书
UM-B-003_DA14580_Software_development_guide
UM-B-014_DA14580_Development_Kit
UM-B-015_DA14580_Software_architecture
2、设计概述
2.1、设计任务
智能耳机首先是一款耳机,然后才是通过蓝牙与微信客户端连接实现更多的扩展功能。
所以MCU软件需要实现两方面的功能,向下驱动底层硬件并实现逻辑控制,向上通过蓝牙跟微信客户端通信并实现扩展功能,如图2-1。
图2-1设计任务
2.2、设计约束和限制
MCU:
dialogDA14580
蓝牙:
4.0BLE
编程语言:
C语言
3、总体设计
为了节省开发时间,使用dialog官方SDK(以下简称“SDK”)开发。
SDK是一个小型操作系统,实现基本任务调度和消息传递,并实现蓝牙4.0BLE协议栈,如图3-1。
图3-1BLE协议栈
根据设计任务,本项目开发只需要编写硬件驱动和微信服务相关的代码,并且也只对这两方面进行描述。
总体结构如图3-2。
图3-2总体结构
4、模块描述
4.1、陀螺仪模块
该模块实现陀螺仪的电源管理和数据采样功能。
4.1.1、电源管理
电源管理功能实现陀螺仪电源打开和关闭,由输入控制。
(1)输入
陀螺仪使能标识:
uint8_tpower3DEnable
绑定状态:
uint8_tbindSta
(2)输出
打开或关闭陀螺仪。
(3)代码实现
if((03==power3DEnable)||(1==bindSta))//如果app主动打开陀螺仪或在
{//绑定期间
if(lsm6ds0_init_flag==false)//如果陀螺仪状态在关闭状态
open//打开陀螺仪
}
else
{
if(lsm6ds0_init_flag==true)//如果陀螺仪状态在打开状态
close//关闭陀螺仪
}
4.1.2、数据采样
数据采样功能采样陀螺仪实时加速度和角速度。
(1)输入
无
(2)输出
加速度:
floatXFloatValue[3]
角速度:
floatGFloatValue[3]
(3)代码实现
//加速度采样代码
voidLSM6DS0_X_GetAxesRaw(int16_t*pData)
{
uint8_ttempReg[2]={0,0};
tempReg[0]=i2c_eeprom_read_byte(LSM6DS0_XG_OUT_X_L_XL);
tempReg[1]=i2c_eeprom_read_byte(LSM6DS0_XG_OUT_X_L_XL+1);
pData[0]=((((int16_t)tempReg[1])<<8)+(int16_t)tempReg[0]);
tempReg[0]=i2c_eeprom_read_byte(LSM6DS0_XG_OUT_Y_L_XL);
tempReg[1]=i2c_eeprom_read_byte(LSM6DS0_XG_OUT_Y_L_XL+1);
pData[1]=((((int16_t)tempReg[1])<<8)+(int16_t)tempReg[0]);
tempReg[0]=i2c_eeprom_read_byte(LSM6DS0_XG_OUT_Z_L_XL);
tempReg[1]=i2c_eeprom_read_byte(LSM6DS0_XG_OUT_Z_L_XL+1);
pData[2]=((((int16_t)tempReg[1])<<8)+(int16_t)tempReg[0]);
}
voidLSM6DS0_X_GetAxes_Float(float*pData)
{
uint8_ttempReg=0x00;
int16_tpDataRaw[3];
floatsensitivity=0;
floatroll=0;
floatpitch=0;
floatyaw=0;
//I2C初始化
i2c_eeprom_init(LSM6DS0_I2C_SLAVE_ADDRESS,
LSM6DS0_I2C_SPEED_MODE,LSM6DS0_I2C_ADDRESS_MODE,LSM6DS0_I2C_ADDRESS_SIZE);
LSM6DS0_X_GetAxesRaw(pDataRaw);
tempReg=i2c_eeprom_read_byte(LSM6DS0_XG_CTRL_REG6_XL);
tempReg&=LSM6DS0_XL_FS_MASK;
switch(tempReg)
{
caseLSM6DS0_XL_FS_2G:
sensitivity=0.061;
break;
caseLSM6DS0_XL_FS_4G:
sensitivity=0.122;
break;
caseLSM6DS0_XL_FS_8G:
sensitivity=0.244;
break;
}
int32_ttemp=(int32_t)(pDataRaw[0]*sensitivity);
floatf=(float)(temp*1.00);
roll=f/1000.00;
temp=(int32_t)(pDataRaw[1]*sensitivity);
f=(float)(temp*1.00);
pitch=f/1000.00;
temp=(int32_t)(pDataRaw[2]*sensitivity);
f=(float)(temp*1.00);
yaw=f/1000.00;
pData[0]=roll;
pData[1]=pitch;
pData[2]=yaw;
}
//角速度采样代码
voidLSM6DS0_G_GetAxesRaw(int16_t*pData)
{
uint8_ttempReg[2]={0,0};
tempReg[0]=i2c_eeprom_read_byte(LSM6DS0_XG_OUT_X_L_G);
tempReg[1]=i2c_eeprom_read_byte(LSM6DS0_XG_OUT_X_L_G+1);
pData[0]=((((int16_t)tempReg[1])<<8)+(int16_t)tempReg[0]);
tempReg[0]=i2c_eeprom_read_byte(LSM6DS0_XG_OUT_Y_L_G);
tempReg[1]=i2c_eeprom_read_byte(LSM6DS0_XG_OUT_Y_L_G+1);
pData[1]=((((int16_t)tempReg[1])<<8)+(int16_t)tempReg[0]);
tempReg[0]=i2c_eeprom_read_byte(LSM6DS0_XG_OUT_Z_L_G);
tempReg[1]=i2c_eeprom_read_byte(LSM6DS0_XG_OUT_Z_L_G+1);
pData[2]=((((int16_t)tempReg[1])<<8)+(int16_t)tempReg[0]);
}
voidLSM6DS0_G_GetAxes_Float(float*pData)
{
uint8_ttempReg=0x00;
int16_tpDataRaw[3];
floatsensitivity=0;
//I2C初始化
i2c_eeprom_init(LSM6DS0_I2C_SLAVE_ADDRESS,LSM6DS0_I2C_SPEED_MODE,LSM6DS0_I2C_ADDRESS_MODE,LSM6DS0_I2C_ADDRESS_SIZE);
LSM6DS0_G_GetAxesRaw(pDataRaw);
tempReg=i2c_eeprom_read_byte(LSM6DS0_XG_CTRL_REG1_G);
tempReg&=LSM6DS0_G_FS_MASK;
switch(tempReg)
{
caseLSM6DS0_G_FS_245:
sensitivity=8.75;
break;
caseLSM6DS0_G_FS_500:
sensitivity=17.50;
break;
caseLSM6DS0_G_FS_2000:
sensitivity=70;
break;
}
floatf=(float)(pDataRaw[0]*sensitivity);
pData[0]=f/1000.00;
f=(float)(pDataRaw[1]*sensitivity);
pData[1]=f/1000.00;
f=(float)(pDataRaw[2]*sensitivity);
pData[2]=f/1000.00;
}
4.2、降噪模块
降噪模块实现降噪功能的开关,由输入控制。
(1)输入
app开关控制:
boolANCEnable
按键动作:
uint8_tbuttonValue
人体感应失效时长:
staticuint16_tlosttimeCount
(2)输出
打开或关闭降噪功能。
(3)实现代码
if(0==buttonValue)//如果没有按键操作
{
if(true==powerRNFlag)//如果在打开降噪功能状态
{
if((false==ANCEnable)||(losttimeCount>=3minutes))
{
close
}
}
else
{
if(true==ANCEnable)
{
open
}
}
}
elseif(1==buttonValue)//使用按键关闭降噪功能
{
close
}
else//使用按键打开降噪功能
{
open
}
4.3、电量检测模块
电量检测模块定时检测电池剩余电量。
(1)输入
无
(2)输出
剩余电量,百分比表示。
(3)实现代码
uint8_tgetBattery(void)
{
curbattery=battery_get_lvl(BATT_CR2032);
returncurbattery;
}
4.4、指示灯模块
指示灯模块由一个红色和一个绿色指示灯组成,红色指示灯指示电池是否电量低,绿色指示灯作上电指示、绑定指示、蓝牙连接指示和降噪功能开关状态指示。
指示灯状态由输入条件控制。
4.4.1、红色指示灯
(1)输入
电池剩余电量:
uint8_tcurbattery
(2)输出
指示灯状态
(3)实现代码
if(0==curbattery)
{
指示灯闪烁
}
else
{
指示灯灭
}
4.4.2、绿色指示灯
(1)输入
系统刚上电标识:
staticuint8_tGREEN_LED_Flag
绑定状态:
uint8_tbindSta
蓝牙连接上指示灯延时:
uint8_tBLELEDDelay
降噪开关状态:
boolpowerRNFlag
(2)输出
指示灯状态
(3)实现代码
if(1==GREEN_LED_Flag)//如果刚上电
{
闪烁2s
}
elseif(1==bindSta)//在请求绑定状态
{
急闪
}
elseif(BLELEDDelay)//在蓝牙刚连接上
{
常亮
}
else
{
if(true==powerRNFlag)//如果打开降噪
{
呼吸灯效果
}
else//否则
{
常灭
}
}
4.5、微信服务模块
4.5.1、模块概述
微信服务模块底层依托蓝牙BLE协议栈,顶层通过微信Protobuf协议对厂商自定义应用协议进行封装,这样外设(本项目中表现为智能耳机)和厂商服务器之间就可以通过微信平台以透传的方式实现通信,数据流图如图4-1。
图4-1数据流图
微信服务模块时序如图4-2。
通信使用请求——应答模式,厂商服务器使用SendDataPushReq命令请求,智能耳机使用SendDataReq命令应答,应用层协议附带在Protobuf协议可变长度包体内,Protobuf协议数据包结构如图4-3。
|||
||SendDataPushReq(seq=0)|
|||
|||
|SendDataPushReq(seq=0)||
|||
|||
|SendDataReq(seq=n)||
|||
|||
||SendDataReq(seq=n)|
|||
|||
||SendDataResp(seq=n)|
|||
|||
|SendDataResp(seq=n)||
|||
|||
图4-2时序图
图4-3Protobuf协议数据包结构
微信服务模块应用层协议数据格式如表4-1。
表4-1应用层协议数据格式
字段名称
CmdId
Param
CRC16校验码
字段长度(byte)
1byte
nbytes
2bytes
字段说明
命令
参数,长度根据命令而定
CmdId和Param的校验,高字节在前低字节在后
应用层协议命令列表如表4-2,目前只用到部分命令,剩余没用到的用于后续扩展所需。
表4-2应用层协议命令列表
数据方向
命令ID分布
手机外设
21--70
外设手机
71--120
根据不同CmdId可划分为多个小模块,如图4-4。
图4-4微信服务模块图
4.5.2、软件流程
微信服务软件流程图如图4-5。
是
图4-5微信服务软件流程图
是
是
是
否
否
否
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 软件 著作权 申报材料 模板 软件设计 说明书