基于STM32的MP3播放器设计.doc

上传人:封****n 文档编号:96763164 上传时间:2024-03-19 格式:DOC 页数:28 大小:1.58MB
返回 下载 相关 举报
基于STM32的MP3播放器设计.doc_第1页
第1页 / 共28页
基于STM32的MP3播放器设计.doc_第2页
第2页 / 共28页
点击查看更多>>
资源描述

《基于STM32的MP3播放器设计.doc》由会员分享,可在线阅读,更多相关《基于STM32的MP3播放器设计.doc(28页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、基于STM32的MP3播放器设计 摘 要MP3播放器从原理上看是一个具有MP3播放功能的微型电脑。在MP3播放器小小的机身里,拥有MP3播放器存储器(存储卡)、MP3播放器显示器(大部分为LCD显示屏)、MP3播放器中央处理器MCU(微控制器)或MP3播放器解码DSP(数字信号处理器) 等。微处理器是播放器的“大脑”,用来接受用户选择的播放控制,并将当前播放的歌曲信息显示在液晶显示屏上,然后向数据信号处理芯片发出指令,音频信号将能够准确地被处理。我们可以通过数据传输线(USB)或WIFI局域网将MP3与PC进行连接,将自己喜欢的音频文件通过网络下载并导入到MP3中。总而言之,是这个信息化世界智

2、慧的结晶。而本设计就是利用信盈达科技有限公司出产的STM32解码板和核心板上的VS1053芯片,通过在KEIL软件中对VS1053芯片进行C语言驱动代码的编写,来驱动一个具有简单功能的开发版MP3播放器。关键词:MP3播放器、SPI通信、代码编写、 MP3 player design based on stm32 AbstractIn principle, MP3 player is a microcomputer with MP3 playing function. In the small body of MP3 player, there are MP3 player memory (m

3、emory card), MP3 player display (mostly in LCD display), MP3 player central processor (MCU) or MP3 player decoding DSP (digital signal processor), etc. The microprocessor is the brain of the player, which is used to accept the playback control selected by the user, display the currently played song

4、information on the LCD screen, and then send instructions to the data signal processing chip, and the audio signal will be processed accurately. We can connect MP3 and PC through USB or WiFi LAN, download and import our favorite audio files into MP3 through the network. All in all, it is the crystal

5、lization of the wisdom of the information world. This design is to use STM32 decoding board and vs1053 chip on the core board produced by sinyinda Technology Co., Ltd. to drive a development version MP3 player with simple functions by compiling the drive code of vs1053 chip.Keywords: mp3 player 、SPI

6、 communication 、code writing 目 录1 前言1.1 本设计的目的、意义及应达到的技术要求61.2 本设计在国内外的发展概况及存在的问题71.3 本设计应解决的主要问题72本设计82.1设计原理82.2方案选择82.3分析问题92.4设计过程92.4.1 VS1053解码器通信接口92.4.2 VS1053解码器通信协议 102.4.3 VS1053关键寄存器152.4.3.1 模式控制寄存器MODE162.4.3.2 时钟频率加乘数寄存器 CLOCKF162.4.3.3 音量控制寄存器VOL162.4.4 解码器硬件复位162.4.5 解码器软件复位172.4.6

7、音频通道选择器初始化172.5 代码编写182.5.1 解码器底层接口函数实现182.5.2 解码器复位函数实现222.5.2.1硬件复位222.5.2.2软件复位222.5.3 配置寄存器232.5.4 音频通道选择器初始化232.5.5 利用VS1053播放一首歌曲242.6 硬件测试253结论26参考文献27致谢28附录2928 1 前言随着时代的发展,在当今的时代背景下,低延迟为核心的5G网络、嵌入式系统、物联网、云计算等新崭技术已经成为了现今电子信息技术发展的主要角色,从产业发展的角度来说,这已经是一股无法逆转的浪潮。而嵌入式系统正是电子信息科技应用中最为核心的一部分,成为了新世纪最

8、具生命力的技术之一。伴随着消费类电子产业的发展的逐步壮大,各种各样的嵌入式电子产品走进了人们的视野中,进入到生活的方方面面。电脑也从以前的老式大块头PC机变得五花八门,六角形游戏主机、轻薄本、游戏本等形态,各式各样的嵌入式系统在出现在社会的各个角落中,在这之中,ARM公司推出的芯片受到了许多用户的赞赏。ARM芯片由于其功耗低、性能高、体积小、成本低等诸多特点越来越广泛地受到了各企业的重点注意,成为了许多企业开发产品首要考虑采用的硬件芯片。本课题的制作的MP3也是基于ARM平台的STM32系列芯片。VS1053是VLSI公司VSXX系列里面性能最为出色的一款,支持MP3 、WMA 、WAV、MI

9、DI、FLAC音频格式,支持硬件FFT频谱,DAC音频输出驱动器可以直接驱动32欧姆阻抗的耳机。该芯片的DAC具备有立体声功能,解码效果达到HIFI级别;芯片还有一个最大的特点就是自动化处理数据,内部具有一个2048字节的数据FIFO,我们只需要把音频数据发送给它内部的FIFO就可以了,它内部会自动对音频数据进行处理,自动识别播放的码率,自动播放音乐,自动的产生音乐的频谱数据。2048字节的数据FIFO能缓存音频数据,这样一来CPU就有足够的时间去处理其它的事情了,不需要每时每刻都在传输音频数据给VS1053。本课题以VS1053B为目标芯片,以此研究如何实现MP3播放器。1.1本设计的目的、

10、意义及应达到的技术要求目前智能手机所拥有的功能越来越多,MP3的功能也被整合到了手机中,但是音乐播放仅仅为手机的功能之一,而音乐播放却是MP3的主要职责。对于普通人来说,手机已经能很好地满足日常需求,而对于音乐发烧友或职业音乐人来说,MP3才是作为播放系统中前端的优选。而且手机的插孔所输出的电流不能满足部分高档耳机需要的工作电流,而MP3播放器则能让耳机以满功率输出音乐,达到最优播放效果这也是为何在智能手机日益发展的今天MP3音乐播放器仍像数码相机一样经久不衰的原因。在大多数MP3播放器所支持的音频格式中,MP3格式是最为常见的,它支持的歌曲为44.1KHz采样率,比特率范围一般是8-256K

11、bps。越高档的MP3支持的比特率范围自然越大,从各种角度上看MP3支持的范围自然是越广越好的。1.2本设计在国内外的发展概况及存在的问题世界上第一台MP3播放器是Saehan公司在1998年推出的MPMan F10。虽然该设备发售后就像浪花一样消失在电子产品的浪潮中,不过MPMan F10的出现启动了MP3市场,导致许多的电子厂商开始着手研发MP3设备。Rio PMP300在1998年底被美国的帝盟公司推出,这是第一个给全世界的人们留下了深刻印象的MP3。随着MP3这一产品的迅猛发展,到了2004年,MP3播放器从内存、机身、音质上的发展无法再吸引更多人们的目光之时,MP3便开始了往多功能设

12、备发展的趋势。正如十几年来在手机上所发生的事一样,人们对于MP3的要求越来越高,从单纯的进行音乐播放,到像手机一样既能打电话又能拍照、上网,不过,消费类电子产品的一大发展趋势是一个产品融合多个功能,就像IPHONE第一代发布时乔布斯说的“An Ipod, A phone, An internet communicate”。在中国首次推出彩色屏幕的MP3后,韩国iRiver趁势率先推出拥有拍摄功能的MP3。到了今日,MP3领域的领先地位依旧被韩国企业占据。MP3已经成为了便携播放设备类的一个主流产品,而且在手机之后也成为了最为广泛使用的个人随身电子产品。至于MP3格式的局限性,MP3格式的文件有

13、一些限制是不能通过使用更好的编码器来绕过的,例如:最大位速是320 kbps;相对于变化迅速的信号来说,时间的分辨率太低;对于超过15.5/15.8 kHz的频率没有尺度因子带*1;Joint stereo*2 是基于帧与帧完成的;没有定义编码器/解码器的整体时延,这就说明了gapless playback缺少一个正式的规定。虽然有以上限制,但是一个经过优秀调教MP3播放器也是能够地出色地完成编码任务的。1.3本设计应解决的主要问题在STM32上驱动一款芯片需要了解这款芯片的基础硬件结构,和在STM32上对应连接到的管脚等信息,并在KEIL软件上通过C语言编程的方式对芯片的驱动代码进行编写,令

14、芯片能够按照开发者的要求进行运作。故目前的主要问题是如何在KEIL中进行VS1053B的芯片驱动代码编写,使VS1053B芯片能在STM32开发板上顺利运行。2本设计2.1设计原理STM32解码板STM32核心板LCD显示屏VS1053解码器硬、软件复位VS1053关键寄存器SPI通信外接74HC4052模拟通道选择器件驱动代码编写图2.0 MP3项目结构图2.2方案选择在硬件的选择方面,经过数家MP3开发板套件的比较,我最终选用了信盈达公司的STM32-M3核心板和配套的解码板进行该项目,该开发板硬件已配套MP3系统的基础代码,用户需使用哪项功能,则仅需专门对该功能另外进行芯片驱动代码编写即

15、可达到开发编程的目的。决定MP3播放器性能的是它的解码芯片,该芯片不仅决定了MP3进行音频文件处理的速度,也决定了MP3能够给用户带了什么特殊音效,包括左右混响、3D音效等特殊音效。而使用较差的MP3解码芯片所带来的后果不仅仅只是降低音质,而且还很可能无法支持高采样率的MP3音频文件。市面中最常见的MP3播放器芯片有:Atmel, VLSI,Sigmatel,Actions,Sunplus(凌阳),PHILIPS,MosArt(华矽),Telechip,ST,CRYSTAL等。芯片备选方案中包含WM8978和VS1053B这两款芯片,而1053可以编解码的(带adc、dac),8978只是音频

16、ADC、DAC 功放(编解码需要mcu完成),故本项目选用的芯片为VLSI公司的VS1053b芯片,这片解码芯片性能强劲,能够满足本次设计的所有需求。在驱动代码的方案选择上,编写STM32-M3的驱动代码毫无疑问应选择C语言来进行编写。C语言是一门面向过程的、抽象化的通用程序设计语言,并广泛应用于底层开发。C语言能够以简单的方式对低级处理器进行编译和处理。C语言是一种仅产生少量的机器语言并且不需要任何运行环境支持就能进行运行的高效率程序设计语言。虽然C语言提供了许多低级处理的功能,但它仍然保持了跨平台的特性,以一个标准规格编写出来的C语言程序可以在包括类似嵌入式处理器以及超级计算机等作业平台的

17、许多计算机平台上进行编译。软件方面我选择的是美国Keil Software公司所出品的Keil软件来进行本项目的代码编写。该软件开发系统,是以51 系列兼容单片机C语言为主的。 Keil软件提供了完成代码编写所需要的C编译器、链接器、宏汇编、库管理以及一个功能强大的仿真调试器等在内的一套完整的开发方案。WIN98、NT、WIN2000、WINXP、WIN10等主流操作系统可以运行Keil软件。 如果开发者需要进行C语言编程,Keil几乎就是开发者的首选,如果开发者不使用C语言而仅仅使用汇编语言来进行编程,Keil所具有的方便易用的集成环境、强大的软件仿真调试工具也会开发者户事半功倍。2.3分析

18、问题要驱动在STM32上的VS1053B芯片,编写驱动代码时主要需要解决的问题是:选择VS1053解码器的哪个通信接口进行通信、编写VS1053解码器的通信协议代码、通过读芯片配套的原理图决定选择哪几个VS1053解码器的寄存器进行置位操作、编写软件复位代码、编写硬件复位代码。硬件连接方面则使用USB-A to USB-MINI-B型连接线、ST-LINK烧录器以及连接口转换插板配合来进行PC到项目硬件的连接和项目代码的烧录。2.4设计过程以下对项目代码设计所必要的各项步骤进行思路分析。2.4.1 VS1053解码器通信接口VS1053支持SPI和IIS两种通信接口,这里我们选择SPI作为VS

19、1053和STM32的通信接口。通过查询开发板原理图得知:图2.1 VS1053解码板管脚配置通过翻阅芯片说明书得知在SPI模式下需要用到的设置为:表2.1 SPI引脚对应STM32引脚及模式设置 VS1053引脚连接到STM32引脚STM32引脚的模式VS串行数据输出SOPA6上拉输入VS串行数据输入SIPA7复用推挽输出,时钟50MVS串行时钟SCLKPA5复用推挽输出,时钟50MVS命令操作片选XCSPF7通用推挽输出,时钟2MVS数据操作片选XDCSPF6通用推挽输出,时钟2MVS数据请求引脚DREQPC13下拉输入VS复位引脚XRESTPE6通用推挽输出,时钟2M有两个独立的输入/输

20、出引脚,故工作方式选择全双工通过查阅芯片手册和原理图和参考本文中2.4.2进行的分析,可以了解到所需要进行的SPI配置为:1工作方式全双工2数据长度8位3数据发送顺序高位先发4通信速度9.2M5通信协议选择模式0VS1053的2048字节FIFO是否可以接收数据是通过DREQ信号引脚来反馈的,如果该引脚是高电平,则说明VS1053b可以接受最少为32字节的SDI数据或者接收一条SCI命令,低电平则代表不能接收数据。2.4.2 VS1053解码器通信协议 VS1053解码器有两种通信协议,分别是:串行数据接口的串行协议(SDI)和串行命令接口的串行协议(SCI)。VS1053b串行协议支持两种模

21、式,分别是VS1002本地模式和VS1001 兼容模式。VLSI公司建议用户使用VS1002本地模式。1. 串行数据接口的串行协议(SDI)在VS1002本地模式下 (SM_NEWMODE是1),字节同步是由 XDCS 完成的,可以任意定义数据(SDATA 信号)在时钟信号DCLK的上升沿或下降沿上,字节传送可以设置为 MSb(高位)在前或LSb(低位)在前,这取决于 SCI_MODE中内容的定义。需要我们编程时在SCI_MODE寄存器进行选择。主机发送音频数据给VS1053b必须要在数据请求线DREQ变为高电平的时候才可以,DREQ变为高电平代表VS1053b的数据FIFO至少可以接受32字

22、节的音频数据。注意发数据之前需要把数据片选拉为低电平。2. 串行命令接口的串行协议(SCI)串行命令接口 SCI的串行总线协议包括:一个指令字节、一个地址字节(寄存器地址)和一个 16 位的数据字。指令字节决定的是访问的方向,地址字节决定是操作哪个寄存器。每次读取操作或写入操作均可以访问一个寄存器。由于那些数据位是在SCK的上升沿读取的,所以用户只能在SCK的下降沿上更新数据。每个字节的MSb(高位)总是被首先发送。在整个传送操作的期间,XCS必须要保持为低电平。SCI操作方向由指令字节来定义。查阅VS1053芯片手册可知:表2.2 SCI串行协议操作指令表指令名称 操作码 操作READ 0b

23、0000 0011 读取数据WRITE 0b0000 0010 写入数据 则:SCI写操作指令:0X02SCI读操作指令:0X03图2.2 串行数据接口串行协议图为了统一SPI的时序,我们选择数据位是在SCK的上升沿有效,每个字节的MSb先发。查阅STM32中文手册知:位1 CPOL: 时钟极性 (Clock polarity)0:空闲状态时, SCK保持低电平1:空闲状态时, SCK保持高电平注意: 正在通信时不应更改此位。不适用于 I2S 模式和 SPI TI 模式位 0 CPHA: 时钟相位 (Clock phase)0:从第一个时钟边沿开始采样数据1:从第二个时钟边沿开始采样数据注意:

24、 正在通信时不应更改此位。不适用于 I2S 模式和 SPI TI 模式则时钟空闲为低电平,数据采样从第一个时钟边沿开始。(就是SPI4种模式里面的模式0)图2.3 串行命令读协议图图2.4 串行命令读协议图解释图2.5 串行命令写协议图图2.6 串行命令写协议图解释由上图知指令数据长度为8位。图2.7串行SPI时序图 表2.3 SPI时序图注释符号最小最大单位tXCSS5nstSU0nstH2CLKI 周期tZ0nstWL2CLKI 周期tWH2CLKI 周期tV2 (+ 25 ns)CLKI 周期tXCSH1CLKI 周期tXCS2CLKI 周期tDIS10ns表2.4 芯片推荐工作值参数

25、符号 最小 典型 最大 单位工作环境温度 -30+85模拟和数字地AGND DGND0.0 V模拟电源供电电压, REF=1.23V AVDD 2.5 2.8 3.6 V模拟电源供电电压, REF=1.65V2 AVDD 3.3 3.3 3.6 V数字电源供电电压 CVDD 1.7 1.8 1.85 VI/O 电源供电电压 IOVDD 1.8 2.8 3.6 V输入时钟频率3 XTALI 12 12.288 13 MHz内部时钟频率 CLKI 12 36.864 55.3 MHz内部时钟倍数4 1.03.04.5主时钟周期占空比 405060%由上两个表可知tWL和tWH占4个CLKI周期,又

26、因为STM32内部时钟频率晶振为36.864MHz,则通信速度为36.864/4=9.2M2.4.3 VS1053关键寄存器2.4.3.1 模式控制寄存器MODE 表2.5 SCI_MODE寄存器配置表位元 名称 功能 值 说明0 SM_DIFF 差分 01正常的同相音频左通道反相1 SM_LAYER12 允许 MPEG layers I & II 01不允许允许2 SM_RESET 软件复位 01不用复位复位3 SM_CANCEL 取消当前的文件解码 01不取消取消4 SM_EARSPEAKER_LO EarSpeaker 低设定 01关闭激活5 SM_TESTS 允许 SDI 测试 01不

27、允许允许6 SM_STREAM 流模式 01不是是7 SM_EARSPEAKER_HI EarSpeaker 高设定 01关闭激活8 SM_DACT DCLK 的有效边沿 01上升沿下降沿9 SM_SDIORD SDI 位顺序 01MSb 在前MSb 在后10 SM_SDISHARE 共享 SPI 片选 01不共享共享11 SM_SDINEW VS1002 本地 SPI 模式 01非本地模式本地模式12 SM_ADPCM ADPCM 录音激活 01不激活激活13 - 01正确的错误的14 SM_LINE1 咪 / 线路1 选择 01MICPLINE115 SM_CLK_RANGE 输入时钟范围

28、 0112.13 MHz24.26 MHz通过对VS1053手册上该表格后的各位解释说明进行分析,发现该寄存器仅第11位置1,其他置0,则该寄存器的置位方案为0X0400(设定SPI的一些特性)图2.8 核心板所连接的解码板外部电路部分截选VS1053b 通常运作在一个频率为 12.288 MHz 基频的主时钟上。时钟可以通过外部的电路(连接到引脚 XTALI)或通过内部的时钟晶振接口(连接到 XTALI 和 XTALO 引脚)来产生的。这个时钟用来给模拟部件确定最高的可用采样率。在 12.288MHz 下,最高到 48000Hz 的所有采样率都可用。2.4.3.2 时钟频率加乘数寄存器 CL

29、OCKF通过查阅VS1053手册知该寄存器的设定频率主要会影响芯片能解码的采样率。查阅VS1053手册知:如果需要典型值,则内部乘法器值在复位之后必须设置为3.5x,等待DREQ升高之后,将数值0x9800写入CI_CLOCKF。将0x9800写入该寄存器能达到最优性能。2.4.3.3 音量控制寄存器VOL通过查阅VS1053手册知该寄存器用于设定VS1053的音量大小。这个音量寄存器的高字节是控制左通道音量的,低字节是控制右通道音量的。 对每个通道,数值在 0.254 的范围内设置可以实现在最大音量级别内的微调(步长 0.5 dB)。左通道数值是通过乘上 256 后再加到这个数值上的。所以,

30、最大的音量是 0、无声是 0xFEFE。设置 SCI_VOL 为 0xFFFF 将会使模拟单元进入掉电模式(降低功耗)2.4.4 解码器硬件复位VS1053有一个复位引脚,低电平有效。当 XRESET 信号被驱动到低电平, VS1053b 将重置所有的内部状态和控制寄存器为它们的初始值。如果我们没有播放音乐,可以复位VS1053让它省电。在进行硬件复位(或上电)操作之后, DREQ 将在低电平上停留最少22000个时钟周期,这对于运行在 12.288 MHz的 VS1053b 上来说,大约是 1.8 毫秒。随后用户应该在开始解码之前事先设置 SCI_MODE、 SCI_BASS、SCI_CLO

31、CKF 和 SCI_VOL 这几个基本软件寄存器。即复位后大概要等待1.8ms才能设置寄存器。2.4.5 解码器软件复位在某些情况下,解码器需要通过软件来进行复位操作。软件复位是通过激活 SCI_MODE寄存器中的SM_RESET 位来实现的,在这之后需要等待最少2微秒后再去查询 DREQ 状态。 DREQ 将在低电平上停留最少 22000个时钟周期,对于运行在 12.288 MHz 的 VS1053b 上来说,大约是 1.8 毫秒。然后等 DREQ 上升变为高,就可以像平常那样继续播放了。软件复位并不会复位寄存器。软件应用:用于VS1053出现播放故障时,进行复位的。2.4.6 音频通道选择

32、器初始化通过阅读配套手册得知,因为本项目使用的开发板套件上面外接了一个74HC4052模拟通道选择器件,根据开发板上面的原理图我们可以知道VS1053的音频源是接到74HC4052的通道0。根据74HC4052的真值表可以知道我们需要把PD7和PB7都输出低电平。图2.9 开发板音频源管理图表2.6 74HC4052的真值表InputsON ChannelsInhABXYHXXNoneNoneLLL0X0YLLH1X1YLHL2X2YLHH3X3Y2.5 代码编写2.5.1 解码器底层接口函数实现需要进行编写的VS1053底层函数有:1.IO口初始化函数2.SPI初始化函数3.SPI发送函数4

33、.SPI接收函数5.SPI设定通信速度的函数6.VS1053 SCI操作7.VS1053 SDI操作接下来将对以上七个部分的代码进行编写及部分简要说明。1.IO口初始化函数首先进行时钟使能,然后对负责SPI的寄存器管脚置位、然后分别对PE6、PF7、PC13、PF6管脚置位。void vs1053_port_init(void) RCC-APB2ENR |= (1APB2ENR |= (1APB2ENR |= (1APB2ENR |= (1CRL &= (0XFFFUCRL |= (0XB8BUODR |= (1CRL &= (0XFCRL |= (0X2ODR |= (1CRH &= (0X

34、FCRH |= (0X8CRL &= (0XFUCRL |= (0X2UODR |= (1CRL &= (0XFCRL |= (0X2ODR |= (1APB2ENR |= (1CR1 &= (0x7CR1 |= (0x7CR1 &= (0x1CR1 &= (0x1CR1 &= (0x1CR1 &= (0x1CR1 |= (0x1CR1 |= (0x1CR1 |= (0x1CR1 |= (0x1CR1 |= (0x1CR1 |= (0x1SR&(1DR = data; /等待接收完成(无用的数据) while(!(SPI1-SR&(1DR; 4.SPI接收函数u8 vs1053_spi_rec

35、eive_byte(void) u8 data; /等待前面的发送完成 while(!(SPI1-SR&(1DR = 0xff; /等待接收完成 while(!(SPI1-SR&(1DR; return data;5.SPI设定通信速度的函数因为VS1053的寄存器操作的数据要比数据操作的数据要慢,不能用操作数据的速度操作它的寄存器,如果把操作数据的速度调到符合寄存器操作,会造成传输数据很慢。void vs1053_spi_set_speed(u8 speed) while(SPI1-SR&(1CR1 &= (0x1CR1 &= (0x7CR1 |= (speedCR1 |= (0x1ODR |= (1ODR &= (18);vs1053_spi_send_byte(data&0XFF);GPIOF-ODR |= (1ODR |= (1ODR &= (1ODR |= (17);vs1053_spi_set_speed(VS1053_SPI_HIGHT);temp = temphODR &= (16);for(i=0;iODR |= (16);2.5.2 解码器复位函数实现2.5.2.1硬件复位硬件复位操作的是PE6引脚,先将PE6拉成高电平,在将PE6复位回低电平,硬件复位完成后再把PE6拉高即完成硬件复位。硬件复位函数:void vs1053_hard_reset( v

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 期刊短文 > 信息管理

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁