目录
1.概述
1.1 简介
UDP1FS是一个提供串口的语音模块方案,完美的集成了MP3的硬解码。同时软件支持工业级别的串口通信协议,以SPIFLASH作为存储介质。通过简单的串口指令即可完成播放指定的语音,以及如何播放语音等功能,无需繁琐的底层操作,使用方便,稳定可靠是此款产品的最大特点。
1.2 功能
1.3 应用
2.1 参数说明
2.2 管脚说明 -- 测试DEMO板
2.3 简单测试方法
2.4一些可能不容易理解的概念或者名词详细说明
2.5串口下载流程说明---最为核心的部分
2.5.1 串口下载的协议
2.5.2 串口下载的详细说明 -- [分区2]
2.5.3 串口下载的相关指令说明[A0][A1][A2][A3]
3.1 通讯格式
3.2 通讯指令
3.2.1 控制指令
3.2.2 查询指令
3.3 芯片返回的数据
3.3.1 芯片上电返回的数据[3F]
3.3.2 语音播放完毕主动返回的数据[0x39][0x3E]
3.3.3 芯片接收数据正常返回的ACK
KT803C蓝牙wifi电信2G4G远程串口更新下载MP3语音芯片ic方案_kt404a怎么写入语音-C文档类资源-CSDN下载KT803C芯片只是基于KT404A芯片开发出来的单独一个软件版本,用以满足串口下载语音的需求kt404a怎么写入语音更多下载资源、学习资料请访问CSDN下载频道.https://download.csdn.net/download/qyvhome/9932832
无需任何烧录器,无需任何软件,USB直接烧写FLASH。同时支持串口直接下载语音
UDP1FS模块是基于KT803C芯片开发的测试模块,用以满足串口下载语音的需求
兼容KT803C[SSOP24] 和 KT804C[SOP16]两款芯片的测试
2、24位DAC输出,动态范围支持90dB,信噪比支持85dB
3、最大支持16M字节的SPIFLASH。例如W25Q16[2M字节]、W25Q128[16M字节]
4、Miniusb接口更新语音文件,无需安装任何软件。支持XP和WIN7系统。
5、30级音量可调。支持外挂多种类型的功放,如3W、5W、10W等等
1、 车载导航语音播报
2、 公路运输稽查、收费站语音提示;
3、 火车站、汽车站安全检查语音提示;
4、 电力、通信、金融营业厅语音提示;
5、 车辆进、出通道验证语音提示;
6、 公安边防检查通道语音提示;
8、 电动观光车安全行驶语音告示;
9、 机电设备故障自动报警;
10、消防语音报警提示;
芯片选用的是SOC方案,集成了一个16位的MCU,以及一个专门针对音频解码的aDSP,采用硬解码的方式,更加保证了系统的稳定性和音质。小巧的封装尺寸更加满足嵌入其它产品的需求
名称 |
参数 |
MP3文件格式 |
1、支持所有比特率11172-3和ISO13813-3 layer3音频解码 |
2、采样率支持(KHZ):8/11.025/12/16/22.05/24/32/44.1/48 |
|
3、支持Normal、Jazz、Classic、Pop、Rock等音效 |
|
USB接口 |
2.0标准 |
UART接口 |
标准串口,TTL电平,波特率可设[用户不可设] |
输入电压 |
3.7V-5.2V[7805后级串一个二极管为最佳] |
额定电流 |
10MA[静态] |
低功耗电流 |
<200uA |
功放功率 |
负载32欧姆0.25W[只支持驱动耳机][不支持直接驱动喇叭] |
尺寸 |
参见封装章节 |
工作温度 |
[-40度] -- [80度] |
湿度 |
5% ~ 95% |
主芯片型号 |
KT803C[SSOP24] --- KT804C[SOP16] |
引脚序号 |
引脚名称 |
功能描述 |
备注 |
|
1 |
GND |
地[负极] |
系统地 |
|
2 |
RX |
UART串行数据输入 |
3.3V的TTL电平 |
|
3 |
TX |
UART串行数据输出 |
3.3V的TTL电平 |
|
4 |
DR |
芯片DAC输出右声道 |
||
5 |
DL |
芯片DAC输出左声道 |
||
6 |
SPK2 |
外接单声道喇叭 |
不可超过4欧姆3W |
|
7 |
IO4 |
通用输入输出口4 |
||
8 |
IO3 |
通用输入输出口3 |
||
9 |
IO1 |
通用输入输出口1 |
||
10 |
IO2 |
通用输入输出口2 |
||
11 |
SPK1 |
外接单声道喇叭 |
不可超过4欧姆3W |
|
12 |
BUSY |
播放状态脚 |
播放时输出低 |
|
13 |
V33 |
|||
14 |
USB+ |
USB数据线DATA+ |
||
15 |
USB- |
USB数据线DATA- |
||
16 |
VIN |
电源输入[正极] |
最大5.2V |
备注:模块内置单声道功放。另外模块第1脚和第16脚都有丝印标注的
(1)、用户如果拿一个喇叭对模块进行测试,把喇叭的两个脚分别连接SPK1和SPK2.
(2)、DACL和DACR只能推动耳机,是芯片内部自己产品的音频信号,就像电脑的音频接口一样
2、直接使用安卓的充电线下载或者供电即可[非typeC接口]
3、用户拿到模块,可以用镊子IO1到地[模拟一个微动开关]来判断
模块是否正常,但是前提是设备中至少要有1段语音
4、模块如果正常播放声音之后,就可以使用串口对模块进行正常的
测试了
5、一定不要用usb连接电脑供电,因为会进入下载模式
分区的概念 以及 为什么要有分区 |
1、由于我们将spiflash默认的分为了两个区间,平均分,所以下文会提到,分区1和分区2的概念. |
2、其中分区1 指的是可以通过USB下载固定语音的部分空间 -- 方便用户存储一些固定的语音 |
3、其中分区2 指的是通过串口动态更新的部分空间 -- 方便用户存储后期可能修改的语音 |
4、两个空间相互独立,互不干扰,可以分别控制,也可以统一控制,详见下文的介绍 |
上位机 以及 下位机 |
1、上位机 -- 代表用户使用的MCU 或者 我们提供电脑端的串口软件 |
2、下位机 -- 代表的是我们的主控芯片 --- 整个的流程请结合上位机进行参考 |
以下所有的流程,您只需要在逻辑上面分析一下,知道一个大概即可,我们有单独的上位机软件来配合调试的,所有的命令以及下载的流程都在上位机里面有体现
波特率:115200 数据位:8 奇偶校验:None 停止位:1 流控制:全部关闭
一、串口下载文件数据格式 (0xA1) ---- 这里只争对下载数据包
字节序号 |
字节内容 |
字节含义 |
1 |
0x7E |
起始标记 |
2 |
CMD |
命令字节 |
3 |
lenH |
包的序号--高字节[不包含校验和结束、自身] |
4 |
lenL |
包的序号--低字节[不包含校验和结束、自身] |
..... |
DAT |
数据区[固定256个字节] |
结束 |
0xEF |
结束标志 |
备注:我们规定一帧数据的数据区固定为256个字节 |
完整的下载有效数据格式:
帧头 |
命令 |
包序号[高字节] |
包序号[低字节] |
有效数据...... |
结束 |
0x7E |
0xA1 |
lenH |
lenL |
DAT[256] |
0xEF |
第一步如下:
|
2、首先分析这100.2KB的数据,将这个数据拆分为以256[0.25kb]个字节为单位的数据包.那么总共需要传400.8次才能将这一帧数据传完。重点注意后面的0.8次实际上是占用一次的,不够256个字节的字节补0。组成一个完整的256字节的数据包,即总包数为401包 |
3、开始握手。上位机发送7E A0 00 03 03 01 91 EF ==> 这个代表上位机准备发送下载数据,03代表的是第3个文件。这个数据的总包数为“0x0191= 401” ==> 下位机收到之后,会返回7E A0 00 02 00 00 EF,代表下位机准备就绪 ==> 此时上位机开始发送第一包数据,下位机收到之后,会返回“7E A0 00 02 00 01 EF”代表第一包数据收到, |
|
4、如果上位机在5秒之类没有收到下位机的应答,则重发。重发第二次还未收到应答,则意味着此次下载失败,上位机需要做的事情就是发送“复位命令”,然后等待100ms,再重新发起下载。 |
第二步如下:
1、如果第3个文件上位机发送完毕: |
2、上位机主动往下位机发送“7E A3 00 02 00 03 EF”,这样代表上位机已经将当前全部下发完毕。 |
3、等待下位机应答。如果下位机接收没问题,会返回这条指令作为应答,上位机再继续下一个文件的下载流程 |
【备注:每一包数据,我们芯片收到之后会自动写入到存储器之中。】 |
第三步如下:
1、如果上位机发送完所有的数据之后的处理 |
2、确认一下所有的应答都接收是否有误,如果无误,则上位机主动发出一个 “7E A3 00 02 00 00 EF” --- 代表整个下载过程完成,告知下位机退出下载模式 |
[dat1:分区1文件总数] [dat2:分区2文件总数--- 串口下载的部分] |
到这里整个串口下载的流程就完毕了。每一次下载都是这样的流程 |
第四步如下:--这里使用上位机单独下载一个文件的截图:
上位机 |
上位机这里的意思,是用户使用的MCU |
下位机 |
下位机这里的意思,是KT803C芯片。 |
1、下载信息交换(A0)
7E A0 00 03 03 01 91 EF |
上位机发起下载申请[dat1:文件编号][dat2:总包数高][dat3:总包数低] |
7E A0 00 02 00 00 EF |
下位机给上位机的应答,上位机收到就可以开始发送数据 |
7E A0 00 02 00 01 EF |
下位机返回给上位机第1包的应答,上位机收到发第2包数据 |
7E A0 00 02 00 02 EF |
下位机返回给上位机第2包的应答 |
.......... |
|
7E A0 00 02 01 91 EF |
下位机返回给上位机第401包的应答 |
7E A3 00 02 00 03 EF |
1、上位机在本文件的最后一包数据的应答收到之后,就发送这条命令 2、代表上位机当前文件的全部数据发送完毕,等待下位机校验之后的应答, 3、下位机校验无误之后,返回此帧数据,作为应答。 4、上位机收到之后开启下一个文件的数据发送流程 |
7E A3 00 02 00 04 EF |
代表第4个文件接收完毕,原理同上 |
... |
|
7E A3 00 02 00 0b EF |
代表第11个文件接收完毕,原理同上 |
7E A3 00 02 00 00 EF |
|
2、传输过程中出错的代码反馈【下位机到上位机】(A2)
7E A2 00 02 00 01 EF |
下位机传输超容量范围的应答 |
7E A2 00 02 00 02 EF |
文件编号错误的应答(未连续或未从第一个开始) |
7E A2 00 02 00 03 EF |
当前数据包接收错误,请求重发 |
7E A2 00 02 00 04 EF |
当前文件校验出错[针对单个文件下载完之后] |
7E A2 00 02 00 05 EF |
全部文件校验出错[针对全部文件下载完之后] |
这个暂时可以不处理。
3、备注说明如下:
|
|
串口作为一种在控制领域常用的通信,我们进行了工业级别的优化,加入的帧的校验、重发、错误处理等措施,大大加强通信的稳定性和可靠性,串口的通信波特率默认为115200,不可再设置
支持异步串口通讯模式,通过串口接受上位机发送的命令 停止位 :1 |
||
格式:$S VER Len CMD Feedback para1 para2 checksum $O |
||
1 |
0x7E |
起始标记 |
2 |
CMD |
命令字节 |
3 |
lenH |
包的序号--高字节 |
4 |
lenL |
包的序号--低字节 |
..... |
DAT |
数据区 |
结束 |
0xEF |
结束标志 |
举个例子,如果我们指定播放SPIFLASH的分区1里面的语音播放,就需要发送:7E A5 00 02 00 01 EF
数据长度为2 ,这2个字节分别是[00 01] 。代表是指定分区1的第1段语音播放
我们的通讯分为以下两大块
CMD命令 |
对应的功能 |
参数(16位) |
0x01 |
下一曲 |
|
0x02 |
上一曲 |
|
0x03 |
指定曲目(NUM) |
详见3.4.1 |
0x04 |
音量+ |
|
0x05 |
音量- |
|
0x06 |
指定音量 |
详见3.4.2 |
0x0C |
芯片复位 |
任何状态有效 |
0x0D |
播放 |
|
0x0E |
暂停 |
|
0x0F |
指定文件夹文件名播放 |
暂不开放 |
0x16 |
停止 |
|
0x17 |
指定文件夹循环播放 |
暂不开放 |
0x19 |
对当前播放的曲目设置为循环播放 |
暂不开放 |
0x21 |
组合播放 |
暂不开放 |
0x25 |
多文件夹插播 |
暂不开放 |
0x28 |
指定文件夹随机播放 |
暂不开放 |
0xA5 |
指定第一分区播放 |
详见3.4.1 |
0xA6 |
指定第二分区播放 |
详见3.4.2 |
0xA0 |
开始下载的起始指令 |
详见2.5.3 |
0xA1 |
下载的有效数据指令 |
详见2.5.3 |
0xA2 |
应答信息 |
详见2.5.3 |
0xA3 |
当前的文件下载完毕 |
详见2.5.3 |
这里是查询芯片的状态和相关的参数
CMD命令详解(查询) |
对应的功能 |
参数(16位) |
0x3C |
保留 |
|
0x3D |
保留 |
|
0x3E |
保留 |
|
0x3F |
查询初始化的状态 |
详见3.3.1 |
0x40 |
返回错误,请求重发 |
|
0x41 |
应答 |
|
0x42 |
查询当前状态 |
详见3.4.10 |
0x43 |
查询当前音量 |
|
0x49 |
查询FLASH的总文件数 |
高字节[第一分区] 低字节[第二分区] |
0x50 |
查询使用的flash的容量 |
芯片在关键地方均会有数据返回。供用户掌控芯片的工作状态
(1)、芯片上电初始化成功的数据
(2)、芯片播放完当前曲目的数据
(3)、芯片成功接收到指令返回的ACK(应答)
(4)、芯片接收一帧数据出错[包括数据没收完整、校验出错两种情况]
(5)、芯片在繁忙时,有数据过来,芯片会返回忙的指令
1、芯片上电,需要一定的时间初始化,这个时间是需要根据SPIFLASH设备的文件多少决定的,一般情况在小于500ms。如果超过这个时间芯片的初始化数据还没有发送出来,说明芯片初始化出错,请检查硬件的连接 |
2、芯片初始化返回的数据为当前的有效文件夹,譬如返回7E 3F 00 02 06 05 EF (1)、其中0x06代表的是第一分区的总文件数为6个 (2)、其中0x05代表的是第二分区的总文件数为5个 |
3、MCU必须等待芯片初始化指令发出之后才能发送相应的控制指令,否则发送的指令芯片将不予处理。同时还会影响芯片的正常初始化。 |
FLASH第一分区播放完第1曲 |
7E 3E 00 02 00 01 EF |
FLASH第二分区播放完第2曲 |
7E 39 00 02 00 01 EF |
|
|
3、方案模块通电之后,初始化正常 ,模块自动进入设备等待状态,等待用户发送播放的相关指令 |
1、芯片在所有的命令或者查询数据包接收完毕之后,会返回当前接收到的数据给MCU,作为接收到的ACK信号
/**
******************************************************************************
* @file main.c
* @author fire
* @version V1.0
* @date 2015-xx-xx
* @brief 串口接发测试,串口接收到数据后马上回传。
******************************************************************************
* @attention
*
* 实验平台:野火 STM32 F407 开发板
* 论坛 :http://www.firebbs.cn
* 淘宝 :https://fire-stm32.taobao.com
*
******************************************************************************
*/
#include "stm32f4xx.h"
#include "./usart/bsp_debug_usart.h"
#include "delay.h"
/**
* @brief 主函数
* @param 无
* @retval 无
*/
/**********************************************************
1、程序的整个下载流程比较复杂,不能想当然的理解,一定要配合我们给的上位机进行对比
2、下载流程,我们没有提供参考程序,需要您自己去写
3、上位机的源码我们是不提供的,您可以参考,原理其实也就是
握手---->分包发--->完毕--->退出下载---->MCU发指令点播
**********************************************************/
/**********************************************************
-- 这里是通过winhex,获取的一个小音乐文件的数组
-- 这里仅仅用来模拟测试而已
-- 很明显可以看到这个音乐文件,大概在2K
-- 这个语音文件的数组,播放的音乐是"8"
-- 详细的参见文档"20191209_如何使用WINHEX查看音频文件的数据以及生成数组"
**********************************************************/
unsigned char musicdata[2560] = {
0xFF, 0xF3, 0x28, 0xC4, 0x00, 0x09, 0xE0, 0x5D, 0x78, 0x0C, 0x18, 0xC6, 0x28, 0x0E, 0x00, 0xCA,
0x28, 0x48, 0xE3, 0x0B, 0x10, 0x2C, 0x71, 0x85, 0xA3, 0xC5, 0x62, 0x12, 0x38, 0xC3, 0x88, 0x07,
0x02, 0xDF, 0xE8, 0x32, 0xEF, 0xFF, 0xFF, 0xF4, 0x9A, 0x7F, 0xE8, 0x32, 0x09, 0x8A, 0xA1, 0xF9,
0x93, 0x26, 0x81, 0xC1, 0x65, 0x0C, 0x39, 0x25, 0x17, 0x0D, 0x80, 0xFC, 0x01, 0x13, 0xBE, 0x20,
0x71, 0x40, 0xC1, 0x22, 0xE3, 0x9D, 0xF2, 0xF9, 0xFF, 0xF3, 0x28, 0xC4, 0x13, 0x09, 0x30, 0x06,
0x9E, 0x5E, 0x00, 0x44, 0x02, 0x01, 0x39, 0xC6, 0xFE, 0x08, 0x3C, 0xE5, 0x1F, 0x9C, 0xFF, 0xFF,
0xEA, 0x04, 0xC1, 0xFF, 0xF3, 0xFE, 0x51, 0x7A, 0x90, 0x5D, 0x80, 0x19, 0x42, 0x64, 0x14, 0x46,
0xCB, 0x1D, 0x85, 0x4E, 0x10, 0x07, 0x54, 0x95, 0x00, 0x91, 0x10, 0xF0, 0x32, 0x7D, 0xE2, 0xAB,
0x04, 0x88, 0x9A, 0x4F, 0x4C, 0x8E, 0x09, 0x24, 0xE8, 0x5C, 0xC8, 0x99, 0xC1, 0x21, 0x43, 0x20,
0xFF, 0xF3, 0x28, 0xC4, 0x29, 0x10, 0x28, 0x4A, 0x5C, 0x3E, 0x32, 0x4C, 0x08, 0x60, 0xA1, 0xCF,
0xFA, 0x59, 0x43, 0xF9, 0x88, 0x81, 0x2C, 0x26, 0x64, 0xA0, 0x86, 0x27, 0xA0, 0x2E, 0x21, 0x88,
0xD0, 0x91, 0xCA, 0x6C, 0xC2, 0x2F, 0x39, 0x25, 0xB7, 0x61, 0xFF, 0xC0, 0x74, 0x3C, 0x55, 0x11,
0xC1, 0xF7, 0x43, 0x29, 0x52, 0x63, 0xFB, 0x13, 0x74, 0x55, 0x22, 0x59, 0xD5, 0x99, 0x3F, 0xC9,
0xE7, 0x44, 0x20, 0x76, 0xB3, 0x31, 0xB6, 0x62, 0xFF, 0xF3, 0x28, 0xC4, 0x23, 0x10, 0x52, 0x4E,
0x99, 0xBE, 0x10, 0x0B, 0xA2, 0x0F, 0x52, 0x68, 0x16, 0xFF, 0xF4, 0x14, 0xC8, 0x86, 0x6D, 0x5B,
0x33, 0x13, 0xB6, 0x40, 0xE0, 0x27, 0x2F, 0x4E, 0x26, 0x1F, 0x40, 0xDF, 0x2E, 0x58, 0xD9, 0x0A,
0xBD, 0x5B, 0xBA, 0xEA, 0x05, 0x2A, 0x72, 0x8D, 0x74, 0x03, 0x34, 0x83, 0x8F, 0x7B, 0x70, 0xF4,
0xD5, 0xBA, 0xA2, 0x94, 0x42, 0x35, 0xFF, 0x64, 0x6B, 0x68, 0x6F, 0xB9, 0xF4, 0xAF, 0xA2, 0xAF,
0xFF, 0xF3, 0x28, 0xC4, 0x1C, 0x10, 0x6A, 0x1E, 0x5C, 0xFE, 0x0A, 0x44, 0x10, 0x18, 0xB7, 0x83,
0x32, 0x29, 0x54, 0xAB, 0x2A, 0xA3, 0x94, 0x8C, 0x75, 0x4F, 0xFF, 0xFF, 0xF4, 0x9C, 0xFC, 0xDF,
0xFA, 0x32, 0xA9, 0x51, 0x50, 0x10, 0x20, 0x83, 0xEC, 0x00, 0x5B, 0xF0, 0x2A, 0xC1, 0x54, 0xF6,
0xFD, 0x5F, 0x6D, 0x09, 0x37, 0x1C, 0x92, 0x5B, 0xB0, 0xD8, 0x01, 0xD0, 0xD7, 0xC4, 0xB8, 0x3C,
0x21, 0x15, 0x29, 0x90, 0xC4, 0x44, 0x5D, 0x4A, 0xFF, 0xF3, 0x28, 0xC4, 0x15, 0x0F, 0x02, 0x1A,
0x8E, 0x5E, 0x10, 0x05, 0xC2, 0xF3, 0x5C, 0xDE, 0x67, 0xCD, 0xAF, 0x7F, 0x76, 0x2C, 0xCD, 0xA0,
0xE7, 0x55, 0x50, 0xA2, 0x5C, 0xC1, 0x81, 0x91, 0x94, 0xCA, 0x52, 0x3F, 0xF5, 0xBE, 0xCD, 0x7D,
0x16, 0x94, 0x7B, 0xB0, 0x85, 0x92, 0x54, 0xF2, 0xCA, 0x9C, 0xD9, 0xEB, 0x09, 0xC9, 0x24, 0xB4,
0x6B, 0x80, 0xFC, 0x01, 0xD3, 0x1D, 0xB4, 0x65, 0xD8, 0xA3, 0x5E, 0x7B, 0xD5, 0xD1, 0xF0, 0xB4,
0xFF, 0xF3, 0x28, 0xC4, 0x14, 0x0B, 0xE9, 0x2E, 0x96, 0x5E, 0x11, 0x84, 0x46, 0x5E, 0xBA, 0x5F,
0xFE, 0xB6, 0x80, 0x11, 0xB6, 0xA3, 0x3D, 0xC8, 0xEE, 0xD1, 0xC8, 0x91, 0x73, 0xFF, 0xFF, 0xFE,
0xB8, 0x7A, 0x91, 0x55, 0xB4, 0xDE, 0xB7, 0xB0, 0xD2, 0x01, 0x39, 0x2D, 0xB6, 0x8D, 0xC7, 0xE0,
0x01, 0xBD, 0x8A, 0x41, 0x32, 0x07, 0xE9, 0x13, 0xB3, 0x02, 0xD0, 0x9F, 0x75, 0x96, 0x5E, 0xB3,
0xA2, 0x96, 0x99, 0xFF, 0xFF, 0xEE, 0x5B, 0x02, 0xFF, 0xF3, 0x28, 0xC4, 0x1F, 0x0D, 0xD9, 0x2A,
0x96, 0x5E, 0x01, 0x84, 0x36, 0x19, 0x18, 0x38, 0x42, 0x8A, 0x20, 0x81, 0x60, 0xA8, 0x80, 0xD0,
0x54, 0x31, 0xFE, 0xFD, 0x28, 0x07, 0xCD, 0xEF, 0xC4, 0xAC, 0xAC, 0x39, 0x6D, 0x55, 0x4D, 0xC9,
0x25, 0xB4, 0x0D, 0x80, 0x45, 0xA2, 0x1C, 0xD4, 0x29, 0xA1, 0x04, 0x88, 0xB9, 0x93, 0x70, 0xB1,
0x87, 0xED, 0x5A, 0x37, 0xF9, 0xDB, 0x2A, 0xE0, 0xC4, 0x66, 0x78, 0x39, 0x89, 0x69, 0x04, 0xA4,
0xFF, 0xF3, 0x28, 0xC4, 0x22, 0x07, 0xF1, 0x2A, 0x96, 0x58, 0x10, 0x07, 0x27, 0x00, 0x7A, 0x1E,
0x13, 0xA7, 0x93, 0x8E, 0x68, 0x28, 0xCB, 0x84, 0x97, 0x78, 0xD4, 0x9B, 0xBC, 0x6A, 0x77, 0xF5,
0xD6, 0x7E, 0x23, 0xBF, 0x81, 0x5B, 0x7A, 0x5B, 0x37, 0xB6, 0x29, 0x7F, 0xE5, 0x22, 0xAD, 0x05,
0x33, 0x3C, 0x0D, 0x47, 0x17, 0x44, 0x0B, 0x9C, 0x34, 0xF9, 0x0F, 0xF1, 0xEE, 0xC0, 0x67, 0xDC,
0xC2, 0x79, 0x51, 0xCE, 0xEA, 0x81, 0x5B, 0xFA, 0xFF, 0xF3, 0x28, 0xC4, 0x3D, 0x0F, 0x51, 0x32,
0x34, 0x14, 0x78, 0x07, 0x24, 0x15, 0x13, 0xF6, 0xE0, 0x02, 0xD1, 0xB0, 0xA0, 0x5F, 0xB7, 0x63,
0x94, 0x29, 0x67, 0x67, 0x4F, 0xB7, 0x55, 0xAA, 0x4A, 0xF2, 0x35, 0x8E, 0xAC, 0x08, 0xD4, 0x05,
0x7F, 0xD7, 0xFF, 0xFF, 0xA3, 0x39, 0xD5, 0x9E, 0x8E, 0x24, 0x16, 0x0E, 0x0B, 0xF4, 0x1A, 0x22,
0x5C, 0xA8, 0x54, 0x8B, 0xFF, 0xFE, 0xBF, 0x8C, 0xEE, 0x74, 0x8A, 0x05, 0x6B, 0xBD, 0xB9, 0x25,
0xFF, 0xF3, 0x28, 0xC4, 0x3A, 0x0D, 0x29, 0xC6, 0x81, 0xBE, 0x10, 0x05, 0x0A, 0x90, 0x00, 0xEE,
0x1F, 0x3E, 0x70, 0x1C, 0x30, 0x32, 0x84, 0x6C, 0x6A, 0x9C, 0x91, 0xA8, 0x50, 0xC0, 0x40, 0xA3,
0x13, 0x90, 0xA3, 0x93, 0x7A, 0x18, 0x5C, 0x5C, 0xDE, 0x50, 0x10, 0x39, 0xCF, 0x80, 0xF2, 0xF0,
0x39, 0x70, 0xB8, 0x7F, 0x44, 0x63, 0xE2, 0xA4, 0xD6, 0x5D, 0xBF, 0xFE, 0x07, 0x07, 0xC1, 0xF0,
0x70, 0x10, 0xFE, 0x66, 0x0C, 0x06, 0x04, 0x0E, 0xFF, 0xF3, 0x28, 0xC4, 0x40, 0x0E, 0xF0, 0x0A,
0x7D, 0x9F, 0x42, 0x10, 0x02, 0x07, 0x03, 0xA2, 0x51, 0x68, 0xB4, 0x0A, 0x00, 0x80, 0x0C, 0x77,
0xA3, 0xE9, 0x8A, 0x33, 0xDA, 0x06, 0x15, 0x56, 0xE1, 0x7D, 0x09, 0x12, 0x18, 0xD3, 0x0E, 0x80,
0x07, 0xB2, 0xBA, 0x22, 0xD8, 0x64, 0xE6, 0x68, 0xED, 0x8F, 0xE4, 0xD8, 0xF1, 0x1C, 0x15, 0x1A,
0x55, 0x42, 0x82, 0x10, 0xC2, 0xE6, 0x84, 0xA8, 0x9C, 0x0E, 0x98, 0xBD, 0x6D, 0xA0, 0x83, 0x79,
0xFF, 0xF3, 0x28, 0xC4, 0x3F, 0x17, 0x3A, 0x23, 0x0E, 0x5F, 0x8D, 0x88, 0x02, 0x84, 0xD4, 0xD9,
0xD6, 0xFF, 0xFD, 0x9F, 0x77, 0x3A, 0xA4, 0x96, 0x82, 0x45, 0xC3, 0x6F, 0xFF, 0xFF, 0xB1, 0x7C,
0xB8, 0xA3, 0x22, 0x01, 0xE1, 0x7F, 0xFF, 0xFF, 0x80, 0xDF, 0xD5, 0x50, 0x20, 0xE0, 0x01, 0xA4,
0x97, 0x81, 0x99, 0x47, 0x41, 0x79, 0x58, 0x49, 0xD1, 0x47, 0xCC, 0xC7, 0xF1, 0x66, 0x75, 0xBD,
0x24, 0x84, 0x04, 0xDF, 0xD6, 0xB5, 0x88, 0xE0, 0xFF, 0xF3, 0x28, 0xC4, 0x1D, 0x13, 0xC2, 0x32,
0xF2, 0x37, 0xCD, 0x68, 0x02, 0x28, 0xE6, 0xCD, 0xF7, 0x20, 0x1A, 0x7D, 0x46, 0x23, 0x90, 0xB8,
0xDE, 0x89, 0x90, 0xDE, 0x69, 0x7F, 0x98, 0xBB, 0x7D, 0x68, 0xFF, 0xCF, 0xA1, 0xFD, 0x7F, 0xE8,
0x9B, 0xFF, 0x51, 0x9A, 0x6F, 0xEA, 0x3E, 0x58, 0x9B, 0xAB, 0xCC, 0x4E, 0x32, 0x32, 0x20, 0x87,
0x3B, 0xFF, 0x21, 0x88, 0xAC, 0xD1, 0x90, 0xC8, 0x28, 0x00, 0x79, 0x05, 0xC0, 0x69, 0x6F, 0xC8,
0xFF, 0xF3, 0x28, 0xC4, 0x09, 0x0F, 0x39, 0x36, 0xFD, 0x96, 0x3B, 0x4B, 0x02, 0x88, 0xCD, 0xF5,
0x34, 0xA0, 0x6F, 0xFC, 0x28, 0x43, 0xF3, 0x20, 0xEC, 0x30, 0x6F, 0xFA, 0x05, 0x8B, 0xFE, 0x83,
0xC0, 0x82, 0x9F, 0x28, 0x74, 0x39, 0xFC, 0xA0, 0x28, 0xB7, 0x59, 0xCE, 0x1A, 0x7F, 0x09, 0x72,
0xA0, 0x99, 0xFE, 0x04, 0xD2, 0x1D, 0x39, 0xD0, 0x1E, 0xE6, 0x7F, 0xA5, 0xE0, 0x37, 0xEB, 0xFF,
0x26, 0x62, 0x00, 0x20, 0x00, 0xA1, 0x01, 0x50, 0xFF, 0xF3, 0x28, 0xC4, 0x07, 0x0E, 0xB2, 0x4A,
0xEE, 0x3E, 0x68, 0x45, 0xA4, 0x1B, 0xF9, 0x24, 0x23, 0xFF, 0xCC, 0xC8, 0x4F, 0xEA, 0xCD, 0xC6,
0xDE, 0x82, 0xAA, 0x2F, 0x80, 0x2D, 0x2E, 0xFF, 0x27, 0x90, 0xBF, 0x9D, 0x18, 0x71, 0xB7, 0xFC,
0xB7, 0xFC, 0x9E, 0x7B, 0xFC, 0x5F, 0xF5, 0xFE, 0x5F, 0xF0, 0x3F, 0xF2, 0xFF, 0x86, 0x4F, 0xD0,
0xE1, 0xDB, 0x89, 0x1F, 0xFC, 0xB8, 0x39, 0xD6, 0x4A, 0x02, 0x80, 0x30, 0x01, 0xEE, 0x25, 0xC0,
0xFF, 0xF3, 0x28, 0xC4, 0x07, 0x0E, 0xC2, 0x42, 0xF6, 0x3E, 0x6A, 0x0B, 0x60, 0x3F, 0xCD, 0x47,
0x67, 0xF9, 0x14, 0xD3, 0xFA, 0xC5, 0x8F, 0xF5, 0x1A, 0x82, 0x04, 0xD5, 0xFF, 0x24, 0x4F, 0xFF,
0x3A, 0x3C, 0x00, 0x54, 0x58, 0xEB, 0x6B, 0x7C, 0x90, 0x49, 0x7F, 0xC1, 0x5B, 0xF8, 0xD1, 0xDF,
0xD0, 0x4F, 0xFE, 0xDF, 0xEB, 0xFE, 0x85, 0xFF, 0x56, 0xFF, 0x05, 0x67, 0x6F, 0x5B, 0x7A, 0xFF,
0xE8, 0x02, 0x80, 0x20, 0x01, 0x6D, 0x4A, 0x50, 0xFF, 0xF3, 0x28, 0xC4, 0x07, 0x0D, 0x01, 0x5E,
0xF6, 0x3E, 0x02, 0x8E, 0x3C, 0x28, 0x5C, 0x45, 0xFF, 0x95, 0x13, 0x3F, 0xC2, 0x81, 0xFB, 0xBD,
0x44, 0xA0, 0x19, 0x4F, 0xE2, 0x02, 0xFF, 0xE0, 0xF4, 0x91, 0xD5, 0x6E, 0x82, 0xF7, 0xFD, 0x09,
0xFF, 0xA9, 0x07, 0x70, 0x87, 0xBB, 0xA1, 0xFC, 0x57, 0xC3, 0x7E, 0xDE, 0xA7, 0x71, 0x30, 0x63,
0xFF, 0xEE, 0x02, 0x00, 0x20, 0x17, 0xA9, 0x40, 0xE7, 0xC0, 0x65, 0xFF, 0xE4, 0xD7, 0xF7, 0xC6,
0xFF, 0xF3, 0x28, 0xC4, 0x0E, 0x0C, 0x88, 0xF2, 0xEE, 0x16, 0x01, 0x9A, 0x24, 0x31, 0x9F, 0xBD,
0x65, 0x40, 0x25, 0x83, 0x98, 0x7B, 0xF2, 0x71, 0x1D, 0xBF, 0x50, 0xFC, 0x39, 0xD3, 0xEA, 0xF2,
0x5E, 0x8F, 0x35, 0xCB, 0x3F, 0xD3, 0xEE, 0xE1, 0xB3, 0x9C, 0x8F, 0xFC, 0x37, 0x7F, 0xE4, 0x5D,
0xC8, 0xD5, 0x02, 0xC0, 0x20, 0x49, 0x29, 0xB7, 0xDB, 0x01, 0x57, 0x02, 0x41, 0xBF, 0xF1, 0x80,
0xFF, 0xD0, 0x3C, 0xBF, 0xE2, 0x60, 0x46, 0xFD, 0xFF, 0xF3, 0x28, 0xC4, 0x16, 0x0C, 0xA0, 0xF7,
0x26, 0x5E, 0x01, 0xCA, 0x26, 0x4B, 0xFE, 0xE1, 0x21, 0x33, 0xFC, 0x0A, 0x1E, 0xC4, 0x46, 0xB9,
0x64, 0xF1, 0x12, 0x7C, 0x57, 0xCF, 0x6A, 0x06, 0x83, 0xDB, 0x45, 0x53, 0xC4, 0xBF, 0xE5, 0x43,
0x41, 0xC5, 0x02, 0x80, 0x22, 0x55, 0x37, 0xD6, 0xE0, 0x1D, 0x1B, 0x1F, 0xFF, 0x19, 0xFE, 0x60,
0x19, 0xFF, 0x56, 0x8A, 0xF8, 0x97, 0x89, 0x87, 0x31, 0x18, 0x34, 0x77, 0x9E, 0xF8, 0x4B, 0xFE,
0xFF, 0xF3, 0x28, 0xC4, 0x1E, 0x0B, 0x18, 0xAB, 0x0E, 0x3E, 0x00, 0xCA, 0x26, 0x12, 0xF2, 0x4E,
0xD4, 0xA0, 0x8D, 0x70, 0x69, 0xFF, 0xE5, 0x7D, 0x41, 0xC2, 0x7D, 0xEA, 0x50, 0x90, 0x5C, 0xB5,
0xBA, 0x02, 0x80, 0x0D, 0xFE, 0xA1, 0x88, 0xD4, 0x2F, 0x04, 0x3F, 0xF7, 0x20, 0x13, 0xFF, 0x9B,
0xF4, 0xD0, 0x2D, 0xFF, 0xAA, 0x13, 0xFD, 0x7F, 0xE9, 0xFF, 0xFF, 0xEB, 0xFF, 0xFF, 0xC3, 0x15,
0xFF, 0xAB, 0x37, 0xFF, 0xFF, 0xD1, 0x1D, 0x91, 0xFF, 0xF3, 0x28, 0xC4, 0x2C, 0x0C, 0x12, 0xC6,
0xE4, 0x7E, 0x01, 0x44, 0x4E, 0x58, 0x10, 0xE3, 0xFA, 0x6A, 0x05, 0xCB, 0x51, 0x29, 0x83, 0x98,
0x0D, 0xB2, 0x03, 0x1A, 0xC3, 0xF3, 0x90, 0x28, 0x90, 0x57, 0x2C, 0x4B, 0x9E, 0x2D, 0x95, 0x5A,
0x8D, 0xA4, 0x36, 0x7A, 0xAF, 0x18, 0x1D, 0xFA, 0xD6, 0x82, 0xC3, 0xC6, 0x7F, 0xFF, 0x8C, 0x42,
0xCE, 0xE2, 0xEE, 0x67, 0xFD, 0x61, 0xB5, 0x0A, 0x1F, 0x09, 0x01, 0x8D, 0xE2, 0x2D, 0x95, 0x80,
0xFF, 0xF3, 0x28, 0xC4, 0x36, 0x0D, 0x18, 0x5E, 0xD1, 0x9E, 0x00, 0xC4, 0x2A, 0x53, 0x69, 0x80,
0x15, 0x89, 0x01, 0xC5, 0x7F, 0xB2, 0x27, 0xFD, 0x38, 0xAB, 0xFE, 0x30, 0xB8, 0xA2, 0x26, 0xB9,
0x67, 0x77, 0xFB, 0xF1, 0xBC, 0x5E, 0x98, 0x4A, 0xD4, 0x41, 0xE1, 0x47, 0x69, 0xFF, 0x66, 0x6E,
0xC4, 0x95, 0x72, 0xF9, 0x6E, 0xDD, 0xE9, 0x83, 0x42, 0xC0, 0x55, 0x05, 0x2C, 0x7B, 0x10, 0x03,
0x08, 0x23, 0x92, 0x00, 0x30, 0x00, 0x28, 0x7B, 0xFF, 0xF3, 0x28, 0xC4, 0x3C, 0x0C, 0xB8, 0xEE,
0x9C, 0x3E, 0x01, 0x4C, 0x34, 0xFA, 0xDC, 0x77, 0xD1, 0x83, 0xA1, 0x8D, 0xEB, 0x12, 0x06, 0x16,
0x03, 0x19, 0x6B, 0x5C, 0x37, 0xCD, 0x6A, 0x89, 0x81, 0xD0, 0xD8, 0x77, 0xFF, 0xFF, 0xFF, 0xE8,
0xEF, 0x9E, 0x0D, 0x55, 0x00, 0x50, 0x20, 0xD7, 0x6E, 0x00, 0x54, 0x77, 0x3F, 0xB2, 0xFE, 0x73,
0x96, 0x18, 0x57, 0xE9, 0x72, 0x41, 0xCE, 0xEF, 0xEC, 0xA8, 0x7F, 0x4C, 0x0B, 0x51, 0x3C, 0x19,
0xFF, 0xF3, 0x28, 0xC4, 0x44, 0x09, 0xC8, 0xEE, 0xC5, 0xBE, 0x01, 0x46, 0x5E, 0xAA, 0x00, 0x50,
0x00, 0xDF, 0xFE, 0x00, 0xFF, 0xDD, 0x64, 0x6F, 0xA1, 0x44, 0x44, 0x40, 0x53, 0x8F, 0xA9, 0xFC,
0xB2, 0x00, 0x71, 0xC0, 0x03, 0xFF, 0xFF, 0xA7, 0xCE, 0xF5, 0x55, 0x00, 0x40, 0x00, 0xBB, 0x6D,
0xC0, 0xFF, 0x98, 0x3D, 0xFA, 0xC2, 0xD4, 0x06, 0x71, 0xC2, 0xDB, 0x5F, 0xE6, 0xEF, 0xAB, 0x74,
0xBA, 0x95, 0x4C, 0x41, 0x4D, 0x45, 0x33, 0x2E, 0xFF, 0xF3, 0x28, 0xC4, 0x57, 0x07, 0x40, 0xAA,
0xD2, 0x58, 0x02, 0x4E, 0x43, 0x39, 0x38, 0x2E, 0x34, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
0x55, 0x00, 0x40, 0x05, 0xB6, 0xED, 0xC0, 0x34, 0xBF, 0xFF, 0x30, 0xBF, 0xDD, 0x92, 0x12, 0xE0,
0xCA, 0xF7, 0xFB, 0xA0, 0x22, 0x0D, 0x4F, 0xB8, 0xF3, 0x41, 0x81, 0x3D, 0x4A, 0x4C, 0x41, 0x4D,
0x45, 0x33, 0x2E, 0x39, 0x38, 0x2E, 0x34, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0x12, 0xDB, 0xB7,
0xFF, 0xF3, 0x28, 0xC4, 0x75, 0x04, 0xA8, 0xA6, 0xE2, 0x58, 0x08, 0x0A, 0x6E, 0x03, 0xF0, 0x07,
0x23, 0x01, 0xCF, 0xE4, 0xC2, 0x3C, 0xDC, 0x1A, 0x47, 0xB2, 0x34, 0x05, 0x5F, 0x76, 0x21, 0x8F,
0xB1, 0xC3, 0x93, 0x1C, 0x51, 0xEB, 0xBA, 0x20, 0x66, 0x14, 0xB6, 0x7F, 0xFF, 0xFE, 0x7E, 0xB5,
0xF7, 0xC4, 0x07, 0x16, 0x07, 0x03, 0x47, 0x1B, 0xFF, 0x56, 0x06, 0x91, 0x82, 0x02, 0x36, 0xD2,
0x7C, 0x86, 0x77, 0x81, 0x06, 0x87, 0x25, 0xBA, 0xFF, 0xF3, 0x28, 0xC4, 0x9D, 0x02, 0x48, 0x02,
0xE8, 0x78, 0x00, 0x44, 0x4E, 0xFB, 0xB6, 0x4A, 0xF6, 0x68, 0x54, 0x24, 0x19, 0x14, 0x13, 0xA4,
0x98, 0x39, 0xB8, 0xEF, 0xB3, 0xB7, 0x46, 0x1B, 0x50, 0x58, 0xA0, 0x98, 0x4A, 0xC2, 0x31, 0x09,
0x29, 0x92, 0xE4, 0xA2, 0x73, 0xA6, 0x55, 0x11, 0xBE, 0x74, 0x6A, 0x6B, 0xA7, 0xB2, 0x4E, 0x9D,
0xFF, 0x59, 0x5F, 0xED, 0x89, 0x32, 0x60, 0x73, 0xE1, 0x87, 0xA4, 0x20, 0xB3, 0xF8, 0x73, 0x93,
0xFF, 0xF3, 0x28, 0xC4, 0xCE, 0x05, 0x90, 0xAA, 0xC2, 0x58, 0x08, 0x0A, 0x6E, 0x19, 0x79, 0x0A,
0x06, 0xAF, 0x0B, 0x00, 0x1C, 0x85, 0x18, 0xFD, 0xAC, 0xAC, 0xE2, 0x43, 0x31, 0x85, 0x5E, 0x1F,
0x7F, 0xBE, 0x59, 0x70, 0xE1, 0xD8, 0x7B, 0x52, 0x8D, 0x30, 0xC2, 0x84, 0xA1, 0x21, 0x77, 0x7F,
0xFF, 0xF8, 0xD7, 0xA8, 0x1A, 0x0A, 0x95, 0x92, 0x2A, 0x2B, 0x4A, 0x4B, 0x55, 0x4C, 0x41, 0x4D,
0x45, 0x33, 0x2E, 0x39, 0x38, 0x2E, 0x34, 0x55, 0xFF, 0xF3, 0x28, 0xC4, 0xE0, 0x06, 0xD9, 0x1E,
0xBE, 0x58, 0x00, 0x44, 0x5E, 0x09, 0xB9, 0x46, 0xE3, 0xF0, 0x07, 0x99, 0x97, 0x4C, 0xCB, 0xE5,
0x96, 0x47, 0x23, 0x26, 0x50, 0xC0, 0xC1, 0x82, 0x6C, 0xFA, 0x9B, 0x8A, 0x8A, 0x8B, 0x1A, 0x02,
0x85, 0x45, 0x0F, 0xEB, 0x6F, 0xFF, 0xFD, 0x58, 0xA8, 0xA5, 0x4D, 0x16, 0x15, 0x4C, 0x41, 0x4D,
0x45, 0x33, 0x2E, 0x39, 0x38, 0x2E, 0x34, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
0xFF, 0xF3, 0x28, 0xC4, 0xEF, 0x0A, 0xC1, 0x4A, 0xC4, 0x7E, 0x00, 0x4C, 0xD2, 0x55, 0x55, 0x55,
0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0xFF, 0xF3, 0x28, 0xC4, 0xFF, 0x14, 0x21, 0x56,
0x58, 0x00, 0x33, 0x12, 0xE4, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
0xFF, 0xF3, 0x28, 0xC4, 0xE9, 0x0B, 0x09, 0x32, 0x80, 0x56, 0x00, 0x46, 0xC0, 0x55, 0x55, 0x55,
0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0xFF, 0xF3, 0x28, 0xC4, 0xEC, 0x0A, 0x00, 0xDE,
0x44, 0x7E, 0x00, 0x46, 0xC8, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
};
unsigned char xxx,iii,jjj;
unsigned char KB_X;
unsigned char numnum;
unsigned char numnum_CRC;
unsigned int yyy;
unsigned char UART_DATA;
uint8_t mycode[] = {0x12,0x13,0x14};
void Key_Init()
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);//使能GPIOB时钟
//GPIOB1初始化设置
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;//普通输出模式
// GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;//100MHz
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉
GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化
}
int main(void)
{
int i,j;
delay_init(168);
/*初始化USART 配置模式为 115200 8-N-1,中断接收*/
Debug_USART_Config();
Key_Init();
/* 发送一个字符串 */
// Usart_SendString( DEBUG_USART,"这是一个串口中断接收回显实验\n");
// printf("这是一个串口中断接收回显实验\n");
while(1)
{
if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_1)==0)
{
delay_us(10000);
if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_1)==0)
{
/******************************************************
- MCU端发起下载的指令 --
******************************************************/
Usart_SendByte(USART1, 0x7E);
Usart_SendByte(USART1, 0xA0);
Usart_SendByte(USART1, 0x00);
Usart_SendByte(USART1, 0x03);
Usart_SendByte(USART1, 0x01); //第一个文件
Usart_SendByte(USART1, 0x00);
Usart_SendByte(USART1, 0x0A); //总包数---是10包
Usart_SendByte(USART1, 0xEF);
delay_us(10000); //这里延时大概在100ms
delay_us(60000);
delay_us(60000);
for(xxx = 1; xxx <= 10; xxx++)
{
Usart_SendByte(USART1, 0x7E);
Usart_SendByte(USART1, 0xA1);
Usart_SendByte(USART1, 0x00);
Usart_SendByte(USART1, xxx); //下载的包的序号
for(yyy=0; yyy<256; yyy++)
{
Usart_SendByte(USART1,musicdata[(xxx-1)*256 + yyy]); //当前包的实际数据
delay_us(1000);
}
Usart_SendByte(USART1, 0xEF); //结束
delay_us(1000);
}
Usart_SendByte(USART1, 0x7E);
Usart_SendByte(USART1, 0xA3);
Usart_SendByte(USART1, 0x00);
Usart_SendByte(USART1, 0x02);
Usart_SendByte(USART1, 0x00);
Usart_SendByte(USART1, 0x01);
Usart_SendByte(USART1, 0xEF); //MCU告诉KT803c 。当前的文件已经发送完毕
delay_us(10000);
Usart_SendByte(USART1, 0x7E);
Usart_SendByte(USART1, 0xA3);
Usart_SendByte(USART1, 0x00);
Usart_SendByte(USART1, 0x02);
Usart_SendByte(USART1, 0x00);
Usart_SendByte(USART1, 0x00);
Usart_SendByte(USART1, 0xEF);//MCU告诉KT803c 。下载过程完毕,退出下载模式
delay_us(10000);
Usart_SendByte(USART1, 0x7E);
Usart_SendByte(USART1, 0xA6);
Usart_SendByte(USART1, 0x00);
Usart_SendByte(USART1, 0x02);
Usart_SendByte(USART1, 0x00);
Usart_SendByte(USART1, 0x01);
Usart_SendByte(USART1, 0xEF);//MCU告诉KT803c 。播放分区2里面的第1段音乐
}
}
}
}
/*********************************************END OF FILE**********************/