第83音乐播放器实验讲解_第1页
第83音乐播放器实验讲解_第2页
第83音乐播放器实验讲解_第3页
第83音乐播放器实验讲解_第4页
第83音乐播放器实验讲解_第5页
已阅读5页,还剩47页未读 继续免费阅读

付费下载

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

淘宝店铺:技术论坛《手把手教你学STM32》主讲人:正点原子团队硬件平台:正点原子STM32开发板:广州市星翼电子科技有限公司淘宝店铺:技术论坛:开源电子网公众平台:“正点原子”官方网站:联系电话:ALIENTEK《手把手教你学STM32》音乐播放器实验(WM8978)淘宝店铺:技术论坛STM32F1xx开发板(正点原子)STM32F4xx开发板(正点原子)适用平台本视频重点参考资料淘宝店铺:技术论坛参考资料:1,探索者STM32F407开发板《STM32F4开发指南-库函数版本》——音乐播放器实验2,I2S参考资料《STM32F4xx中文参考手册》-第27章串行外设接口(SPI)3,WAV文件格式参考资料见光盘:软件资料WAV文件格式说明WAV文件格式分析与应用.pdf4,WM8978参考资料见光盘:硬件资料芯片资料①WM8978G.pdf②WM8978中文资料.doc目录淘宝店铺:技术论坛WAV&WM8978简介1I2S简介&硬件连接2

源码讲解&例程测试31、WAV&WM8978简介-什么是WAV?淘宝店铺:技术论坛WAV即WAVE文件,是最常用的数字化声音文件格式之一,其扩展名为“.wav”。符合RIFF(ResourceInterchangeFileFormat)文件规范,用于保存Windows平台的音频信息资源,被Windows平台及其应用程序所广泛支持。WAV格式还支持MSADPCM,CCITTALAW等多种压缩运算法,支持多种音频数字,取样频率和声道。标准格式化的WAV文件和CD格式一样,也是44.1K的取样频率,16位量化数字,因此在声音文件质量和CD相差无几!

1、WAV&WM8978简介-WAV组成淘宝店铺:技术论坛WAV是由若干个Chunk组成的。按照在文件中的出现位置包括:①RIFFWAVEChunk、②FormatChunk、③FactChunk(可选)和④DataChunk。每个Chunk由块标识符、数据大小和数据三部分组成,如下图所示:其中块标识符由4个ASCII码构成,数据大小则标出紧跟其后的数据的长度(单位为字节),注意这个长度不包含块标识符和数据大小的长度,即不包含最前面的8个字节。所以实际Chunk的大小为数据大小加8。1、WAV&WM8978简介-WAV组成淘宝店铺:技术论坛①RIFF块(RIFFWAVEChunk),该块以“RIFF”作为标示,紧跟wav文件大小(该大小是wav文件的总大小-8),然后数据段为“WAVE”,表示是wav文件。RIFF块的Chunk结构如下://RIFF块typedef__packedstruct{u32ChunkID; //chunkid;这里固定为"RIFF",即0X46464952u32ChunkSize; //集合大小;文件总大小-8u32Format; //格式;WAVE,即0X45564157}ChunkRIFF;1、WAV&WM8978简介-WAV组成淘宝店铺:技术论坛②Format块(FormatChunk),该块以“fmt”作为标示(注意有个空格!),一般情况下,该段的大小为16个字节,但是有些软件生成的wav格式,该部分可能有18个字节,含有2个字节的附加信息。Format块的Chunk结构如下:

//fmt块typedef__packedstruct{u32ChunkID; //chunkid;这里固定为"fmt",即0X20746D66u32ChunkSize; //子集合大小(不包括ID和Size);u16AudioFormat; //音频格式;一般为0X0001,表示线性PCM;u16NumOfChannels; //通道数量;1,表示单声道;2,表示双声道;u32SampleRate; //采样率;0X1F40,表示8Khzu32ByteRate; //字节速率=采样率*通道数*(ADC位数/8)u16BlockAlign; //块对齐(字节)=通道数*(ADC位数/8)u16BitsPerSample; //单个采样的位数;16位PCM,设置为16

u16ByteExtraData; //附加的数据字节;2个;线性PCM,没有这个参数}ChunkFMT; 1、WAV&WM8978简介-WAV组成淘宝店铺:技术论坛③Fact块(FactChunk),该块为可选块,以“fact”作为标示,不是每个WAV文件都有,在非PCM格式的文件中,一般会在Format结构后面加入一个Fact块,该块Chunk结构如下://fact块typedef__packedstruct{u32ChunkID; //chunkid;这里固定为"fact",即0X74636166;u32ChunkSize; //子集合大小(不包括ID和Size);这里为:4.u32DataFactSize; //数据转换为PCM格式后的大小}ChunkFACT;DataFactSize是这个Chunk中最重要的数据,如果这是某种压缩格式的声音文件,那么从这里就可以知道他解压缩后的大小。对于解压时的计算会有很大的好处!不过我们例程使用的是PCM格式,所以不存在这个块。1、WAV&WM8978简介-WAV组成淘宝店铺:技术论坛④数据块(DataChunk),该块是真正保存wav数据的地方,以“data”'作为该Chunk的标示,然后是数据的大小。数据块的Chunk结构如下://data块typedef__packedstruct{u32ChunkID; //chunkid;这里固定为"data",即0X61746164u32ChunkSize; //子集合大小(不包括ID和Size);}ChunkDATA;ChunkSize的大小就是音频数据的大小(仅指音频数据大小,不包括ChunkID之类的数据),在ChunkSize之后,紧跟音频数据。

1、WAV&WM8978简介-WAV数据说明淘宝店铺:技术论坛根据FormatChunk中的声道数以及采样bit数,wav数据的bit位置可以分成如下表所示的几种形式:单声道取样1取样2取样3取样4取样5取样68位量化声道0声道0声道0声道0声道0声道0双声道取样1取样2取样38位量化声道0(左)声道1(右)声道0(左)声道1(右)声道0(左)声道1(右)单声道取样1取样2取样316位量化声道0

(低字节)声道0

(高字节)声道0

(低字节)声道0

(高字节)声道0

(低字节)声道0

(高字节)双声道取样1取样216位量化声道0声道0声道1声道1声道0声道0(低字节)(高字节)(低字节)(高字节)(低字节)(高字节)单声道取样1取样224位量化声道0

(低字节)声道0

(中字节)声道0

(高字节)声道0

(低字节)声道0

(中字节)声道0

(高字节)双声道取样124位量化声道0声道0声道0声道1声道1声道1(低字节)(中字节)(高字节)(低字节)(中字节)(高字节)本例程支持:16位和24位,立体声,每个取样为4或6个字节,低字节在前,高字节在后。在得到这些wav数据以后,通过I2S送给WM8978,即可欣赏音乐了。1、WAV&WM8978简介-WM8978简介淘宝店铺:技术论坛WM8978是欧胜(Wolfson)推出的一款全功能音频处理器。它带有HI-FI级数字信号处理内核,支持增强3D硬件环绕音效,和5频段的硬件均衡器,可以有效改善音质。

同时集成了对麦克风的支持,和一个输出功率达0.9W的高质量功放。WM8978进一步提升了耳机放大器输出功率,在推动16欧姆耳机的时候,每声道最大输出功率高达40毫瓦!可以连接市面上绝大多数适合随身听的高端HI-FI耳机。1、WAV&WM8978简介-WM8978特点淘宝店铺:技术论坛●I2S接口,支持最高192K,24bit音频播放●DAC信噪比98dB;ADC信噪比90dB●支持无电容耳机驱动(提供40mW@16Ω的输出能力)●支持扬声器输出(提供0.9W@8Ω的驱动能力)●支持立体声差分输入/麦克风输入●支持左右声道音量独立调节●支持3D效果,支持5路EQ调节1、WAV&WM8978简介-WM8978接口淘宝店铺:技术论坛WM8978通过I2S接口(即数字音频接口)同MCU进行音频数据传输(支持音频接收和发送),通过两线(MODE=0,即IIC接口)或三线(MODE=1)接口进行配置。WM8978的I2S接口,由4个引脚组成:1,ADCDAT:ADC数据输出2,DACDAT:DAC数据输入3,LRC:数据左/右对齐时钟4,BCLK:位时钟,用于同步WM8978的I2S接口支持多种不同的音频数据模式:左(MSB)对齐标准、右(LSB)对齐标准、飞利浦(I2S)标准等,本例程,我们采用飞利浦标准。1、WAV&WM8978简介-WM8978接口淘宝店铺:技术论坛飞利浦(I2S)标准模式,数据在跟随LRC传输的BCLK的第二个上升沿时传输MSB,其他位一直到LSB按顺序传输。传输依赖于字长、BCLK频率和采样率,在每个采样的LSB和下一个采样的MSB之间都应该有未用的BCLK周期。飞利浦标准I2S数据传输协议如下图所示:

图中,fs即音频信号的采样率,比如44.1Khz,因此:LRC的频率就是音频信号的采样率。另外,WM8978还需要一个MCLK,本例程由STM32F4为其提供MCLK时钟,MCLK的频率必须等于256fs,也就是音频采样率的256倍。1、WAV&WM8978简介-WM8978框图淘宝店铺:技术论坛WM8978内部有很多的模拟开关,用来选择通道,同时还有很多调节器,用来设置增益和音量。接下来我们介绍相关寄存器。1、WAV&WM8978简介-WM8978寄存器淘宝店铺:技术论坛该寄存器用于控制WM8978的软复位,写任意值到该寄存器地址,即可实现软复位WM8978。R0寄存器(00h)注意:WM8978的寄存器是9位的!!而且是不可读的,只可以写,不可读!1、WAV&WM8978简介-WM8978寄存器淘宝店铺:技术论坛R1寄存器(01h)该位设置为1,模拟部分的放大器才会工作,才可以听到声音。1、WAV&WM8978简介-WM8978寄存器淘宝店铺:技术论坛R2寄存器(02h)该寄存器设置ROUT1EN(bit8),LOUT1EN(bit7)和SLEEP(bit6)等三个位,ROUT1EN和LOUT1EN,设置为1,使能耳机输出,SLEEP设置为0,进入正常工作模式1、WAV&WM8978简介-WM8978寄存器淘宝店铺:技术论坛R3寄存器(03h)该寄存器设置LOUT2EN(bit6),ROUT2EN(bit5),RMIXER(bit3),LMIXER(bit2),DACENR(bit1)和DACENL(bit0)等6个位。LOUT2EN和ROUT2EN,设置为1,使能喇叭输出;LMIXER和RMIXER设置为1,使能左右声道混合器;DACENL和DACENR则是使能左右声道的DAC了,必须设置为1。1、WAV&WM8978简介-WM8978寄存器淘宝店铺:技术论坛R4寄存器(04h)该寄存器要设置WL(bit6:5)和FMT(bit4:3)等4个位。WL(bit6:5)用于设置字长(即设置音频数据有效位数),00表示16位音频,10表示24位音频;FMT(bit4:3)用于设置I2S音频数据格式(模式),我们一般设置为10,表示I2S格式,即飞利浦模式。1、WAV&WM8978简介-WM8978寄存器淘宝店铺:技术论坛R6寄存器(06h)该寄存器直接全部设置为0即可,设置MCLK和BCLK都来自外部,即由STM32F4提供1、WAV&WM8978简介-WM8978寄存器淘宝店铺:技术论坛R10寄存器(0Ah)该寄存器我们要设置SOFTMUTE(bit6)和DACOSR128(bit3)等两个位,SOFTMUTE设置为0,关闭软件静音;DACOSR128设置为1,DAC得到最好的SNR。1、WAV&WM8978简介-WM8978寄存器淘宝店铺:技术论坛R49寄存器(31h)该寄存器要设置SPKBOOST(bit2)和TSDEN(bit1)这两个位。SPKBOOST用于设置喇叭的增益,设置为0即可(gain=-1),如想获得更大的声音,可设置为1(gain=+1.5)即;TSDEN用于设置过热保护,设置为1(开启)即可。

1、WAV&WM8978简介-WM8978寄存器淘宝店铺:技术论坛R50&R51寄存器(32h&33h)上图为R50寄存器描述,用于设置左声道,另外一个用于设置右声道(R51)。只需要设置这两个寄存器的最低位为1即可,将左右声道的DAC输出接入左右声道混合器里面,才能在耳机/喇叭听到音乐。1、WAV&WM8978简介-WM8978寄存器淘宝店铺:技术论坛R52&R53寄存器(34h&35h)上图为R52寄存器描述,用于设置耳机输出左声道(R52),另一个用于设置耳机输出右声道(R53)。这两个寄存器的最高位(HPVU)用于设置是否更新左右声道的音量,最低6位用于设置左右声道的音量,我们可以先设置好两个寄存器的音量值,最后设置其中一个寄存器最高位为1,即可更新音量设置。1、WAV&WM8978简介-WM8978寄存器淘宝店铺:技术论坛R54&R55寄存器(36h&37h)这两个寄存器用于设置喇叭音量,同R52,R53设置一模一样,这里就不细说了。

经过这些寄存器的设置,我们即可实现利用WM8978播放音乐,其他:3D、EQ等设置,这里就不再介绍了,请大家参考:WM8978G.pdf2、I2S简介&硬件连接-什么是I2S?淘宝店铺:技术论坛I2S(也叫IIS,即:InterICSound)总线,又称集成电路内置音频总线,是飞利浦公司为数字音频设备之间的音频数据传输而制定的一种总线标准,该总线专责于音频设备之间的数据传输,广泛应用于各种多媒体系统。它采用了沿独立的导线传输时钟与数据信号的设计,通过将数据和时钟信号分离,避免了因时差诱发的失真,为用户节省了购买抵抗音频抖动的专业设备的费用。2、I2S简介&硬件连接-F4的I2S特点淘宝店铺:技术论坛●支持全双工/半双工通信●支持主/从模式设置●8位可编程线性预分频器,可实现精确的音频采样频率(8~192Khz)●支持16位/24位/32位数据格式●数据包帧固定为16位(仅16位数据帧)或32位(可容纳16/24/32位数据帧)●可编程时钟极性●支持MSB对齐(左对齐)、LSB对齐(右对齐)、飞利浦标准和PCM标准等I2S标准●支持DMA数据传输(16位宽)●数据方向固定位MSB在前●支持主时钟输出(固定为256*fs,fs即音频采样率)2、I2S简介&硬件连接-F4的I2S框图淘宝店铺:技术论坛STM32F4的I2S是与SPI部分共用的,通过设置SPI_I2SCFGR寄存器的I2SMOD位即可开启I2S功能,I2S接口使用了几乎与SPI相同的引脚、标志和中断。2、I2S简介&硬件连接-F4的I2S信号淘宝店铺:技术论坛1,SD:串行数据(映射到MOSI引脚),用于发送或接收两个时分复用的数据通道上的数据(仅半双工模式)。2,WS:字选择(映射到NSS引脚),即左右时钟,用于切换左右声道的数据。WS频率等于音频信号采样率(fs)。3,CK:串行时钟(映射到SCK引脚),即位时钟,是主模式下的串行时钟输出以及从模式下的串行时钟输入。CK频率=WS频率(fs)*2*16(16位宽),如果是32位宽,则是:CK频率=WS频率(fs)*2*32(32位宽)。4,I2S2ext_SD和I2S3ext_SD:用于控制I2S全双工模式的附加串行数据引脚(映射到MISO引脚),这两个引脚仅用于全双工模式。5,MCK:即主时钟输出,当I2S配置为主模式(且SPI_I2SPR寄存器的MCKOE位置1)时,使用此时钟,该时钟频率为256×fs,fs:音频信号采样频率。I2S用到的信号有:2、I2S简介&硬件连接-F4的I2S全双工框图淘宝店铺:技术论坛

STM32F4为支持I2S全双工模式,除了I2S2和I2S3,还可以使用两个额外的I2S,它们称为扩展I2S(I2S2_ext、I2S3_ext),其框图为:扩展I2S(I2Sx_ext)只能用于全双工模式。I2Sx_ext始终在从模式下工作。I2Sx和I2Sx_ext均可用于发送和接收。2、I2S简介&硬件连接-F4的I2S帧格式淘宝店铺:技术论坛1,将16位数据封装在16位帧中;2,将16位数据封装在32位帧中;3,将24位数据封装在32位帧中;4,将32位数据封装在32位帧中;STM32F4的I2S支持4种数据和帧格式组合,分别是:将16位数据封装在32位帧中时,前16位(MSB)为有效位,16位LSB被强制清零,无需任何软件操作或DMA请求(只需一个读/写操作)。如果应用程序选则DMA,则24位和32位数据帧需要对SPI_DR执行两次CPU读取或写入操作,或者需要两次DMA操作。24位的数据帧,硬件会将8位非有效位扩展到带有0位的32位数据帧。2、I2S简介&硬件连接-F4的I2S帧标准淘宝店铺:技术论坛1,飞利浦标准;2,MSB对齐(左对齐)标准;3,LSB对齐(右对齐)标准;4,PCM标准;STM32F4的I2S支持4种帧标准,分别是:本例程使用飞利浦标准,仅对该标准进行介绍,其他请参考《STM32F4xx中文参考手册》第27.4节。2、I2S简介&硬件连接-I2S飞利浦标准淘宝店铺:技术论坛I2S飞利浦标准,使用WS信号来指示当前正在发送的数据所属的通道。该信号从当前通道数据的第一个位(MSB)之前的一个时钟开始有效。发送方在时钟信号(CK)的下降沿改变数据,接收方在上升沿读取数据。WS信号也在CK的下降沿变化。I2S飞利浦标准24位数据,32位帧格式波形图:2、I2S简介&硬件连接-I2S飞利浦标准淘宝店铺:技术论坛在24位模式下数据传输,需要对SPI_DR执行两次读取或写入操作。比如要发送0X8EAA33这个数据,就要分两次写入SPI_DR,第一次写入:0X8EAA,第二次写入0X33xx(xx可以为任意数值),这样就把0X8EAA33发送出去了。注意:从SD卡读取到的24位WAV数据流,是低字节在前,高字节在后的,比如,我们读到一个声道的数据(24bit),存储在buf[3]里面,那么要通过SPI_DR发送这个24位数据,过程如下:SPI_DR=((u16)buf[2]<<8)+buf[1];SPI_DR=(u16)buf[0]<<8;

这样,第一次发送高16位数据,第二次发送低8位数据,完成一次24bit数据的发送。2、I2S简介&硬件连接-F4的I2S时钟发生器淘宝店铺:技术论坛STM32F4的I2S时钟发生器,其架构如下图:

上图中的I2SxCLK,可以来自PLLI2S输出(通过R系数分频)或者来自外部时钟(I2S_CKIN引脚),一般我们使用前者作为I2SxCLK输入时钟。我们需要根据音频采样率(fs)来计算各个分频器的值,常用的音频采样率有:22.05Khz、44.1Khz、48Khz、96Khz、196Khz等。2、I2S简介&硬件连接-F4的I2S时钟发生器淘宝店铺:技术论坛当MCK输出使能时,fs频率计算公式如下:fs=I2SxCLK/[256*(2*I2SDIV+ODD)]

其中:I2SxCLK=(HSE/pllm)*PLLI2SN/PLLI2SR。HSE我们是8Mhz,而pllm在系统时钟初始化就确定了,是8,这样结合以上2式,可得计算公式如下:fs=(1000*PLLI2SN/PLLI2SR)/[256*(2*I2SDIV+ODD)]

fs单位是:Khz。其中:PLLI2SN取值范围:192~432;PLLI2SR取值范围:2~7;I2SDIV取值范围:2~255;ODD取值范围:0/1。

根据以上约束条件,便可根据fs来设置各个系数的值了,不过很多时候,并不能取得和fs一模一样的频率,只能近似等于fs,比如44.1Khz采样率,我们设置PLLI2SN=271,PLLI2SR=2,I2SDIV=6,ODD=0,得到fs=44.108073Khz,误差为:0.0183%。晶振频率决定了有时无法通过分频得到我们所要的fs,所以,某些fs如果要实现0误差,大家必须得选用外部时钟才可以。2、I2S简介&硬件连接-F4的I2S时钟发生器淘宝店铺:技术论坛如果要通过程序去计算这些系数的值,是比较麻烦的,所以,我们事先计算好常用fs对应的系数值,建立一个表,这样,用的时候,只需要查表取值就可以了,大大简化了代码,常用fs对应系数表如下://表格式:采样率/10,PLLI2SN,PLLI2SR,I2SDIV,ODDconstu16I2S_PSC_TBL[][5]={{800,256,5,12,1}, //8Khz采样率{1102,429,4,19,0}, //11.025Khz采样率{1600,213,2,13,0}, //16Khz采样率{2205,429,4,9,1}, //22.05Khz采样率{3200,213,2,6,1}, //32Khz采样率{4410,271,2,6,0}, //44.1Khz采样率{4800,258,3,3,1}, //48Khz采样率{8820,316,2,3,1}, //88.2Khz采样率{9600,344,2,3,1}, //96Khz采样率{17640,361,2,2,0}, //176.4Khz采样率{19200,393,2,2,0}, //192Khz采样率};淘宝店铺:技术论坛SPI_I2S配置寄存器(SPI_I2SCFGR)2、I2S简介&硬件连接-F4的I2S寄存器I2SMOD位,设置为1,选择I2S模式,注意,必须在I2S/SPI禁止的时候,设置该位。I2SE位,设置为1,使能I2S外设,该位必须在I2SMOD位设置之后再设置。I2SCFG[1:0]位,这两个位用于配置I2S模式,设置为10,选择主模式(发送)。I2SSTD[1:0]位,这两个位用于选择I2S标准,设置为00,选择飞利浦标准。CKPOL位,用于设置空闲时时钟电平,设置为0,空闲时时钟低电平。DATLEN[1:0]位,用于设置数据长度,00,表示16位数据;01表示24位数据。CHLEN位,用于设置通道长度,即帧长度,0,表示16位;1,表示32位。淘宝店铺:技术论坛SPI_I2S预分频器寄存器(SPI_I2SSPR)2、I2S简介&硬件连接-F4的I2S寄存器本例程我们设置MCKOE为1,开启MCK输出,ODD和I2SDIV则根据不同的fs,查表进行设置。淘宝店铺:技术论坛PLLI2S配置寄存器(RCC_PLLI2SCFGR)2、I2S简介&硬件连接-F4的I2S寄存器该寄存器用于配置PLLI2SR和PLLI2SN两个系数,PLLI2SR的取值范围是:2~7,PLLI2SN的取值范围是:192~432。同样,这两个也是根据fs的值来设置的。此外,还要用到SPI_CR2寄存器的bit1位,设置I2STXDMA数据传输,SPI_DR寄存器用于传输数据,本例程用DMA来传输,所以设置DMA的外设地址为SPI_DR即可。这两个寄存器的介绍,请参考:《STM32F4xx中文参考手册.pdf》。淘宝店铺:技术论坛1)初始化WM8978这个过程就是配置第一讲介绍的WM8978那十几个寄存器,包括软复位、DAC设置、输出设置和音量设置等。2)初始化I2S

此过程主要设置SPI_I2SCFGR寄存器,设置I2S模式、I2S标准、时钟空闲电平和数据帧长等,最后开启I2STXDMA,使能I2S外设。3)解析WAV文件,获取音频信号采样率和位数并设置I2S时钟分频器解析WAV文件,取得音频信号的采样率(fs)和位数(16位或24位),根据这两个参数,来设置I2S的时钟分频,我们用前面介绍的查表法来设置。4)设置DMAI2S播放音频,一般采用DMA来传输数据,这里我们用I2S2,其TX用DMA1数据流4的通道0来传输数据。并且,STM32F4的DMA具有双缓冲机制,这样可以提高效率。这里,我们将DMA1数据流4设置为:双缓冲循环模式,外设和存储器都是16位宽,并开启DMA传输完成中断(方便填充数据)。2、I2S简介&硬件连接-初始化步骤-1淘宝店铺:

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论