/**
  ******************************************************************************
  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
  * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
  * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
  * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  *
  * Copyright (C) 2021 Shanghai Eastsoft Microelectronics Co., Ltd. ALL rights reserved.
  *******************************************************************************
  */

<--------------------------------------------------------------------------------
Version history:
--------------------------------------------------------------------------------->

2023-03-10	V1.00	AE TEAM

<--------------------------------------------------------------------------------
Demo introduction:
--------------------------------------------------------------------------------->
本示例功能：PWM/DAC播放音频
音频文件为16KHz，16bit，PWM输出有效精度10bit,DAC输出有效精度12bit

<--------------------------------------------------------------------------------
测试环境:
--------------------------------------------------------------------------------->
测试用板：
ES-PDS-ES32F3696LX-V1.0
微雪音频测试板
ES-PDS-FLASH (可选)

辅助工具：
多功能接口转换工具ES-DAPLink(ES-Bridge)

辅助软件：
ES-DAPLink(ES-Bridge)上位机软件
ECOM串口助手

其他：
若干电阻、电容、面包板
<--------------------------------------------------------------------------------
测试步骤：
--------------------------------------------------------------------------------->
1) 编译工程，编译通过后将程序下载到目标芯片；
2) 连接好硬件电路：连接好音频板电源、地，PWM输出连接到RC滤波电路，然后连接到音频板AUDIO针脚；DAC输出直接连到音频板AUDIO针脚
3) 可将上述输出连接到ES-Bridge的ADC功能查看波形是否正常
5) 复位芯片，或在线调试，运行程序；
6) 能看到音频波形/听到声音则测试成功

<--------------------------------------------------------------------------------
注意：
--------------------------------------------------------------------------------->
1) 程序请放置于如下路径：ES32_SDK\Projects\Book2_Example\Audio\pwm_dac_adc
2) SPI Flash用于存储音频文件，若无SPIFlash，则可以使用内置存储，需相应的改变代码：
main.h文件中USE_SPI_FLASH改为0, USE_INTERNAL_FLASH改为1(若不需要内部FLASH的音频，可将该宏定义设为0)
    如果需要生成音频，可使用gen_c_code.py文件，使用生成的代码替换audio_data.c文件的内容即可
3) 硬件部分RC低通滤波采用二阶滤波器，将两个RC低通滤波相连实现，测试参数如下：
    a.3000ohm 10nF 和 300ohm 100nF   b. 2000ohm 10nF 866ohm 10nF
    选择其一即可，也可以尝试其他滤波参数下的效果
4) 由于硬件滤波的参数的问题，输出的音频中如果包含高频分量，则PWM输出表现会较差，待硬件优化
5) 测试使用的音频为thchs30语音数据集的一部分
6) 若需要SPIFlash操作：按住PF7按键，复位即可进入FLASH操作模式，命令列表如下：
    info : 查看flash中存储的文件信息
    init : 初始化spi_flash的信息区
    id   : 返回spi flash的id
    read addr1 addr2  : 读取addr1-addr2的数据，可使用10进制数或0x开头的16进制数
    erase addr1 addr2 : 擦除addr1-addr2地址对应的页
    down filename filesize : 通过xmodem协议下载文件到spi_flash
    cat filename : 输出指定的filename或index的文件内容
    test : 对spi flash的读写速度进行测试
    quit : 退出flash shell 进入主程序
    exit : 同quit
    getfile filename : 通过xmodem协议获取文件(ECOM的接收文件存在时序问题，大概率失败，可使用脚本xmodem_get.py)
7) audio_main.c中的宏定义说明:
    SAMPLE_RATE 初始化时的音频采用率
    PWM_DAC_BITS PWM模拟DAC的目标位数
8) 音频播放模式下的命令说明：
    play file : 播放flash中名字为file的文件
    list : 列出flash中有效的文件
    output_test : 启用/关闭输出测试模式，此模式下PWM/DAC都将输出固定值，用于测试PWM/DAC的波动与准确性
    sample_rate : 重新设置音频采样率
    save_adc file : 开始保存ADC采集到的音频到file文件中，使用save_adc end调用则停止采集并写入文件头信息
    adc_loopback : 开启/关闭ADC采样值直接回送到PWM和DAC输出的功能
9) 取消全局宏定义ES_PDS_V2，可使用ES32F3696_LT版本的开发板
10) 支持ADPCM压缩的音频播放: 对于Bitspersample==4的wav文件，将自动使用ADPCM解码。
	若使用内部flash，则需要在播放前，调用set_adpcm(1)，开启ADPCM解码
	使用Utility下的adpcm.exe(源码为adpcm.cpp)可将普通的16bit wav文件编码为4bit ADPCM格式,使用方式如下。
	编码 adpcm -e input.wav output.wav
	解码 adpcm -d input.wav output.wav
<--------------------------------------------------------------------------------
System clock:
--------------------------------------------------------------------------------->
External HOSC[12MHz] divided by 3, then PLL to 72MHz.

<--------------------------------------------------------------------------------
Pin connection: 
--------------------------------------------------------------------------------->
UART2_TX ---- PE2
UART2_RX ---- PE3
PWM      ---- PB6
DAC      ---- PA4
ADC      ---- PC0
SPI_SCK  ---- PD3
SPI_MISO ---- PB4
SPI_MOSI ---- PB5
SPI_CS   ---- PB6