AD系列入门到进阶开发指导文档
📎 原始文档:https://www.kdocs.cn/l/clebdTGKDdHQ AD系列入门到进阶开发指导文档
📌杰理工具说明文档:
(程序开发工具、固件处理工具、量产相关工具)
欢迎使用杰理工具文档 — JL Project Documentation
杰理工具及开发板淘宝店首页-杰理科技-淘宝网
本文主要想解决资料文档太多但是放的地方都不在一起,遇到实际问题不知道去哪里找的问题。主要会以xx功能的答案在xx位置(链接)的形式来介绍。
下面有两条本文作者总结的小小的经验:
关于二次开发的小建议:只要是我们SDK有demo或者类似的功能的,强烈建议按照SDK原有的流程来做,这样可以让各位开发的程序出bug的概率更小。
关于问题排查的小建议:出现任何bug大概率都可以通过逐步缩减自己增加的内容向公版SDK流程靠近来定位问题。
遇到问题请先在文档查找是否有答案,如果文档无法解决问题可以在AD开源群提问
- 现有资料汇总
| 开源仓库 | https://gitee.com/Jieli-Tech/fw-AD15N(包括软件SDK和硬件原理图规格书) AD系列开源sdk仓库注意阅读仓库页面的README文档 |
|---|---|
| issue问答 | https://gitee.com/Jieli-Tech/fw-AD15N/issues 从SDK发布到现在的常见问题的解答 |
| 项目组在线文档 | https://doc.zh-jieli.com/AD14/zh-cn/master/index.html 和SDK手册类似,有SDK主要功能的接口说明 |
| 入门文档 | https://gitee.com/jieli-tech_fae/fw-jl/tree/master/doc 由FAE同事总结的一些客户常用功能的说明 |
| SDK手册 | SDK包的 fw-AD15N\doc 文件夹下的AD1X-45678 SDK手册 介绍整个AD系列SDK的文档 |
| 项目组视频教程 | https://space.bilibili.com/3493277347088769 针对具体细节功能模块的详细介绍和使用说明 |
- 开发环境搭建
- 环境安装和下载程序视频教程 https://www.bilibili.com/video/BV1ux4y1d77g/?spm_id_from=333.1387.homepage.video_card.click&vd_source=e7c16741e9afc095fae6f76031877a32
- 关于KEY 签约客户一般有一个自己的KEY文件,需要搭配杰理专用量产烧录工具使用。芯片和程序的KEY必须匹配才能正常工作。key文件放到download.bat的同目录下,工具会在当前目录里面找xxx.key这个文件,如果找不到会报找不到key文件的错误。
- 芯片烧录了KEY程序没有加KEY,调试下载的时候会报错无法下载。
- 芯片没有烧录KEY程序加了KEY,调试下载会报错无法下载。
- 芯片烧录了编号A的KEY程序加的编号B的KEY,调试下载会报错提示KEY不匹配。
- A0芯片没有内部flash的量产烧录的时候直接给烧录器导入KEY文件烧录即可,外挂的flassh用加KEY的程序编译产生的jl_isd.bin去烧录。KEY匹配就可以正常工作实现保护软件开发权益的目的。
- 注意不同系列芯片可能不一样,AC104N用蓝牙芯片的key,其他AD14N/AD15N/AD24N等芯片都是单独的lkey。 获取途径一般是找谁买芯片就找谁要KEY文件。


- 下载报错怎么办 这个文档描述了常见的下载报错和排查解决办法。用USB下载的芯片都需要连上电脑才能下载,可以在设备管理器磁盘里面看有没有对应的芯片的盘符。
2.3.1 强制升级工具没有连接上开发板,怎么办?
https://gitee.com/jieli-tech_fae/fw-jl/blob/master/doc/1%E5%8D%87%E7%BA%A7/%E5%8D%87%E7%BA%A7.md
2.3.2 强制升级工具连上开发板,但是报其他错误
https://gitee.com/jieli-tech_fae/fw-jl/blob/master/doc/2Flash/SPI-Flash.md
4. 关于AD系列的芯片的基本信息 4.1 玩具系列常用芯片有AD14N AD15N AD16N AD17N AD18N AD23N AD24N
4.2 芯片的后缀一般表示内部flash大小:
AD142A4表示内置512Kbyte flash 芯片丝印一般标42A4
AD156A0 表示内部没有flash 芯片丝印一般标56A0
4.3 跑代码的flash大小即芯片ROM的大小
4.4 关于芯片RAM可以看芯片规格书,但是我们SDK一般做好了每个品类需要用到的大部分功能,所以实际留给客户使用的RAM会比芯片规格上写的少很多
4.5 关于速度,AD14 15系列一般都可以超频到192M注意和电脑CPU类似超频就需要提高内核电压。具体操作可以看文档说明 https://gitee.com/Jieli-Tech/fw-AD15N/issues/I4D8JU
5. flash的说明 芯片flash的说明这个视频由详细描述
https://www.bilibili.com/video/BV13NexeKEpV/?spm_id_from=333.1387.search.video_card.click&vd_source=e7c16741e9afc095fae6f76031877a32
关于flash的常见问题
https://gitee.com/jieli-tech_fae/fw-jl/blob/master/doc/2Flash/SPI-Flash.md
3. 工具介绍 AD系列需要用到的一些常用功能使用说明。工具的最新版本可以在开源仓库链接进去下载。
如果客户需要替换SDK里面的的音频文件需要以下步骤。所以需要用到一些专用工具。
用音频转换工具把你的音源文件转换成SDK可以播放的文件。
把转换好的文件分类用打包工具打包成一个文件。
在download.bat里面删掉原来的改成你刚才打包好的文件下载到芯片flash里面。
在toy_music里面把默认的文件名改成你打包好的文件名。

音频转换工具 AD系列TOYsdk只能播放转换过的文件,所以音频都需要经过转换工具转换成sdk可以播放的格式。
根据需求可以选择不同的输出格式,一般默认用F1A。注意平衡输出文件的码率和flash存储空间的大小,同一个文件码率越高需要越大的存储空间。设置好了以后选择输入输出路径点转换即可。
关于无缝循环播放的设置这几个参数只能根据自己的文件调整,实在不行就换一种格式继续测试根据经验多试试一般都能做到想要的效果。打包工具 toy SDK里面的文件夹播放其实是把转换以后的文件用打包工具打包以后的文件,没有fat文件夹的概念。

功能模块介绍
4.1下载成功以后怎样调试程序
4.1.1 SDK的整体框架介绍
4.1.2 设置打印IO口
app_config.h文件里面可以用IO功能映射的方式设置任意gpio作为打印口
注意强烈建议用户不要随意降低打印的波特率,波特率太低会对系统稳定性造成未知的影响!!
具体怎样设置可以看uart_init函数,如果是按照上面设置了映射IO就会设置对应的remap寄存器。否则用UART0默认的TX io作为打印。
4.1.3 总的打印开关
const char libs_debug AT(.LOG_TAG_CONST) = TRUE; //打印总开关
4.1.4 常用C语言打印函数
log_info 用来打印字符串或者打印参数
put_buf 用来打印数组
putchar用来打印字符,这个打印速度最快对代码运行时序影响最小而且SDK一般把这个函数放到了RAM区可以在快速中断里面调用
4.1.5 关于float 浮点数打印异常的处理办法
https://doc.zh-jieli.com/Tools/zh-cn/dev_tools/toolchains/faqs/faq_printf_float_point.html
4.2 操作一个GPIO
4.2.1 GPIO寄存器说明
在线文档 https://doc.zh-jieli.com/AD14/zh-cn/master/gpio/gpio.html
4.2.2 GPIO的几种状态怎样设置
输出高电平:
JL_PORTA->DIR &= ~BIT(1); //PA1口设为输出 JL_PORTA->DIE |= BIT(1); //PA1口使能数字输入·
JL_PORTA->OUT |= BIT(1); //PA1口输出高电平
JL_PORTA->HD0 |= BIT(1); //开强驱 hd0 hd1组成2bit 4个挡位
JL_PORTA->HD1 |= BIT(1); //开强驱 hd0 hd1组成2bit 4个挡位
输入开上拉:
JL_PORTA->DIR |= BIT(1); //PA1口设为输入 JL_PORTA->DIE |= BIT(1); //PA1口使能数字输入 JL_PORTA->PU |= BIT(1); //PA1口打开上拉 JL_PORTA->PD &= ~BIT(1); //PA1口关闭下拉
设置高阻:
JL_PORTA->DIR |= BIT(1); //PA1口设为输入
JL_PORTA->DIE &= ~BIT(1); //PA1口使能数字输入
JL_PORTA->PU &= ~BIT(1); //PA1口关闭上拉
JL_PORTA->PD &= ~BIT(1); //PA1口关闭下拉
4.2.3 GPIO不受控制怎么办
1. 规格书上给出的GPIO都可以正常控制,如果不行一定是程序哪里有问题。
2. 在main函数最前面拉高或者拉低然后写一个while(1)卡住,这个时候io一定是可以正常控制的,如果不行控制IO的函数写的不对
3. 然后往下一行一行卡,找到是设置了什么东西以后IO就不正常了。
4.2.4 打印IO状态
log_info("DIR:%x DIE:%x OUT:%x PU:%x PD:%x \n",JL_PORTA->DIR,JL_PORTA->DIE,JL_PORTA->OUT,JL_PORTA->PU,JL_PORTA->PD);
4.3快速开始播放一段声音
4.3.1 SDK做好的播放流程
1. toy工程app()函数里面设置work_mode = TOY_MUSIC;
2. 默认播放dir_inr_tab里面的第一个文件夹
3. download_bat.c 的-res后面需要加上播放的这个目录保证文件下载到了flash里面
4. 初始化的dac_mode_init函数可以设置音量大小
4.3.2 播放流程步骤
1. 打开设备
2. 挂载设备
3. 获取设备句柄和文件句柄
4. 调用启动解码函数decoder_io
5. 视频教程 [https://www.bilibili.com/video/BV1Dh4y1G791/?spm_id_from=333.1387.upload.video_card.click&vd_source=e7c16741e9afc095fae6f76031877a32](https://www.bilibili.com/video/BV1Dh4y1G791/?spm_id_from=333.1387.upload.video_card.click&vd_source=e7c16741e9afc095fae6f76031877a32)
4.3.3 设备打开和挂载
1. 视频教程 [https://www.bilibili.com/video/BV17g4y1P7yJ/?spm_id_from=333.1387.upload.video_card.click&vd_source=](https://www.bilibili.com/video/BV17g4y1P7yJ/?spm_id_from=333.1387.upload.video_card.click&vd_source=e7c16741e9afc095fae6f76031877a32)[e7c16741e9afc095fae6f76031877a32](https://www.bilibili.com/video/BV17g4y1P7yJ/?spm_id_from=333.1387.upload.video_card.click&vd_source=e7c16741e9afc095fae6f76031877a32)
2. 4.3.4 decode_io接口
4.3.5 音频数据流
4.3.6 播放PCM数组
视频教程 https://www.bilibili.com/video/BV1CmrEBtEpc/
4.3.7 音频解码数据异常分析
音频样点分析方法-如何打印到电脑转化为文件分析
1、关闭全部打印
2、开启部分打印
3、mp_output打印样点(或者在sound_output或 dac打印)
4、样点拷贝为raw文件
5、音频分析软件打开分析
https://www.bilibili.com/video/BV1S9msBuEdD
4.4增加一个自己的C文件
1. 在当前工程目录里面找一个文件夹里面建一个c文件 比如app/src/app_mg/common/文件夹下
2. 把刚才新建的C文件加到工程里面
3. 保存工程 
4.5 文件太多放到外挂flash播放
1. 关于芯片flash的概念视频教程 [https://www.bilibili.com/video/BV13NexeKEpV/?spm_id_from=333.1387.search.video_card.click&vd_source=e7c16741e9afc095fae6f76031877a32](https://www.bilibili.com/video/BV13NexeKEpV/?spm_id_from=333.1387.search.video_card.click&vd_source=e7c16741e9afc095fae6f76031877a32)
4.5.1 外挂flash怎么接
1. device list.c文件里面先找到对应芯片的flash有哪几组接口,可能有些芯片只拉出来了部分IO找一组合适的IO。

4.5.2 怎样下载文件到外挂flash
注意这个只适用于AD14 15。下面注释部分描述不同flash的硬件连接方式对应的命令。需要严格对照原理图选择对应的命令。
4.5.3 怎样播放外挂flash的文件
1. 打开外挂flash的宏TFG_EXT_FLASH_EN
2. device_list.c里面设置对应的IO
3. 批处理里面需要下载用来播放的文件
4. 修改需要播放的设备,修改要播放的文件名

4.6 TOY工程也可以播放TF卡
4.6.1 tf卡怎么接
1. 找一组合适的sd卡控制器的接口

4.6.2 怎样放SDK可以播放的文件到tf卡
1. 这里主要介绍toy sdk播放没有fat的文件。fat的文件播放用mbox工程不需要做任何修改就可以播放
2. 把需要播放的文件转换以后打包
3. tf卡用读卡器连上电脑然后用写卡工具软件 usb_disk_read_write.exe 把打包好的文件写入tf卡
4. 4.6.3 怎样播放外挂tf卡的文件
5. 参考demo程序可以对比修改到最新的SDK上
4.7 录音和变声
4.7.1 录音模式的流程
1. app()函数里面设置 work_mode = TOY_RECORD;
2. 默认流程进入录音模式以后需要按下录音按键才会开始录音 MSG_RECODE_START
3. 开始录音以后再按下MSG_RECODE_START消息对应的按键就会停止录音且自动播放刚才的录音
4. 控制录音需不需要变调播放按键消息MSG_REC_SPEED_EN
4.7.2 关于MIC的设置
1. mic通常有两种常用的接法分别是省电容和不省电容隔直的方案,生电容底噪较大效果较差如果不是极致降本方案一般不建议采用。
mic电源的选择,一般使用默认的芯片PA13 bias供电方式内部有上拉电阻可以配置一般不建议修改。
2. mic增益设置有两个参数可以调 
4.7.3 录音文件存放
1. mbox工程录音文件
存放在sd卡根目录下的JL_REC文件夹,如果没有系统会自动创建。
2. toy工程录音文件
toy工程录音放在系统自动分配的norfs区域,没有文件的删减操作只能简单的自动覆盖录满自动停止。
4.7.4 编码格式和采样率码率设置
1. 格式和采样率

2. 比特率br由采样率和压缩比共同决定,采样率越高文件越大压缩比越高文件越小。

4.8 混响喊话模式
4.8.1 混响模式的流程
- work_mode = TOY_SPEAKER;
- 进入喊话模式以后会获取采样率设置,打开dac和adc。
4.8.2 有哪些算法
1. HOWLING_EN 啸叫抑制算法,一般需要打开否则很容易产生啸叫
2. ECHO_EN 混响根据客户需求是否打开
3. VO_PITCH_EN 系统自带变声库集合了多种变调算法 男变女 女变男 老人小孩等。具体可以查看枚举定义 VP_CMD。

4.9 怎样进入低功耗
4.9.1 soft poweroff
在程序运行的任何地方都可以直接调用 void sys_softoff()函数进入poweroff软关机状态,软关机状态唤醒以后芯片会复位。功耗一般不会超过2uA.
4.9.2 powerdown
SDK默认有一个自动检测空闲的操作,比如播放如果暂停了就会自动调用powerdown的函数进入低功耗状态,按按键可以唤醒。
4.9.3 低功耗的唤醒
1.设置唤醒口,poweroff和powerdown都是一样的设置
2. 注意设置保护唤醒口的状态,进入低功耗之前系统默认会把不需要用到的IO全部设置成高阻状态,注意自己增加的唤醒口要参考默认有的唤醒口设置保护否则IO状态被改掉以后可能导致无法唤醒的情况
4.9.4 进入低功耗以后功耗超过理论值怎么办
- 大部分情况都是IO漏电导致的,查看是否有IO没关掉。
- 找一个只有最小系统的板子看功耗是否正常,排除外设漏电导致。
- 把怀疑有问题的IO从硬件上断开。
- 唤醒口一般会有默认的上拉或者下拉检查是否会和外设形成通路导致漏电。
- 可以根据漏电电流的大小来推测是什么地方漏电比如2.8mA的漏电可能是一个1K的电阻280uA可能是一个10K的电阻漏电
4.10 midi功能
杰理AD1x-45678_MIDI应用说明文档.pdf
JLmidi工具使用说明.pdf
4.11 已经实现了哪些按键功能
4.11.1 各种类型的按键

- void key_scan()函数获取所有按键类型的按键值,然后根据获取到的按键类型和按键对转换到每个模式对应的按键表得到对应的消息发出去。
4.11.2 AD按键详解
1. 配置AD按键IO
2. ad按键IO通道初始化,注意是否需要外部上拉电阻的设置
3. 根据电压返回对应的按键序号 get_adkey_value()
4.11.3 IO按键详解
1. 打开宏 KEY_IO_EN
2. 设置按键IO和按下电平状态
3. 获取按键函数static u8 get_iokey_value(void)
4.11.4 矩阵按键详解key
1. 矩阵按键基本原理:一组普通IO作为Y轴输出高电平,一组AD io作为X轴检测电压,循环切换拉高Y轴IO的电压在一直检测X轴IO的电压返回AD值,获取拉高Y轴哪个IO的时候X轴哪个IO的电压高于阈值即可得到是哪个按键被按下。具体驱动代码可以在key_matrix.c里面查看。
2. IO配置,用户只需要修改这两个数组里面IO即可

4.11.5 IR红外按键详解
1. 红外按键基本原理,利用timer的输入捕获功能获取脉冲信号的长度实现红外的解码,驱动里面有一个irflt 是接在timer输出信号前面的一个滤波器用来过滤杂波的,只需要按照驱动修改IO即可。
2. 具体IR初始化配置irflt timerio,计算脉冲信号宽度可以参考irflt.c
3. 用户只需要打开宏设置io即可不需要修改驱动

4.12 使用芯片定时器
关于timer中断AD系列有几个需要注意的地方。
1. 如果没有特殊设置快速的timer中断一半会不会太准会被其他中断卡住,如果要解决这个问题有两个文档客户参考。 一、解决中断被关掉的问题 https://gitee.com/Jieli-Tech/fw-AD15N/issues/I619QA
二、解决写VM的时候被卡住的问题 https://gitee.com/Jieli-Tech/fw-AD15N/issues/I56ERF
2. 如果中断的频率非常高(大于1K)即中断周期小于1毫秒,需要把所有中断响应函数和里面调用的函数嵌套的每一层全部放到RAM里面,在函数前面加上AT_RAM关键字.否则程序可能会莫名其妙死机。 
4.12.1 tick timer中断使用
1. timer_drv.c提供了timer驱动,只需要调用共初始化即可。
2. timer_init 传timer序号和定时周期
4.12.2 打开一个定时器定时10微秒中断一次
1. 如果对timer工作原理不是太了解建议找AI先学习一下timer是怎么工作的,几个寄存器都表示什么意思。
2. timer_init的设置设置周期太长或者太短可能会设置不了,这个时候用户就需要自己修改timer的时钟源分频,比如分频太小频率太高计数一次的时间就很短,就做不了长时间的中断。分频太大频率太低计数一次的时间太长做不了准确的短时的中断。所以用户需要了解原理以后知道怎样修改寄存器。
3. void timer_init(u8 timer_ch, u32 us) sdk提供的函数只需要传timer序号和时间即可
4.12.3 输出pwm信号
1. SDK提供的函数 void timer2_pwm_init(u8 ch, u32 fre, u8 duty) 可以输出timer在默认IO口的pwm信号
2. 如果需要remap到其他IO,需要对照芯片手册的IOMC寄存器设置映射
3. [https://gitee.com/Jieli-Tech/fw-AD15N/issues/I8672H](https://gitee.com/Jieli-Tech/fw-AD15N/issues/I8672H) PWM remap参考说明
4.12.4 输入捕获功能
1. SDK里面默认的红外按键IRKEY用的就是timer的这个功能,用户如果需要用到可以简单参考。
2. 大概需要实现几个步奏
1. 设置一个IO为数字输入状态
2. 设置timer作为输入捕获功能
3. 设置irflt(芯片自带的一个滤波器可以过滤毛刺)
4. 设置输入的映射通道把IO和功能连接起来
3. 如果需要改成自己的功能只需要修改timer中断里面的数据处理函数即可
4.13 串口通信功能
4.13.1 串口通信初始化
uart_dev.c提供了做好的串口收发测试函数,注意看芯片手册可能不是所有uart都支持DMA收发,一般没有DMA的那组串口做接收的时候如果波特率比较高的情况容易丢失数据需要注意。
4.13.2 DMA中断接收
以AD15为例,UART0不支持DMA所以只能选UART1,打开CONFIG_UART1_ENABLE_TX_DMA宏

4.13.3 DMA发送
打开DMA功能 调用write接口即可
4.13.4 串口单线通信
1. AD1X默认设置接收模式。
2. 收到数据需要发送的时候重新初始化,把IO设置成TX脚发送数据。
3. 发完数据以后再重新初始化设置成接收模式IO设置成RX脚。
4.14 IO中断
4.14.1 SDK提供的IO中断demo
port_wkup.c定义了IO中断的初始化函数,中断回调函数等接口,客户只需要按照自己的需求调用即可。
demo函数里面定义了5个IO中断,后面4个分别用了4个不同的硬件模块来实现的,用户自己选择自己没用到的模块来做中断,比如客户用了uart1来做通信就不要用这个模块来做IO中断。
4.14.2 唤醒中断
用唤醒口设置来做,适用于需要多个唤醒口的情况
1.设置唤醒口
2.设置中断回调函数
// IO中断回调
void get_powerdown_wakeup_source(u8 index, u32 gpio)
{
r_printf("powerdown wakup index:%d io:%d---\n", index, gpio);
}
extern void port_edge_wkup_set_callback(void (*wakeup_callbak)(u8 index,u32 gpio));
port_edge_wkup_set_callback(get_powerdown_wakeup_source);
4.15 怎样调整声音大小
- 初始化的时候可以设置默认音量大小

- 确认音源文件的幅度是不是0db。
- 看原理图是内部APA直推喇叭还是模拟输出外部功放接喇叭,如果是外部功放可以调整功放增益。
- 内部APA直推如果觉得设置了最大音量还不够大则按照说明处理。 https://gitee.com/Jieli-Tech/fw-AD15N/issues/I41GAA
https://gitee.com/Jieli-Tech/fw-AD15N/issues/I4WQ9I
4.16 ladc和dac详解
dac和数据流说明参考视频
https://www.bilibili.com/video/BV1mk4y1p7m2/?spm_id_from=333.1387.search.video_card.click&vd_source=e7c16741e9afc095fae6f76031877a32
adc的初始化和数据流以linein模式为例
https://www.bilibili.com/video/BV1RzYhepEG7/?spm_id_from=333.1387.search.video_card.click&vd_source=e7c16741e9afc095fae6f76031877a32
4.17 ADC电压采集模数转换
sdk提供了两种外部电压采集数模转换的接口
- 初始化的时候把所有需要采集AD通道加上去adc_add_sample_ch(),在10毫秒中断里面循环切换通道adc_kick_start()把采样到的值保存在数组里面,用adc_get_voltage()函数传入对应的通道序号获取到前面采样保存的电压值。 因为是10毫秒(或者自己定义其他时间间隔)采样一次而且是通道轮询的方式可能不是当前实时的电压,如果需要实时采集就需要用到下面一种方式。
通道序号不同芯片有差别这里以AD15为例

- 实时采集电压的方式adc_scan_once() 传入adc通道序号,函数里面有一个while(1)等待转换完成以后才往下走。可以快速实时检测当前通道的电压。
4.18 死机复位了怎么办
下面提供的两种方法适用于所有杰理芯片,但是不同SDK的函数接口和宏的名字可能会有区别。
4.18.1 查看复位源
https://gitee.com/Jieli-Tech/fw-AD15N/issues/I4XA3S
4.18.2 查看断沿
不同SDK可能宏或者常量的名字不一样,一般可以在SDK里面搜索“断言” “异常”这些关键字找到对应的开关,打开断沿的打印。开了断沿死机以后会卡住,关掉就会直接复位,量产程序记得要关掉。
NOTE: 代码异常复位等异常情况---开启详细打印的方式 · Issue #I4YCJ5 · 珠海杰理科技/fw-AC63_BT_SDK - Gitee.com
4.19 烧录和升级
4.19.1 量产烧录有两种方式
1.1 一拖二芯片烧录器,用户购买烧录器和每个芯片对应的烧录座以后放芯片去烧录,或者找专业的烧录厂烧录。
https://doc.zh-jieli.com/Tools/zh-cn/mass_prod_tools/burner_1tuo2/index.html
1.2 一托八板载烧录,先把空片贴到板子上然后用治具做顶针接触到板子上的对应测试点烧录带芯片的拼版。
https://doc.zh-jieli.com/Tools/zh-cn/mass_prod_tools/burner_1tuo8/index.html
4.19.2 成品升级
2.1 TF卡或者U盘升级,如果做成成品了需要升级如果有TF卡或者U盘功能的机器可以把生产的ufw文件放到卡或者U盘里面插入机器读到了就会自动升级。注意文件格式建议用fat32。
2.2 AD15串口升级,如果机器里面的程序开了串口升级HAS_UART_UPDATE_EN的宏且初始化了串口升级功能,可以用一托八接线到对应的IO升级。
如果遇到问题可以自己查看打印信息,原理就是打开一个串口接收数据,在串口中断里面调用一个库函数判断收到得数据是否符合升级得命令,如果和升级命令可以匹配就跳到升级状态。
4.20 开源社区SDK工程的区别

- AC104 mbox 适用于做插卡音箱类的产品可以播MP3 WAV等格式的文件,支持fat文件系统可以连电脑传输文件
- AD14 MCU 适用于把芯片当MCU来用,只保留了最基础功能给用户留了最多的RAM和ROM资源
- AD14 TOY 适用于做玩具产品,播放杰理自定义的压缩文件,有变声变调录音变调等功能,播放midi做琴类鼓类玩具。 不管是AD14还是AC104芯片上述3个SDK都可以下载,只是有地方需要修改一下具体可以参考连接
https://gitee.com/Jieli-Tech/fw-AD15N/issues/I4HZ4X - 其他15 17 18都类似只有MCU和toy玩具SDK
4.21 怎样查看编译完后剩下多少flash空间和RAM空间
4.21.1 flash空间分成了几个部分
1. app.bin 代码生成的二进制文件
2. uboot.boot 启动代码SDK固定的用户一般不会修改
3. -res后面下载的音频资源
4. eeprom 对应代码里面的VM区域,AD系列才是这样其他芯片VM就是VM!
5. vm区对应代码里面录音区域 ,AD系列才是这样其他芯片VM就是VM!
所以想要关心代码编译出来的文件大小就只需要查看app.bin的大小,jl_isd.bin是包含了上述123点打包的文件大小。
4.21.2 关于剩余RAM大小只需要看编译以后的heap_buf大小
FAQ:ld链接脚本(Linker Script)图解 · Issue #IHQP35 · 珠海杰理科技/fw-AD15N - Gitee.com
heap_buf的大小就是剩余RAM的大小,会全部用作堆的空间,有时候程序运行过程中报malloc err就是剩余的空间太小了导致的。
4.22 淡入淡出功能解决歌曲切换时候的杂音
新版本SDK默认已经有了淡入淡出功能,用户不需要自行增加只需要打开宏即可
DAC_FADE_ENABLE
淡入淡出实际上就是开始播放一个音乐的时候让数字音量慢慢从0加到设置的音量,结束播放的时候从当前音量慢慢降到0,让dac不要有突然的巨大变化。
核心函数 void dac_fade(void),确认当前有没有开可以再这个函数里面加少量打印。注意关注t_fade_step 参数,这个参数用来控制变化的速度,如果用户的文件本来就很短默认的淡入淡出可能会导致声音大部分都没出来,可以适当加大这个数字让淡入淡出更快,具体用户可以自行调整。
注意以前的SDK淡出有点BUG没有效果,淡出的函数放到了结束播放的后面,要按照图片改一下把淡出的函数放到前面来
4.23 关于双备份升级功能
文档有详细说明
https://gitee.com/Jieli-Tech/fw-AD15N/issues/I7MIDZ
5.问题和补丁
5.1 函数返回报错查询
常见函数的报错序号errno-base.h
https://www.bilibili.com/video/BV1e5dPYLE56/?spm_id_from=333.1387.homepage.video_card.click&vd_source=e7c16741e9afc095fae6f76031877a32