涂鸦智能IOT方案设计指南¶
开发入门¶
概述¶
本文为我司语音芯片和涂鸦IOT平台对接的开发使用指南,旨在快速生成demo演示固件和专属SDK,以方便开发人员快速进行项目开发。
开发环境¶
以下是开发过程中需要的软件和硬件:
- IDE开发软件
- 串口升级工具
- 涂鸦AIOT开发板
IDE开发软件¶
SDK中所有的应用可以通过IAR IDE开发软件编译以及使用,有关该软件的更多信息请访问: ☞ https://www.iar.com/iar-embedded-workbench/, 用户可以自行联系IAR公司或其经销商采购该软件并使用。为避免产生兼容性问题,建议使用以下版本。
串口升级工具¶
我司提供CI110系列芯片所使用的串口升级工具PACK_UPDATE_TOOL.exe,用于烧录及升级固件使用。关于串口升级步骤详见第5章烧录。
开发板介绍¶
涂鸦AIOT标准开发板有两套,分别为CI-B02GS02T-MB和TYDE5-VCT2-WB3S。若您还没有开发板,请您联系启英泰伦或者涂鸦商务获取开发板。
开发板1¶
底板型号:CI-B02GS02T-MB
模块型号:离线语音模块VCT1+wifi模块WB2S
开发板2¶
底板型号:TYDE5-VCT2-WB3S
模块型号:离线语音模块VCT2+wifi模块WB3S
开发板使用说明¶
- 输入电源5V/GND
使用时请接入5V电源。
- 模式选择支持升级模式、正常模式
短接PG和EN —> 升级模式:通过本司的串口升级工具,更新Flash 里面的固件。
不进行任何短接 —> 正常模式:不能进行串口升级。如果Flash里固件正确,系统正常启动。
注意:短接SEL和EN或者PG和EN,必须重新上电,才会起作用。如果短接PG和EN后,1s内没有使用串口升级工 具进行升级,系统仍然会正常启动。
- UART0_TX和UART0_RX
处于升级模式时,TX0、RX0用于串口升级使用,升级完成进入系统后,TX0用于Log(Log详见第5章)输出。
- 麦克风底座
使用时请插入麦克风。
- 喇叭底座
使用时请插入喇叭。
开发流程¶
涂鸦平台相关操作¶
注册登录涂鸦平台¶
登录 ☞ 涂鸦开发者,点击右上角 注册,免费获取一个涂鸦智能开发者账号。
注意:通过以上步骤注册的账号拥有最高权限。请妥善保存您的账号,避免您创建的硬件产品、App、设备运行或者用户数据受到安全风险。
开发者账号注册后,使用已注册的账号登录 ☞ IoT工作台。您可以先进行产品创建和接入,其他功能需要后台审核通过后才可正常使用。
完成企业认证:企业账号是指在 ☞ IoT工作台 注册的账号,并且填写企业相关信息后,通过涂鸦智能的认证。目前,全新版企业认证主要是提交企业对公账号。
完成涂鸦智能认证的企业账号将拥有账号权益。更多详情,请前往 ☞ 云市场 查看。
有关企业认证的具体操作流程,请参见 ☞ 企业认证流程。
选择品类和创建产品¶
在IoT工作台创建一个产品是智能化的第一步。
- 点击 创建产品,该产品即在涂鸦云上注册生成,并生成产品唯一标示
PID
。
- 选择品类,例如在 小家电 下选择产品类别,如空气净化器。单击图标,填写 产品名称,选择 联网方式,然后单击 确定。
注意:选择的产品类别非常重要,将影响到后续产品功能及 App 界面的推荐。如果您需要的产品类别不在选择之中,请 ☞ 联系涂鸦智能 添加。
图2-3 创建产品空气净化器
功能定义¶
功能点 是指产品具有的功能抽象,通过不同数据类型进行表示(Datapoint,简称 DP
)。例如,最简单的设备**开关**下,具备功能为**开启**、关闭,将其抽象为一个布尔型 DP
点,0 表示关闭,1 表示开启。
功能点是一个产品最重要的属性,产品智能化的第一步就是明确产品功能,并逐一在工作台上进行创建。后续用于嵌入式开发的 MCU SDK 及产品的 App 控制界面都将根据产品功能自动生成。
在 标准功能 中,涂鸦 IoT 工作台已根据您所选择的品类设定 必选 功能点。同时,您可在功能选择器左侧,选择您需要的功能点进行添加。
若标准功能点无法满足您的产品开发需求,您可添加 自定义功能 以及开启所需的 云功能。
注意:标准功能 中,不支持删除带有 必选 标识的功能点。产品进入试产量产阶段后,将无法再次修改功能点。
导出功能¶
确定好产品DP后,点击右上角的导出功能按钮
注意:每次产品DP有更新时,请同步更新该功能表。后续在CI平台在线制作demo固件和生成SDK时,需基于此功能表填写**AIOT语音固件功能表**。
配置APP界面¶
涂鸦智能提供多种 App 控制界面模板供选择。您也可使用自由配置模板,自行搭建、设计产品 App 控制界面,快速实现 App 设备控制界面。
App 控制界面是智能产品的皮肤。目前,IoT 工作台提供不同样式的模板供选择,根据面板主题平铺显示。您可根据样式喜好及产品功能,综合考虑后进行选择。
推荐面板:提供丰富的可视化组件,无需编程,可直接基于推荐面板,简单拖拽,在线快速生成个性化App界面。点击 ☞ 面板 DIY 操作指南 查看如何快速在线完成App面板自定义。
自由配置模板:可以对不同的产品功能设置不同样式的组件、颜色、图标、背景等,创作出期望的界面。
开发调试模板:可查看调试日志,App调试时使用。不建议发布给用户。
部分类别模板支持标准功能,不支持自定义功能。请在选择模板时综合考虑。
说明:支持自行配置带有 自定义 标识的 App 界面,但是需升级您的账号到企业版账号后,才能配置带有企业版标识的界面。
**创建成功:**使用选中的模板,产品即创建成功,并且可以立即用手机扫码体验你的产品。
说明:您需要用 涂鸦智能App 中的 扫一扫 功能才可以体验产品。更多详情,请扫码下载涂鸦智能 App。
现在,您可以在手机上预览产品,体验产品功能及界面样式。
硬件选择¶
根据产品硬件结构定义选择合适的wifi模块进行开发调试。
注意: 1. 模块有两款,分别是:wb2s(插件式)和wb3s(贴片式)。
- 模块固件请联系涂鸦BD/PM,告知其需烧录离线语音方案通用固件。
云端配置¶
云端配置项包含 固件升级、多语言管理、告警设置、配网信息、快捷开关设置 和 场景联动设置 六项。这些功能配置项都可以通过全球部署的涂鸦云为终端消费者提供优质的个性化产品体验,并且能够实时更新生效,无需重新更换硬件出货。
其中,多语言管理、配网信息 和 场景联动设置 需要根据您的产品销售区域、配网方式和功能特点进行精细化管理。
投产安排¶
如果您的产品已经调试完成,就可以进入产品开发的投产安排,购买试产和量产模块,进行产品发布和生产。
-
前往 ☞ IoT工作台产品列表 。
-
鼠标悬浮至一款 开发中 的产品,单击 进入开发。
-
单击 投产安排。
-
确认 开发中 状态的产品信息,单击 确认样品测试完成。
- 在弹框中,请确认是否完成开发。单击 确认进入试产状态,产品会从开发中状态变更为试产状态。
说明:如果是电工、照明类产品,在确认 开发中 状态变更为试产状态时,会多一步涂鸦云测 App 的安装确认。您可以将测试结果以报告的形式进行上传。
- 在 试产中 界面下,单击 采购试产模块,进入采购中心进行批量采购模块。
- 完成试产模块采购后,返回 试产中 页面,单击 确认试产测试完成,并在查看产品详细信息后以及确认无误后,单击 发布产品,进入量产。
注意:为避免功能修改对已发布售卖的产品的影响,量产状态不可以回退到试产状态。
- 在 量产中 状态时,单击 购买量产模块,进入采购中心完成下单操作,开始批量生产产品。
启英泰伦平台相关操作¶
注册登录AI平台¶
登录 ☞ 启英泰伦语音AI平台 ,若还没有账号,请先点击**还没有账号**进行**注册**,免费获取一个启英泰伦语音AI开发者账号。
注意:请用户在注册语音AI平台后,认证为企业用户,以方便使用平台全部的功能。
语音固件制作¶
菜单栏中点击**定制产品**,然后选择**定制涂鸦AIOT固件**,最后点击**创建**按钮,即可开始在线制作涂鸦AIOT语音固件。
下载AIoT样例¶
语音固件制作,产品基本信息(产品类型,模组型号,语音类型,声学模型等)填写,并点击**下载涂鸦AIOT中文表格样例**和**下载AIOT语音固件在线生成指南**。
注意:调试模式**选择**on,会自动生成涂鸦AIOT语音固件和定制化SDK;选择**off**,只生成涂鸦AIOT语音固件。
3.4 填写AIoT表格¶
请结合在涂鸦平台导出的产品功能定义表格,填写语音AIOT表格。下面将以空调为例,进行AIOT表格填写说明。
步骤一:定义产品功能,导出功能表,复制PID,具体操作步骤请参考2.2~2.4小节。
步骤二:打开产品功能表和语音AIOT样例表格。
涂鸦产品功能表如下:
涂鸦AIOT语音样例表格如下:
步骤三:填写PID。从涂鸦开发者平台复制产品PID信息并粘贴到涂鸦AIOT语音样例表格的PID一栏。
步骤四:确定欢迎语、休息语和提示语。播报语句内容可以自定义。
步骤五:确定唤醒词。如无特殊需求,建议直接使用“小智管家”作为唤醒词,播报语句内容支持自定义。
- 唤醒词的音节覆盖尽量多且差异大,最少为4个音节。
- 相似音节尽可能避免,字的发音清晰响度要大。
- 应避免使用日常用语,如:吃饭啦,在生活中经常用到,容易误识唤醒。
- 应避免使用叠词,如:你好你好。
- 为了保证唤醒率,降低误唤醒,一个模型仅允许一个唤醒词。
步骤六:确定特殊系统命令词。特殊系统命令词不可修改,播报语句内容支持自定义。
步骤七:产品控制类命令词及DP信息填写。
- 首先根据产品功能点,确定与其对应的命令词。如开关(打开空调、关闭空调)、温度设置(十六度~三十一度)、工作模式(自动模式、制冷模式、加热模式、除湿模式、送风模式、节能模式)。
- 命令词一般为4-6个字,4个字最佳,如:你好小格,芝麻开门,智能管家。
- 中文命令词中只能由汉字组成,不允许有空格,逗号等其他字符。
- 生僻字和零声母字应尽量避免,如语音识别,“语音”两个字均为零声母字,应尽量避免。
- 相似音节尽可能避免,字的发音清晰响度要大。
- 命令词不允许词内或词间存在中英文混合。
-
确定每个命令词对应的播报语,支持自定义。
-
将涂鸦产品功能表中DP ID、功能点、标识符、数据传输类型、功能点类型、功能点属性依次按序拷贝到语音AIOT表格相对应的位置中,并将**标识符**一列中的文本首字母改写成**大写字母**。
注意:需要将拷贝后的**标识符**一列中的文本首字母改写成**大写字母**,目的是为了与C语言中的关键字区分,否则可能会导致生成的代码编译报错。
- 确定DP值。根据功能点类型(raw、bool、value、string、enum、fault)和功能点属性,确定DP值。
如:打开空调→bool型→1为开→DP值为1;
关闭空调→bool型→0为关→DP值为0;
十六度→value型→功能点属性(数值范围:16-31,间距:1, 倍数:0,单位:℃)→DP值为16;
三十一度→value型→功能点属性(数值范围:16-31,间距:1, 倍数:0,单位:℃)→DP值为31;
自动模式→enum型→功能点属性(枚举值auto, cold, hot, wet, wind, eco)→DP值为0;
节能模式→enum型→功能点属性(枚举值auto, cold, hot, wet, wind, eco)→DP值为5;
步骤八:场景命令词(文本上报,云端匹配执行)确定。同时需要填写国家码(CN中文,EN英文)、场景命名(为该场景取一个变量名)。
如:回家场景→国家码(CN)->场景命名(go_home_scene);
全开场景→国家码(CN)→场景命名(all_open_scene);
good night mode→国家码(EN)→场景命名(good_night_mode);
在线生成固件¶
提交表格后,等待**5分钟左右**即可生成涂鸦AIOT语音固件和项目专属SDK。若提示生成固件失败,请先检查上传的表格内容是否有误。
下载语音固件和SDK¶
点击下载语音固件按钮,获取语音demo固件和SDK。下载完成后使用PACK_UPDATE_TOOL.exe工具烧录升级该固件到语音模块。烧录完成后,即可用于演示。
应用开发¶
通过3.6节,可获得项目专属SDK。该SDK将会把数据DP自动编码,开发更便捷。开发人员可在该SDK进一步实现产品业务逻辑及应用开发。
SDK整体架构介绍¶
文件名 | 作用 |
---|---|
components | 目录为组件,包括播放器、ASR识别、按键、传感器、FreeRTOS操作系统等 |
doc | 文档目录 |
driver | 目录包括CI110系列芯片底层驱动 |
platform | 目录包括平台相关配置 |
sample | 目录包括示例工程 |
startup | 目录包括CI110系列芯片启动代码 |
system | 目录包括系统相关代码、中断处理程序文件 |
tools | 工具目录,主要是合并、打包升级工具 |
示例工程介绍¶
为了帮助开发者快速进行项目开发,TUYA_AIOT_SDK生成时会自动创建好的示例工程。通过示例工程,开发者可以很快速的熟悉SDK。
示例工程路径:TUYA_AIOT_SDK\sample\internal\
工程文件 | 作用 |
---|---|
sample_tuya_iot | tuya_iot 离线语音样例工程 |
任务创建及用户层初始化¶
在sampl_main.c的vTaskCreate函数中创建tuya_application_layer_i2c_asr_task;当选用语音模块做为MCU时,还需创建tuya_application_layer_uart_task;并进行用户层tuya_user_main_init初始化如下图:
/*涂鸦处理I2C和ASR相关任务*/
xTaskCreate(tuya_application_layer_i2c_asr_task, "tuya_application_layer_i2c_asr_task", 256, NULL, 4, NULL);
/*涂鸦处理串口相关任务,当语音模块作为MCU使用时*/
xTaskCreate(tuya_application_layer_uart_task, "tuya_application_layer_uart_task", 256, NULL, 4, NULL);
/* 涂鸦用户层主初始化函数 */
tuya_user_main_init();
驱动初始化¶
在tuya_application_layer.c的tuya_user_main_init函数中,进行i2c通信和LED指示灯初始化;当语音模块作为MCU使用时,还需进行uart通信初始化,如下图。
/**
* @brief 涂鸦用户层主初始化函数
*/
void tuya_user_main_init(void)
{
/* 离线语音模块与IOT模块I2C通信初始化 */
tuya_i2c_communicate_init();
/* MCU与IOT模块UART通信初始化 */
tuya_uart_communicate_init();
/* LED指示灯初始化 */
tuya_led_init();
}
离线语音识别处理¶
在system_msg_deal.c的sys_deal_asr_msg函数中进行语音识别处理。通过使能TUYA_ASR_DEAL_BY_CMDID_EN宏,使能语音识别命令词ID处理tuya_application_process_asr_cmd接口函数。
uint16_t cmd_id = cmd_info_get_command_id(cmd_handle);
//语音识别命令词ID处理
tuya_application_process_asr_cmd(cmd_id);
ASR和I2C自动编码¶
使用AI平台生成的SDK,将会自动生成命令词id(系统命令词、控制命令词、场景命令词)与i2c协议命令字类型,数据点DP进行自动编码,如下。
//asr和i2c自动编码数据类型
typedef int (*tuya_asr_process_func) (int index, void *param);
typedef struct
{
unsigned short asr_id; // 语音命令词ID, 识别后进行数据编码
signed char dpid; // 接收到涂鸦数据点
unsigned char fr_type; // 协议命令字类型
int value; // 具体DP值,当DP为string 的时候,存的是映射表
tuya_asr_process_func func; // 处理回调函数
}tuya_asr_process_item_t;
//语音识别及i2c系统命令自动编码
tuya_asr_process_item_t tuya_asr_process_item[] =
{
{-1, -1, 0x0, -1, tuya_special_recv_ack_by_i2c},//心跳包ACK
{-1, -1, 0x1, -1, tuya_special_product_info_by_i2c},//语音模块产品信息
{-1, -1, 0x3, -1, tuya_special_wifi_work_state_by_i2c},//wifi工作状态
{-1, -1, 0x65, -1, tuya_special_recv_system_cmd_by_i2c},//系统DP音量、MIC等
{2, -1, 0x0, 1, tuya_special_set_volume},//增大音量
{3, -1, 0x0, 0, tuya_special_set_volume},//较小音量
{4, -1, 0x0, 1, tuya_special_enable_prompt},//打开提示音
{5, -1, 0x0, 0, tuya_special_disable_prompt},//关闭提示音
{6, -1, 0x0, -1, tuya_special_start_config_wifi},//开始配网
{7, -1, 0x0, -1, tuya_special_confirm_config_wifi},//确认配网
{11, -1, 0x6, -1, tuya_open_all_switch_asr_output}, //打开所有插座
{12, -1, 0x6, -1, tuya_close_all_switch_asr_output},//关闭所有插座
{13, 1, 0x6, 1, tuya_switch_1_asr_output},//打开插座一
{14, 1, 0x6, 0, tuya_switch_1_asr_output},//关闭插座一
{15, 2, 0x6, 1, tuya_switch_2_asr_output},//打开插座二
{16, 2, 0x6, 0, tuya_switch_2_asr_output},//关闭插座二
{17, 3, 0x6, 1, tuya_switch_3_asr_output},//打开插座三
{18, 3, 0x6, 0, tuya_switch_3_asr_output},//关闭插座三
{201, -1, 0x66, -1, tuya_scene_asr_output}, //回家场景
{202, -1, 0x66, -1, tuya_scene_asr_output}, //离家场景
{203, -1, 0x66, -1, tuya_scene_asr_output}, //全开场景
{204, -1, 0x66, -1, tuya_scene_asr_output}, //全关场景
};
//语音场景控制命令相关
char go_home_scene[] = "回家场景";
char leave_home_scene[] = "离家场景";
char all_open_scene[] = "全开场景";
char all_close_scene[] = "全关场景";
//文本场景数据类型
typedef struct
{
unsigned short asr_id; // 命令词ID,用于本地命令词,识别后编码数据到涂鸦
unsigned char country_code[2]; // 国家码
char *addr; // 具体的地址
}tuya_scene_item_t;
tuya_scene_item_t tuya_scene_item[] =
{
{201, "CN", go_home_scene},
{202, "CN", leave_home_scene},
{203, "CN", all_open_scene},
{204, "CN", all_close_scene},
};
MCU UART自动编码¶
若选择语音模块作为MCU,则还会自动生成mcu uart自动编码,如下。
//mcu应用层uart自动编码数据类型
typedef void (*tuya_applicaiont_func) (int index, void *param);
typedef struct
{
unsigned short asr_id; // 命令词ID, 用于本地命令词,识别后编码数据到涂鸦
short dp; // 接收到,涂鸦数据点。
unsigned char fr_type; // 协议命令字类型
tuya_applicaiont_func func; // 处理回调函数
}tuya_applicaiont_item_t;
tuya_applicaiont_item_t tuya_applicaiont_item[] =
{
{-1, -1, 0x0, tuya_special_heat_beat_reply_by_uart},//心跳回复
{-1, -1, 0x1, tuya_special_product_info_by_uart}, //MCU产品信息
{-1, -1, 0x2, tuya_special_mcu_work_mode_by_uart}, //MCU工作模式
{-1, -1, 0x3, tuya_special_wifi_work_state_by_uart},//wifi工作状态
{13, 1, 0x36, tuya_switch_1_uart_input},//打开插座一,0x36带控制来源
{14, 1, 0x36, tuya_switch_1_uart_input},//关闭插座一,0x36带控制来源
{13, 1, 0x6, tuya_switch_1_uart_input},//打开插座一,0x06不带控制来源
{14, 1, 0x6, tuya_switch_1_uart_input},//关闭插座一,0x06不带控制来源
{15, 2, 0x36, tuya_switch_2_uart_input},//打开插座二,0x36带控制来源
{16, 2, 0x36, tuya_switch_2_uart_input},//关闭插座二,0x36带控制来源
{15, 2, 0x6, tuya_switch_2_uart_input},//打开插座二,0x06不带控制来源
{16, 2, 0x6, tuya_switch_2_uart_input},//关闭插座二,0x06不带控制来源
{17, 3, 0x36, tuya_switch_3_uart_input},//打开插座三,0x36带控制来源
{18, 3, 0x36, tuya_switch_3_uart_input},//关闭插座三,0x36带控制来源
{17, 3, 0x6, tuya_switch_3_uart_input},//打开插座三,0x06不带控制来源
{18, 3, 0x6, tuya_switch_3_uart_input},//关闭插座三,0x06不带控制来源
};
注意 命令字0x06为一代老协议,不支持控制来源;命令词0x36为二代新协议,支持控制来源,MCU上电后应主动通过0x36命令主动发起**打开附** DP 类型拓展服务,详细协议请参考《Tuya_wifi_涂鸦云通用串口通讯协议》,这样语音模块即可通过MCU反馈信息来解析出控制来源进而选择是否要进行TTS播报 。
用户配置选项¶
1.开发者可在tuya_special_protocol.h中配置语音模块及MCU的产品信息,如版本号,PID等。
#define PRODUCT_KEY "r6osmwrnturxt8zt" //产品PID
#define MCU_VER "1.0.0" //MCU软件版本号
#define VOICE_MODULE_HARDWARE_VER "1.0.0" //语音模块硬件版本号
#define VOICE_MODULE_SOFTWARE_VER "1.0.0" //语音模块软件版本号
#define VOICE_MODULE_WAKEUP_CMD "小智管家" //唤醒词
2.开发者可在usercofig.h中配置打印串口,默认音量,唤醒时间,i2c、uart通信、唤醒指示灯、网络指示灯、MIC声道等选项。
//日志打印串口设置
#define CONFIG_CI_LOG_UART HAL_UART0_BASE
// 默认音量设置
#define VOLUME_DEFAULT 80 //voice play default volume level
// 退出唤醒时间
#define EXIT_WAKEUP_TIME 15000 //唤醒后,退出唤醒的超时时间,默认15秒。
//VCT模块IO相关配置
#define TY_I2C_PROTOCOL_SCL_PAD (I2C0_SCL_PAD)
#define TY_I2C_PROTOCOL_SDA_PAD (I2C0_SDA_PAD)
#define TY_I2C_PROTOCOL_HAL_NUM (IIC0)
#define TY_I2C_PROTOCOL_SPEED (100)
#define TY_I2C_INT_PIN_BASE HAL_GPIO4_BASE
#define TY_I2C_INT_PIN_NAME AIN0_PAD
#define TY_I2C_INT_PIN_PORT GPIO4
#define TY_I2C_INT_PIN_NUMBER gpio_pin_5
#define TUYA_UART UART1
#define TUYA_UART_BAUDRATE_DEFAULT UART_BaudRate9600
#define WAKEUP_LED_IO_PIN_BASE HAL_GPIO2_BASE
#define WAKEUP_LED_IO_PIN_NAME PWM4_PAD
#define WAKEUP_LED_IO_PIN_PORT GPIO2
#define WAKEUP_LED_IO_PIN_NUMBER gpio_pin_3
#define NETWORK_LED_IO_PIN_BASE HAL_GPIO2_BASE
#define NETWORK_LED_IO_PIN_NAME PWM5_PAD
#define NETWORK_LED_IO_PIN_PORT GPIO2
#define NETWORK_LED_IO_PIN_NUMBER gpio_pin_4
#define MIC_L_REF_R 0 //涂鸦VCT模块MIC使用右声道
#define MCU_SOC_AIOT_EN 1 //1:使用语音模块作为MCU 0:使用第三方芯片作为MCU
注意 1.VCTX模块MIC使用的右声道(#define MIC_L_REF_R 0 //VCTX模块MIC使用右声道) 2.其他模块MIC使用的左声道 (#define MIC_L_REF_R 1 //其他模块MIC使用左声道 )
固件烧录与调试¶
Images 相关¶
CI110系列芯片应用要有5个images:asr.bin、dnn.bin、user.bin、user_file.bin和voice.bin
- asr.bin:语音模型
- dnn.bin:声学模型
- user.bin:开发者开发的应用程序
- user_file.bin:开发者定义的命令词列表以及开发者其他的bin文件
- voice.bin:播报音
Images 处理工具¶
- 路径:TUYA_AIOT_SDK\sample\internal\C\firmware\
- 名称:合成分区bin文件.bat
- 作用: 调用本脚本后,会在firmware\asr、dnn、user_file、voice各自目录下自动生成asr.bin、dnn.bin、user_file.bin和voice.bin文件
烧录方式¶
使用串口升级工具进行升级固件,以sample_tuya_iot工程为例进行烧录代码。
步骤1:串口升级硬件连线
- 1:电源(5V/GND)
- 2:短接PG和EN
- 3:TX0和RX0连接到USB转串口工具的RXD和TXD
- 4:USB转串口工具,连接到PC
步骤2:编译代码生成user.bin文件
进入TUYA_AIOT_SDK\sample\internal\sample_tuya_iot project\下, 如下图所示:
首先使用IAR打开ci110_project.eww文件,然后clean工程,如下图所示:
最后make(编译)工程,入下图所示:
TUYA_AIOT_SDK\sample\internal\sample_tuya_iot\fifirmware\user_code生成的应用代码user.bin,如下图所示:
步骤3:生成其他所需4个bin文件
进入TUYA_AIOT_SDK\sample\internal\sample_tuya_iot firmware\下, 如下图所示:
运行合成分区bin文件.bat,处理完成后cmd.exe自动退出,如果没有自动退出,生成.bin文件失败,请检查asr、dnn、user_fifile、voice下文件是否正确。
步骤4:将5个bin文件打包成一个bin文件
方式一:进入TUYA_AIOT_SDK\sample\internal\sample_tuya_iot firmware\下, 运行打包升级.bat,如下图所示。
方式二:进入TUYA_AIOT_SDK\tools\,打开PACK_UPDATE_TOOL.exe。
芯片选择CI110系列芯片,然后点击固件打包,界面如下图所示:
确认5个分区预留大小是否适合,例如user.bin的实际大小为0x262A3字节,但是预留大小为0x23000字节。此时需要将user区的预留大小调整为0x27000字节。voice.bin的实际大小为0XD80B9字节,voice预留大小为0x25000字节,此时将voice预留大小重新设置为0XD9000字节。
注意 1.预留大小按照0x1000的整数倍进行配置。 2.配置预留大小后需要刷新地址。
点击打包固件,出现固件已生成的窗口,表示固件制作完成。如下图所示:
点击OK后,在TUYA_AIOT_SDK\sample\internal\sample_tuya_iot\firmware目录下生成一个.bin文件。.bin文件的名字由打包界面软件名称和软件版本组成。如下图所示:
步骤5:升级固件
完成上述步骤后。建议进行下面的确认:
1.确保连线正确(详见步骤1)
2.确保进入升级模式(详见2.5.3模块介绍)
3.确保USB转串口连接到PC,PC能够识别到COM端口
4.确保固件生成正确
5.确保麦克风和喇叭正确插入开发板
点击固件升级按钮。界面如下图所示:
选择步骤4生成的固件或者本司提供的固件,如下图所示:
选择正确的COM端口,勾选强制更新所有分区和擦除NV选项,如下图所示:
复位(可通过断电重启的方式)开发板,开发板自动开始升级。升级完成后显示update successful界面如下图所示。升级完成后,请先取消勾选或者关闭串口升级工具。
步骤6:验证固件
烧录完成后,系统会自动重启,sample_tuya_iot工程启动后会有语音播报。播报完成后,说唤醒词“小智管家”后,播报“我在”,表示升级成功。
调试¶
有两种方式可以调试应用程序:
- 使用log 机制跟踪代码的执行和数据。
- 使用IAR 和 Jlink调试代码,增加/删除breakpoints(断点)以及访问/追踪memory。
Log机制¶
通过串口打印log的方式来追踪应用程序的执行情况。
Log 输出管脚配置¶
UART0_TX管脚是默认Log UART的输出引脚(也可将log功能重新配置其他引脚)。如果配置其他串口作为log输出,配置宏CONFIG_CI_LOG_UART。下图以sample_tuya_iot工程为例,使用UART2_TX作为Log输出:
建议用户将该宏定义到工程目录下的user_config.h,不要直接修改sdk_default_config.h里面的宏定义。
Log 串口工具配置¶
PC使用串口工具配置如下:
注意 由于串口输出的数据有中文,建议使用支持UTF-8字体的串口工具。推荐串口工具SecureCRT,有关SecureCRT更多信息请问☞ https://www.vandyke.com/products/securecrt/
Log 打印通用接口¶
通用log打印接口:
mprintf(fmt, args…),用法和printf相同。
Log 打印封装接口¶
为了方便用户调试,SDK封装以下接口:
Debug API | Funtion |
---|---|
ci_logverbose(comlevel, message, args…) | 日志打印–详细 |
ci_logdebug(comlevel, message, args…) | 日志打印–调试 |
ci_loginfo(comlevel, message, args…) | 日志打印–信息 |
ci_logwarn(comlevel, message, args…) | 日志打印–警告 |
ci_logerr(comlevel, message, args…) | 日志打印–错误 |
ci_logassert(comlevel, message, args…) | 日志打印–断言 |
调试等级,表示log要打印的级别。定义了7种类别:
Debug Level | Usage Scenario |
---|---|
#define CI_LOG_VERBOSE | 全部打印 |
#define CI_LOG_DEBUG | 调试、信息、警告,错误、断言 |
#define CI_LOG_INFO | 信息、警告,错误、断言 |
#define CI_LOG_WARN | 警告、错误、断言 |
#define CI_LOG_ERROR | 错误、断言 |
#define CI_LOG_ASSERT | 断言 |
#define CI_LOG_NONE | 不打印 |
注意:使用这些封装接口前,必须将CONFIG_CI_LOG_EN定义为1。
Log 打印长度配置¶
#define UART_LOG_BUFF_SIZE 512
默认打印长度512个字节,可配置宏UART_LOG_BUFF_SIZE修改打印长度。
IAR 和 Jlink调试代码¶
详见IAR内的使用手册,有关IAR的更多信息请访问☞ https://www.iar.com/iar-embedded-workbench/
相关链接¶
更多SDK基础介绍,请访问 ☞CI110系列芯片SDK。
想了解涂鸦智能,请访问 ☞涂鸦智能介绍 。