资源预览内容
第1页 / 共56页
第2页 / 共56页
第3页 / 共56页
第4页 / 共56页
第5页 / 共56页
第6页 / 共56页
第7页 / 共56页
第8页 / 共56页
第9页 / 共56页
第10页 / 共56页
亲,该文档总共56页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
DSP应用技术应用技术实实 验验 课课 程程电光系电光系本课程成绩本课程成绩笔试笔试 60 60分分实验实验 30 30分分平时平时 10 10分分总分总分 100 100分分实验注意事项实验注意事项1.按学号与机号对应就坐上机,实验完毕填写按学号与机号对应就坐上机,实验完毕填写实验登记本,并交老师签字实验登记本,并交老师签字; ;2 2. 上机过程中不可玩游戏,否则取消参加以后上机过程中不可玩游戏,否则取消参加以后实验资格;实验资格;3.3. 不得在实验室内吃早点不得在实验室内吃早点; ;4. 4. 不得随意更改计算机的软件和硬件设置,不不得随意更改计算机的软件和硬件设置,不得使用与实验课程无关的软件;得使用与实验课程无关的软件;5. 5. 保持实验室整洁,不要将废纸、杂物留在实保持实验室整洁,不要将废纸、杂物留在实验室。验室。第一讲第一讲1、实验箱系统介绍、实验箱系统介绍2、仿真开发与基本操作、仿真开发与基本操作3、定时器控制实验、定时器控制实验 SEED-DTK(DSP Teaching Kit)是由合众达)是由合众达公司提供的一套可以满足大学本科、研究生和教师科公司提供的一套可以满足大学本科、研究生和教师科研工作的综合实验设备,具有独特的多研工作的综合实验设备,具有独特的多DSP结构、较结构、较强的强的DSP主板功能、丰富的外围实验电路、与教学内主板功能、丰富的外围实验电路、与教学内容紧密结合的实验例程。容紧密结合的实验例程。 下面主要介绍下下面主要介绍下SEED-DTK2812实验箱,实验箱,它由它由SEED-DEC2812板卡以及板卡以及SEED_DTK_MBoard构成:其中主控板是合众达公司生产的构成:其中主控板是合众达公司生产的SEED-DEC2812,母板是由该公司生产的,母板是由该公司生产的SEED-DTK_MBoard板卡。此外,该款实验箱还可以配置板卡。此外,该款实验箱还可以配置DSK板卡、图像处理卡等多种子卡。板卡、图像处理卡等多种子卡。1 实验系统介绍实验系统介绍SEED-DTK2812的原理框图的原理框图 SEED-DTK2812实验箱构成实验箱构成SEED-DEC2812 实验箱DSP基本系统:高性能DSP:TMS320F2812,主频150MHZ外扩SRAM,最大容量为512K16位512字节的EEPROM+RTC实时时钟16路AD输入4路DA输出12路PWM输出,6路捕捉输入双路URAT接口,接口标准为RS232/RS422/RS485,可配置符合标准的高速Host端接口1路CAN总线接口,符合协议SEED-DTK2812实验箱构成:实验箱构成:SEED-MBoard 实验箱人机接口模块:处理器为TMS320C5402SRAM:64K16位(可扩展至25616位)FLASH: 25616位(用于存放二级标准汉字库及驻留实验程序)提供手动复位1路RS232接口4路12位10微秒建立时间10V输出D/A17键薄膜键盘240*128大屏幕液晶显示交通灯演示模块DSP电路系统电路系统 一个独立工作的一个独立工作的DSP芯片一般包括电源电路、芯片一般包括电源电路、复位电路、时钟电路、模数转换接口电路。复位电路、时钟电路、模数转换接口电路。 下面结合合众达公司提供的下面结合合众达公司提供的SEED-DTK2812实实验箱为例对验箱为例对DSP基本的硬件电路设计及应用进行简基本的硬件电路设计及应用进行简要的介绍。(参见电路设计原理图)要的介绍。(参见电路设计原理图)复位电路复位电路 上电复位电路一般在芯片的上电复位电路一般在芯片的RESET引脚上置引脚上置100200ms的低电平脉冲。的低电平脉冲。RC复位电路具有一般复位电路具有一般性。性。 具有上电延迟复位和手动复位功能的复位电路图具有上电延迟复位和手动复位功能的复位电路图如图所示。系统调试和系统运行出现故障时可以方便如图所示。系统调试和系统运行出现故障时可以方便地使用手动复位。地使用手动复位。 复位电路图 合众达公司提供的合众达公司提供的SEED-DEC2812板卡中,板卡中,J2作为作为复位按钮,方便调试。复位芯片复位按钮,方便调试。复位芯片TPS3823-33能够输能够输出时间固定为出时间固定为20ms的复位有效信号的复位有效信号 。DSP电路系统电路系统时钟电路时钟电路 合众达公司提供的合众达公司提供的SEED-DEC2812板卡中,板卡中,TMS320F2812采用内部振荡器方式,由一个采用内部振荡器方式,由一个30MHZ的石英晶振提供参考频率如图所示。的石英晶振提供参考频率如图所示。内部振荡器电路内部振荡器电路 DSP电路系统电路系统电源与滤波电路电源与滤波电路 电源芯片电源芯片TPS75733实现将实现将5V转为电源,最大输出转为电源,最大输出电流为电流为3A;电源芯片;电源芯片TPS76801Q实现将实现将5V转为电转为电源,最大输出电流为源,最大输出电流为1A。、这两路电源分别为外围。、这两路电源分别为外围电路和电路和CPU供电供电 为了降低电源干扰,通常对电源作滤波处理,方法为了降低电源干扰,通常对电源作滤波处理,方法是采用容值大小不同的电容并联进行电源滤波。是采用容值大小不同的电容并联进行电源滤波。 2 仿真开发与基本操作仿真开发与基本操作DSP的软件结构的软件结构DSP仿真开发仿真开发 硬件仿真硬件仿真 软件仿真软件仿真 仿真操作界面仿真操作界面 工程文件工程文件 练习练习DSPDSP的软件结构的软件结构.asm.obj.cmd.outDSPDSP的软件结构的软件结构汇编器和链接器提供有关命令,创建块和对块处理;汇编器和链接器提供有关命令,创建块和对块处理; (1 1)汇编器功能:确定汇编语言源代码中各种代码)汇编器功能:确定汇编语言源代码中各种代码和数据段的块及相应块的联系命令。和数据段的块及相应块的联系命令。 汇编后产生汇编后产生 .obj .obj文件(目标文件)。文件(目标文件)。(2 2)链接器功能(配置)链接器功能(配置CMDCMD文件),将块定位于目标文件),将块定位于目标存储器,使各块有合适的起始地址存储器,使各块有合适的起始地址1. 将将COFF目标文件中的块目标文件中的块建立程序块建立程序块或或数据块数据块,产,产生可执行的生可执行的COFF输出模块(输出模块(.out文件)文件)2. 为输出模块选择存储器地址。为输出模块选择存储器地址。DSP仿真开发仿真开发DSP与单片机一样,它的开发需要与单片机一样,它的开发需要一套完整一套完整的软硬件开发工具的软硬件开发工具 。 TI公司提供软件开发工具公司提供软件开发工具CCS(Code Composer Studio) 硬件开发工具为扩展开发系统硬件开发工具为扩展开发系统XDS(Extrended Development System).DSP仿真开发仿真开发 硬件仿真开发:硬件仿真开发: 目前采用边界扫描仿真器目前采用边界扫描仿真器XDS,利用,利用DSP芯片芯片上集成上集成JTAG边界扫描接口,实现数据传输和仿真。边界扫描接口,实现数据传输和仿真。在开发时,在开发时,DSP芯片焊在电器板上,配合芯片焊在电器板上,配合CCS,可,可进行仿真进行仿真 调试,使调试,使DSP开发非常方便。开发非常方便。CCS目标系统目标系统Xds510仿真盒仿真盒emulatorJTAG插头座插头座(14/12芯)芯)DSPsimulatorDSP仿真开发仿真开发 调试程序时,若需设置内部寄存器或读出指令执行调试程序时,若需设置内部寄存器或读出指令执行结果,先停止结果,先停止DSP内核电路的工作,通过器件上内核电路的工作,通过器件上JTAG头对器件进行扫描,可以把信息输入到头对器件进行扫描,可以把信息输入到DSP中,亦可从器件中读出数据。中,亦可从器件中读出数据。软件仿真开发:软件仿真开发: 软件开发平台软件开发平台CCS是是TI公司开发其公司开发其DSP芯片的开放芯片的开放型集成开发环境,它基于型集成开发环境,它基于PC机的机的DSP开发环境,可开发环境,可在在Window环境下运行。与边界扫描仿真器环境下运行。与边界扫描仿真器XDS连连接使用直接进行用户目标系统的开发,调试。它集接使用直接进行用户目标系统的开发,调试。它集编辑、编译、链接、软件仿真,硬件调试及实时跟编辑、编译、链接、软件仿真,硬件调试及实时跟踪等功能于一体。踪等功能于一体。DSP仿真开发仿真开发操作:操作:(1)双击桌面)双击桌面Setup ccs2(c2000)图标,弹出)图标,弹出CCS设置对话框。设置对话框。(2)单击)单击“import Configuration”的的“close”,关关闭对话框。闭对话框。(3)在弹出的)在弹出的“Code Composer Studio Setup”对对话框中选话框中选“F2812 xds510 Emulator”或或“F2812 Simulator”(4)单击)单击“Save &Quit”后,自动进入后,自动进入CCS工作界面。工作界面。DSP仿真开发仿真开发仿真操作界面仿真操作界面仿真操作界面有:菜单栏、工具条,工程管理仿真操作界面有:菜单栏、工具条,工程管理器窗口和工作窗口。器窗口和工作窗口。菜单栏中主要有:菜单栏中主要有:文件存取操作文件存取操作向目标板装载目标程序向目标板装载目标程序剪贴复制剪贴复制存储器,变量等编辑存储器,变量等编辑窗口菜单,工具操作窗口菜单,工具操作存储器,寄存存储器,寄存器,图,看门狗等观察。器,图,看门狗等观察。项目工程的操作(新建、打开、项目工程的操作(新建、打开、增加、删除、编译)增加、删除、编译)调试(中断,单步等操作)调试(中断,单步等操作)DSP仿真开发仿真开发仿真操作界面仿真操作界面常用图标常用图标Project Toolbar:工程工具条工程工具条提供与工程和断点设置有关的命令提供与工程和断点设置有关的命令 编译当前文件编译当前文件 对所有修改过的文件重新编译,再链接生成对所有修改过的文件重新编译,再链接生成可执行文件可执行文件全部重新编译链接生成可执行文件全部重新编译链接生成可执行文件DSP仿真开发仿真开发仿真操作界面仿真操作界面 停止停止Build操作操作 设置断点设置断点 移除所有断点移除所有断点.Debug Toolbar:调试工具条调试工具条提供常用的调试命令提供常用的调试命令 单步跳出,程序运行在函数内部时,执行该操单步跳出,程序运行在函数内部时,执行该操作会执行函数内的所有剩余操作作会执行函数内的所有剩余操作DSP仿真开发仿真开发仿真操作界面仿真操作界面源代码单步进入源代码单步进入(遇到函数调用时,进入被调用遇到函数调用时,进入被调用函数并单步运行函数的程序函数并单步运行函数的程序) 源代码单步执行(遇到函数调用时,整个函数源代码单步执行(遇到函数调用时,整个函数作为一条程序处理)作为一条程序处理)运行程序运行程序 停止程序运行停止程序运行 断续运行(遇到断点后短暂后,继续运行)断续运行(遇到断点后短暂后,继续运行)寄存器窗口寄存器窗口 观察内存数据空间观察内存数据空间 DSP仿真开发仿真开发仿真操作界面仿真操作界面观察堆栈空间观察堆栈空间 观察反汇编代码观察反汇编代码 Watch Window :观察工具条:观察工具条打开打开Quick Watch 窗口观察或修改变量,可窗口观察或修改变量,可将变量加入将变量加入Watch 窗口以便察看窗口以便察看 打开打开Watch窗口观察或修改变量。窗口观察或修改变量。 工程文件工程文件 目前绝大多数软件都以目前绝大多数软件都以项目工程(项目工程(Project)形形式组织软件开发中的所有文件。集成开发环式组织软件开发中的所有文件。集成开发环境下,境下,一个工程可能包括了许多类型的源文件,也一个工程可能包括了许多类型的源文件,也会产生许多不同的输出文件。会产生许多不同的输出文件。因此开发一个应用软因此开发一个应用软件并非建立一个新文件,而是建立一个件并非建立一个新文件,而是建立一个新工程新工程。新工程项目的建立步骤新工程项目的建立步骤:a.打开打开CCS(c2000) b.单击单击project c.在在“Project Creating”对话框中,对话框中,Project栏输入栏输入新工程项目名新工程项目名 。Location,Project,Target一般一般默认。默认。 d.单击单击“完成完成”。工程文件工程文件在项目工程管理窗口出现在项目工程管理窗口出现“*.pjt(Debug)”。双击后出现以下文件夹:双击后出现以下文件夹: Dependent Projects DSP/BIOS Config Generated Files Include 头文件(头文件(*.h) Libraries 库文件(库文件(*.lib) Source C语言成汇编语言源文件语言成汇编语言源文件 (*.C或或 *.asm)工程文件工程文件 在这些子目录中应添加必要文件,以后缀在这些子目录中应添加必要文件,以后缀加以区别。这些文件需要专门编写。加以区别。这些文件需要专门编写。实际上实际上头文件(头文件(*.h*.h),链接文件(),链接文件(*.cmd*.cmd), ,库文库文件(件(*.lib*.lib)简单应用,)简单应用,一般不需编写,借一般不需编写,借用即可。但源文件必须根据用途,要求编制。用即可。但源文件必须根据用途,要求编制。可以用可以用C C语言也可以用汇编语言编制。语言也可以用汇编语言编制。 目前一般用途可用目前一般用途可用C C语言编写语言编写。工程文件工程文件为了有条不紊地使用为了有条不紊地使用CCSCCS,建议构建新工程项,建议构建新工程项目后,自动生成相应文件类及目后,自动生成相应文件类及*.pjt*.pjt文件文件;在该文件夹中组建相应的文件夹,该文件夹在该文件夹中组建相应的文件夹,该文件夹中包括中包括Include, , Libraries,Source.其中在其中在Include移植相应移植相应的头文件的头文件(*.h),),在在Libraries中移植必要中移植必要的库文件的库文件(*.lib)。而。而Source中放置新编中放置新编置置u的的C语言源程序语言源程序(*.C)工程文件工程文件简单程序开发包括简单程序开发包括:1.创建新工程项目创建新工程项目2.向新工程添加向新工程添加.c, .cmd , .lib, 文件文件3.编译、链接生成目标文件编译、链接生成目标文件4.装载目标文件装载目标文件5.运行目标文件运行目标文件练练 习习目的:熟悉目的:熟悉CCSCCS软件环境,了解软件仿软件环境,了解软件仿 真开发过程。真开发过程。在在CCSCCS中编程实现简单的加法运算,中编程实现简单的加法运算, a=10, b=10 a=10, b=10, 计算计算 c=a+b c=a+b操作步骤操作步骤1. 创建新工程创建新工程qq (project-New)qq (project-New)2.2.在在“myprojectqq”“myprojectqq”中添加文件夹中添加文件夹“src”“src”、 “lib”“lib”、“include”.“include”.3.3.编制编制C C语言源文件(语言源文件(File-NewFile-New)4.4.添加库文件、链接文件和源文件。添加库文件、链接文件和源文件。(ProjectAdd File to ProjectProjectAdd File to Project)5.5.将创建的新工程存储。(将创建的新工程存储。(Project - SaveProject - Save)6.6.编译编译C C语言源程序。语言源程序。( )( )操作步骤操作步骤7.链接并生成目标文件(链接并生成目标文件(Debug-Rebuild Debug-Rebuild All, All, )8.8.装载目标文件(装载目标文件(FileLoad ProgramFileLoad Program)9.9.打开输出结果窗口(打开输出结果窗口(ViewWatch, ViewWatch, )10.10.运行目标文件(运行目标文件(DebugGo Main, DebugGo Main, )11.11.停止运行。(停止运行。(DebugHalt, DebugHalt, )12.12.修改源程序中修改源程序中a, ba, b值,熟悉链接值,熟悉链接- -装载装载- -观观察结果的过程察结果的过程. .3 3 定时器控制实验定时器控制实验实验目的:实验目的:掌握掌握 定时器基本原理定时器基本原理掌握掌握 中断的基本原理中断的基本原理掌握掌握 定时器控制定时器控制C C语言编程语言编程实验原理实验原理 TMS320F2812片内有片内有3个个32位时钟,分别被称为位时钟,分别被称为CPU定时器定时器0、1、2。其中定时器。其中定时器1和定时器和定时器2预留预留给适时操作系统使用(例如给适时操作系统使用(例如DSPBIOS),只有定时),只有定时器器0用户可以在应用程序中使用。每个定时器中均有用户可以在应用程序中使用。每个定时器中均有一个一个32位减计数器,当计数器减到零时,产生一个位减计数器,当计数器减到零时,产生一个中断。其中,中断。其中,TIMER0中断为中断为PIE中断,中断,TIMER1中中断直接连在断直接连在CPU的的INT13,TIMER2中断直接连在中断直接连在CPU的的INT14.注:注:SEED-DEC2812未使用未使用CPU定时器定时器0,用户可,用户可以根据应用的需要灵活使用以根据应用的需要灵活使用。 3 3 定时器控制实验定时器控制实验3 3 定时器控制实验定时器控制实验实验原理实验原理工作原理工作原理(1)预定标计数器PSC,在系统工作时钟SYSCLKOUT作用下,递减计数。经(TDDR+1)个周期预定标计数器减为零,产生下溢信息,向定时器的32位计数器(TIM)借位。(2)32位计数器TIM,在预定标计数器PSC下溢信号下,递减计数;预定标计数器PSC在本身下溢信号作用下,重新装载。(3)32位计数器TIM经(PRD+1)个周期,递减为零,产生中断信息INT,并在此信号作用下重新装载。 在初始化值在初始化值TDDR, PRD TDDR, PRD 不全为零时,不全为零时,定时定时器中断周期器中断周期为:为: 即即中断频率中断频率为为: 定时中断信号与处理器内部连接示意图:定时中断信号与处理器内部连接示意图:定时器控制寄存器(定时器控制寄存器(TCRTCR)TIF TIE RES RES FREE SOFT RES RES15 14 13 12 11 10 9 8RES RES TRB TSS RES RES RES RES7 6 5 4 3 2 1 0 中断标志中断标志写写1清除标志清除标志 中断使能中断使能写写1清除使能清除使能CPU定时器定时器 仿真模式仿真模式定时器装载位定时器装载位 1=reload 定时器定时器停止状态位停止状态位0 start1 stop(RES为保留位)为保留位)定时器配置和控制寄存器定时器预定标寄存器(定时器预定标寄存器(TPRTPR)PSCH TDDRH15.8 70PSC TDDR15.8 7016位定时器位定时器预定标计数器高预定标计数器高8位位16位定时器位定时器预定标计数器低预定标计数器低8位位16位定时器位定时器分频寄存器高分频寄存器高8位位16位定时器位定时器分频寄存器低分频寄存器低8位位定时器配置和控制寄存器定时器计数器(定时器计数器(TIMTIM) ;TIMH15 . 0TIM15 . 0TIMH:32位定时器位定时器 计数器高计数器高16位位TIM:32位定时器位定时器 计数器低计数器低16位位定时器配置和控制寄存器定时器周期寄存器(定时器周期寄存器(PRDPRD)PRDH15 0PRD15 . 0PRDH: 32位定时器位定时器 周期寄存器高周期寄存器高16位位PRD: 32位定时器位定时器 周期寄存器低周期寄存器低16位位定时器配置和控制寄存器 实验准备实验准备 1将将DSP仿真器与计算机连接好;仿真器与计算机连接好; 2将将DSP仿真器的仿真器的JTAG插头与插头与SEED-DEC2812单元的单元的J1相连接;相连接; 3. 打开打开SEED-DTK2812的电源。的电源。 观察观察SEED-DTK_Mboard单元的单元的+5V,+15V,-15V的电源指示灯以及的电源指示灯以及SEED-DEC2812的电源指的电源指示灯示灯D2是否均亮;若有不亮的,请断开电源,检查是否均亮;若有不亮的,请断开电源,检查电源。电源。实验程序文件:实验程序文件: DSP28_CpuTimer.c:包含定时器初始化和配包含定时器初始化和配置函数。置函数。 DSP28_Defautlsr.c:包含各中断默认的中断包含各中断默认的中断程序。程序。 DSP28_GlobalVariableDefs.c:定义各模块的定义各模块的全局变量。全局变量。 DSP28_Gpio.c: Gpio初始化。初始化。 DSP28_InitPeripherals.c:包含各外设初始化。包含各外设初始化。 DSP28_PieCtrl.c:初始化各初始化各PIE控制寄存器。控制寄存器。 DSP28_PieVect.c:PIE中断向量表初始化。中断向量表初始化。 DSP28_SysCtrl.c: 包含系统初始化函数等。包含系统初始化函数等。实验程序文件:实验程序文件: :实验主程序,包含系统初始化,定时器中断初始化,实验主程序,包含系统初始化,定时器中断初始化,中断程序等。中断程序等。 :声明了系统存储器配置与程序各段的连接关系。:声明了系统存储器配置与程序各段的连接关系。 :系统初始化:系统初始化 *.h:各个源文件的头文件:各个源文件的头文件 Rts2800.l:库函数文件库函数文件系统初始化等待进入中断程序关中断定时器中断初始化配置并启动定时器开中断定时器控制设计流程图定时器控制设计流程图: 33interrupt void ISRTimer2(void);void main(void)/*初始化系统初始化系统*/InitSysCtrl();/*关中断关中断*/DINT;IER = 0x0000;IFR = 0x0000; /*初始化初始化PIE*/InitPieCtrl();/*初始化初始化PIE中断矢量表中断矢量表*/InitPieVectTable(); /*初始化外设初始化外设*/ InitPeripherals();定时器控制设计实例:定时器控制设计实例:主程序设计:EALLOW;PieVectTable.TINT2 = &ISRTimer2;EDIS; /*设置设置CPU*/ConfigCpuTimer(&CpuTimer2, 150, 1000000); StartCpuTimer2(); /*开中断开中断*/IER |= M_INT14;EINT; / Enable Global interrupt INTMERTM;/ Enable Global realtime interrupt DBGMfor(;); #define M_INT14 0x2000void ConfigCpuTimer(struct CPUTIMER_VARS *Timer, float Freq, float Period) Uint32 temp; / Initialize timer period: Timer-CPUFreqInMHz = Freq; Timer-PeriodInUSec = Period; temp = (long) (Freq * Period); Timer-RegsAddr- = temp; / Set pre-scale counter to divide by 1 (SYSCLKOUT): Timer-RegsAddr- = 0; Timer-RegsAddr- = 0;设置定时器定时时间,并初始化定时器:设置定时器定时时间,并初始化定时器:根据程序列出具体的定时器中断频率公式根据程序列出具体的定时器中断频率公式 / Initialize timer control register: Timer-RegsAddr- = 0; / 0 = Pulse Low Timer-RegsAddr- = 0; / 0 = No Toggle, POL bit defines action Timer-RegsAddr- = 1; / 1 = Stop timer, 0 = Start/Restart Timer Timer-RegsAddr- = 1; / 1 = reload timer Timer-RegsAddr- = 0; / Force output enable (not used) Timer-RegsAddr- = 7; / 7+1 = 8 SYSCLKOUT cycle pulse width Timer-RegsAddr- = 1; Timer-RegsAddr- = 1; / Timer Free Run Timer-RegsAddr- = 1; / 0 = Disable/ 1 = Enable Timer Interrupt / Reset interrupt counter: Timer-InterruptCount = 0;实验要求与任务实验要求与任务 装入装入 工程文件后,添加文件。结合程序流程充分理工程文件后,添加文件。结合程序流程充分理解实验主程序,并完成以下工作:解实验主程序,并完成以下工作:1、将中断服务主程序补充完整,要求能够实现、将中断服务主程序补充完整,要求能够实现SEED_DEC2812板卡上指示灯板卡上指示灯D1和和D3交替闪烁。交替闪烁。 interrupt void ISRTimer2(void)CpuTimer2.InterruptCount+; ?补充程序补充程序实现指示灯实现指示灯D1和和D3交替闪烁交替闪烁 2、尝试将指示灯尝试将指示灯D1和和D3交替闪烁的时间改为交替闪烁的时间改为4S、10S(实验者根据自己的需要改变周期(实验者根据自己的需要改变周期寄存器的值,从而控制每次进入中断的时间)寄存器的值,从而控制每次进入中断的时间)。
收藏 下载该资源
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号