2812控制精确的1秒LED闪烁程序_第1页
2812控制精确的1秒LED闪烁程序_第2页
2812控制精确的1秒LED闪烁程序_第3页
2812控制精确的1秒LED闪烁程序_第4页
2812控制精确的1秒LED闪烁程序_第5页
已阅读5页,还剩8页未读 继续免费阅读

下载本文档

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

文档简介

1、第一个精确的1秒LED闪烁程序i程序特点本程序使用F2812硬件,控制GPIOF14管脚上的一个LED做精确的1秒间隔 闪烁,并且程序从Flash启动。2建立工程2.1 文件该工程包含以下文件:-lyFirstPjt. p jt (Debug)- I Dependent Projects_| Documentsn DSP/BIOS Config _| Generat ed Flies-Include图DSP231宜上dah = DSP281x_CpuTiJners h g! DSF281K_DefaultISR. h DSP28 Ix_DbvEjlui h 圜 DSP281xDevice.h

2、g! DSF281K_ECan.h 圜 DSPSSlx.Evih S DSP281z_ExajiipLes.h 圄 DSPESlX-GlobalProt otypes. h 圜 DSP281x_GpiOihB DSP28U_Mcbsp.h DSP231xPieCtrl.h DSP281x_PieVect,h 圄 I)SP281VSci-h 圜 DSP281x_Spi.h 圜 DSP281x_SWPriorit izedIsrLevels. h m DSF281E_SysCtrl.h 圜 DSPZglK-Xirrtf.h 圜 DSP281x_XIntrupt.h1 Libraries:-.与 S

3、ource 闵 DSP281y_CodeStartBranch, asm 国 DSP281K_Defaultlsr c 囱 DSP231xr,GlobalVariableDefs. c ffl DSP281K_Gpio,c DSP28 lK_MejnCopy. c 国 DSP281x_PieCtrl. c 理 DSP281K_FieVect. c 国 DSPESlxSysCtrl.c 囱 DSP281x_ueDelay. asmmain, c国 DSP231x_Headers_nonBIOSi cmd 国 F2812.cmd注:除了 Main.c为自己写的之外,其他均为 F2812DEMO自带

4、的文件。其中部 分文件做了小小的修改,下文会详述2.2 建立工程打开CCS3.1,选择Project New,输入工程名,这里是 MyFirstPjt,选择工 程目录后点击确定,然后在左侧的工程管理窗口中选中 MyFirstPjt.pjt ,右键一 添加 文件,将下列文件加入工程:_里 DSP231x_CodeSt art Branch. asm;:tn DSP28lx_Def aultIsr. c国 DSP281K_GlobalVariableDefs. c阖 DSF281K_Gpio,c 闽 DSP23lK_KenCopy. 国 DSP23kpiKtrL 国 DSP281x_PieVect

5、. 阂 DSF231K_SysCtrl. 由 DSP281X_usDelay.Casm然后再次选中 动搜索关联的文件,囱 DSP231x_Headers_ncinBIOS. cm.dF2812,cmd-MyFirstPjt.pjt,右键一Scan All File Dependencies CCS 系统会自 特别是.h头文件,并将所有.h头文件显示出来,如下图所示:I- ,i MyFirstPj. pjt Debug); I Dependenl: Pr o j ect s口l_iLJ苴DSF281x_Adc. hteiDSP281e_rCpuTimers, h当DSP2S1k_Defau.lt

6、 I SR. h圜DSP261e_.DevEmu, h当DSP2Slx_Device- h置DSP21k_ECan. h本DSP281h_一E h匐DSP2&lx_.Examples. ri宣DSPa81x_Q 1 ob alPfC-t ot ypes. haDSP2S1m_Gpio h圄DSP281x_Mcbsp h宣DSP2Blx_.FieCtrl. h凄DSP2S1k_PieVect a h当圜DSP2&lit_DSP2&1e_Sci.lh,Spi- h叁DSP281x_SWPrior it izedlsrLh当DSP2S1k_,SysCt rl-h三BSP2S!-e_:超:Lirtf

7、. h置DSP2Slx_.XInt rupt. hDocumentsDSP/BIOS ConfigGenerat ed Files IncludeL ibr airi esSourceDSP2S1asm苜 DSP281x_Default Isr. e里 DSP281x_GlobalVariableDeTs. c阂 DSP281x_Gpio. c身 DSP281x_MemCQp5r. c西 DSP281x_PieCtrl- c& DSP281x_PieVect. c阂 DSP28lx_SysCt r1 - C圜 DSP281x_usDelay. asmZLFu C如果你看不到,青I DSP231

8、K_Headers_nonfiIOS. cmd F2812. end请点击十号展开文件列表。但注意此时并没有完成,还需要设置编译环境:在左侧的工程管理窗口中选中MyFirstPjt.pjt ,右键一Bulid Options 做如下设置:很关键的一个设置是必须设置头文件的搜索路径, CCS在编译时先搜索安装目 录下的头文件,然后再搜索用户指定的路径,如果再找不到,就报错。 头文件的搜 索路径设置如下:其中$(Proj_dir)表示工程所在的目录,这里设置为“$(Proj_dir)DSP281x_headersinclude, $(Proj_dir)DSP281x_commoninclude 多

9、个 路径中向逗号隔开。%然也可以设置绝对路径:但这样设置方而一些,便于在工 程拷贝中不用再更改设置。然后设置库和库的搜索路径:Build Opt ions for MyFirstPjt. . . H 区Gener&1 | Compiler Linkr Link Order确定取消帮助这里使用了 CCS3.1自带的库rts2800_ml.lib,该库位于CCS安装目录的 C2000cgtoolslib下,此库中带有bootloader的obj文件,以便于与用户的应用程序 连接,大信号模式下用rts2800_ml.lib,小信号,g式下用rts2800.lib。2.3 编译略,与众多IDE相似。2

10、.4 下载首先确保安装了 F2812的Flash烧写插件和仿真器的驱动,硬件连接好后,按 CTRL+ALT+R以RESET仿真器,按ALT+C连接DSP和PC,点击CCS上的Tools 下的 F28xx On-Chip Flash Programmer即可下载。具体步骤从略。2.5 运行断开仿真器,上电即可运行。具体从略。3 程序详解3.1 Main.c#include DSP281x_Device.h#include DSP281x_Examples.h#include DSP281x_Gpio.h#include DSP281x_XIntrupt.h/ DSP281x Headerfile

11、 Include File/ DSP281x Examples Include File/extern void DSP28x_usDelay(Uint32 time);void main(void)InitSysCtrl();DisableDog();MemCopy(&RamfuncsLoadStart, &RamfuncsLoadEnd, &RamfuncsRunStart);InitGpio();/初始化 pio, gpiof14 为输出DINT;IER = 0x0000;IFR = 0x0000;InitPieCtrl();InitPieVectTable();初始化中断向量表for(

12、;) GpioDataRegs.GPFTOGGLE.bit.GPIOF14 = 1; gpiof14 输出值翻转DELAY_US(0xF4240); / Delay One second 其中:InitSysCtrl()主要用来配置DSP的时钟频率,该函数在 DSP281x_SysCtrl.c文件 1DisableDog()关闭看门狗,函数也在 DSP281x_SysCtrl.c中;MemCopy(&RamfuncsLoadStart, &RamfuncsLoadEnd, &RamfuncsRunStart运 旬用来将将Flash中的DSP28x_usDelay()函数调入RAM中运行,下面将

13、详解。3.2 闪烁LED的实现本工程的LED接到GPIOF14的管脚上,使用GPIO来控制LED的亮灭。InitGpio()用来初始化GPIO,函数原型在 Gpio.c中:void InitGpio(void)/ Set GPIO A port pins,AL(Bits 7:0)(input)-AH(Bits 15:8) (output) 8bits/ Input Qualifier =0, noneEALLOW;GpioMuxRegs.GPFMUX.bit.XF_GPIOF14 = 0;/将/XPLLDIS 配置为I/OGpioMuxRegs.GPFDIR.bit.GPIOF14 = 1;

14、配置为 output EDIS;其它的语句:DINT;IER = 0x0000;IFR = 0x0000;InitPieCtrl();InitPieVectTable();初始化中断向量表可要可不要,作用从略。GpioDataRegs.GPFTOGGLE.bit.GPIOF14 = 1; gpiof14 输出值翻转语句的作用是将gpiof14的管脚电平取反,达到控制 LED闪烁的目的。3.3 将Flash中的程序DSP28x_usDelay(调入RAM中运行本程序为了实现精确的定时,使用亍一个用汇编编写的延时函数 DSP28x_usDelay(),该函 数在文件DSP281x_usDelay.

15、asm中,细节请阅读该文件。为了调用该函数,在 Main.c中做了如 下声明:extern void DSP28x_usDelay(Uint32 time);该函数的定时仍然不最精确,因此在文件DSP281x_Examples.h中做了如下的宏定义修正:#define DELAY_US(A) DSP28x_usDelay(long double) A * 1000.0L) / (long double)CPU_RATE) - 9.0L) / 5.0L)函数DSP28x_usDelay(Uint32 time)要想非常精确,必须在 SARAM 中运行,因此需要在运 行时将其调入SARAM中。为此

16、,需要做如下工作:首先,在 DSP281x_usDelay.asm 中使用.sect ramfuncs将该段代码定义到段 ramfuncs中,段ramfuncs的位置在编译时指定, 实际上由F2812.cmd 文件中的如下语句来指定:ramfuncs LOAD = FLASHD, PAGE = 0,RUN = RAML0, PAGE = 1,LOAD_START(_RamfuncsLoadStart),LOAD_END(_RamfuncsLoadEnd), RUN_START(_RamfuncsRunStart) 第1行表示该段的装载在 PAGA0的FLASHD中(PAGA0和FLASHD的分

17、段请见F2812.cmd 文件,后文将有详解);第2行表示该段的运行地址在PAGE1的RAML0中(PAGA1和RAML0 的分段请见F2812.cmd文件,后文将有详解);LOAD_ START(_RamfuncsLoadStart)令编译器创建了一个变量 RamfuncsLoadStart,该变量 指向段ramfuncs的装废地址的首地址 (LOAD_ START为编译伪指令,请见CCS的帮助文档);LOAD_ START(_RamfuncsLoadEnd)令编译器创建了一个变量 RamfuncsLoadEnd ,该变量指 向段ramfuncs的装载地址的末地址(LOAD_ END为编译伪

18、指令,请见 CCS的帮助文档);LOAD_ START(_RamfuncsRunStart)令编译器创建了一个变量RamfuncsRunStart,该变量指向段ramfuncs的运行地址的首地址(LOAD_ START为编译伪指令,请见 CCS的帮助文档);从第1和2行可以看出,段ramfuncs中的函数DSP28x_usDelay()的装载地址和运行地址是 不同的,本程序中装载在 Flash的块FLASHD中,而在SARAM L0中运行,这只是目标,实际 运行时DSP并会自动将Flash中的代码拷贝到 SARAM中,因此需要手动添加代码来完成。在 C 函数中,为了使用变量 RamfuncsL

19、oadStart、RamfuncsLoadEnd 和 RamfuncsRunStart, 必须先声明,本工程在文件DSP281x_GlobalPrototypes.h中做了如下声明:extern Uint16 RamfuncsLoadStart;extern Uint16 RamfuncsLoadEnd;extern Uint16 RamfuncsRunStart;然后就可以使用了。在 Main.c中,使用 MemCopy()函数将段ramfuncs中的函数 DSP28x_usDelay()的代码从装载地址 RamfuncsLoadStart RamfuncsLoadEnd 拷贝到 Ramfu

20、ncsRunStart开始的SARAM 空间中。之后在程序运行时,只要调用DSP28x_usDelay()函数,者B会自动地指向 SARAM中相应的函数入口地址,这一点是自动完成的。MemCopy()函数原型在 MemCopy.c 中,在 DSP281x_GlobalPrototypes.h 声明。注意:即使这样,定时仍然可能不濡确,因为可能有中断打断DSP28x_usDelay()的运行,所以在调用之前要关中断。4 如何从Flash启动4.1 F2812 的 BootLoader工作原理要让程序从Flash中启动,必须用到DSP的BootLoader。那么什么是 BootLoader F28

21、12内部有一块ROM称为On-Chip ROM其结构如图所示:Math tables and . ulure upyrad 3kx 16IKx 16(On-ctiip bool ROM日”atldress0X3FF0000x3F F5020x3F F7120X3F F8340x3F F9E80x3F FB500x3 F FC000x3F FFCO0x3F FFFFData pace Prog spaceSin;Cos附4 x 16)Nonnalized inverse(528x16)root(274 x 16)NornvihzoGraph Image绘制出一个漂亮的1.25个正弦波形。从0x3

22、FFC00至I 0x3FFFC0固化的有BootLoader的程序,以及版本号、校验等 信息。详情请参考 TI 的 “TMS320x281x DSP Boot ROM Reference Guide(SPRU095B) ” 。从0X3FFFC0到0x3F FFFF装载的是复位向量和 CPU中断向量。这些向量的映 射在Debug模式下会映射到不同的位置,详情请参考TI的“TMS320x281x DSP Boot ROM Reference Guide (SPRU095B) ” 。那么DSP F2812从上电到启动过程中到底做了哪些工作?1 .上电复位时,上电运行 BootLoader根据MP/M

23、C引脚的状态决定是从片外 的3fffc0处(XINTF Zone7)读取复位向量或者是从片内的 On Chip rom的 3fffc0处读取复位向量。MC方式下从片内读取,MP方式下从片外读取。复位向量位置见文件 F2812.cmd中的PAGE0:RESET : origin = 0x3FFFC0, length = 0x000002 以及:.reset: RESET, PAGE = 0, TYPE = DSECT2 . 一般我们用的是MC方式,即从片内读取复位向量,在片内的rom 3fffc0处有一个向量指向了一个程序InitBoot。实际上该函数就从地址3fffc0开始。 复位后处理器从3

24、fffc0处读取3ffc00这个地址,所以InitBoot程序从3ffc00 处开始执行。3 . 3ffc00处开始的就是initboot过程。首先根据IO管脚的状态判断该进入那 一种引导方式,引导方式有:GPIOF4GPH3F12GPICF3GPIOF2(SCITXDAf(MDXA)(SPISTEA(SPtCLK)PUNo PUNa PUNoPUMada Selected1XXXJump Co:闺售作 0x3F 7FF6Ybu must have programmed a branch inslniction tiere prior to reset to re-dlrM code exec

25、uiian as desired.01XXCa* SPI_Boo( to load from an g金瞰施 的iai SPI EEPROM0Q11Call SCl_E3ocrt to road from SCI-A010Jump HO SARAM 口时晔0 Ux3F fiOCO0001Jump w OTP across 7&000D00Call Paralto(_Boot to had from GP:0 Port B4 .然后根据不同的引导方式来引导程序:在 SCITXA引脚为高电平时就是 flash boot方式。其它的方式还需要用户编写引导代码,详情见 TI的“TMS320x281x

26、DSP Boot ROM Reference Guide (SPRU095B) ” 。5 .然后调用ExitBoot函数,来配置硬件,设置寄存器等的初始值,设置运行 环境等。随后,此时置PC=3F7FF6(内部Flash引导模式时)。因此地址 0x3F7FF6是用户程序的入口,见 F2812.cmd中:BEGIN : origin = 0x3F7FF6, length = 0x000002和codestart : BEGIN PAGE = 06 .在片内flash的3F7FF6和3F7FF7处一般会放有一个跳转指令。本工程中,由一段代码来完成,见文件 DSP281x_CodeStartBran

27、ch.asm作用是先关闭 看门狗,然后跳转到c_int00,即LB _c_int00o更具根据上文,DSP281x_CodeStartBranch.asmm勺代码必须从0x3F7FF6开始,所以程序中 有这么一句:.sect codestart7 .执行这个跳转指令后程序就开始运行 c_int00这个函数了,这个函数在rts 的库中。见CCS的安装目录下的C2000cgtoolslibrts.src。实际上c_int00 执行的是boot.asm,8 .这个函数就是建立一个c程序的运行环境,等建立完c运行环境后c_int00 调用 main 函数,详情见 TI 的 “TMS320x281x D

28、SP Boot ROM Reference Guide (SPRU095B) ”中的BootLoader的源代码。C_int00可以看作是c程 序的Main函数入口。9 . main函数开始就是我们自己编写的应用程序了。实际上,如果想让程序从Flash中启动,只要硬件配置正确,软件上只要将代码 段.text定位到Flash中即可,剩下的全部由编译器自动完成。关键是撰写正确的.cmd 文件。5 CMD文件详解5.1 DSP281x_Headers_nonBIOS.cmd该文件是为做件的各神寄存器映射存储器地址分页和分配空间地址,一般是固 定的,用户无权改动也不必改动,该文件适合在没有使用操作系统

29、 BIOS时使用。使用时不必改动MEMORY PAGE 0:/* Program Memory */PAGE 1:/* Data Memory */DEV_EMU : origin = 0x000880, length = 0x000180PIE_VECT : origin = 0x000D00, length = 0x000100 FLASH_REGS : origin = 0x000A80, length = 0x000060CSM: origin = 0x000AE0, length = 0x000010XINTF: origin = 0x000B20, length = 0x00002

30、0CPU_TIMER0 : origin = 0x000C00, length = 0x000008 reserved for BIOS)*/PIE_CTRL : origin = 0x000CE0, length = 0x000020 ECANA: origin = 0x006000, length = 0x000040ECANA_LAM : origin = 0x006040, length = 0x000040 ECANA_MOTS : origin = 0x006080, length = 0x000040 ECANA_MOTO : origin = 0x0060C0, length

31、= 0x000040 ECANA_MBOX : origin = 0x006100, length = 0x000100 SYSTEM : origin = 0x007010, length = 0x000020 SPIA: origin = 0x007040, length = 0x000010SCIA: origin = 0x007050, length = 0x000010XINTRUPT : origin = 0x007070, length = 0x000010 GPIOMUX : origin = 0x0070C0, length = 0x000020 GPIODAT : orig

32、in = 0x0070E0, length = 0x000020 ADC: origin = 0x007100, length = 0x000020EVA: origin = 0x007400, length = 0x000040EVB: origin = 0x007500, length = 0x000040SCIB: origin = 0x007750, length = 0x000010MCBSPA : origin = 0x007800, length = 0x000040 CSM_PWL : origin = 0x3F7FF8, length = 0x000008 SECTIONS/

33、* device emulation registers */* PIE Vector Table */* FLASH registers */* code security module registers */* external interface registers */* CPU Timer0 registers (CPU Timer1 and Timer2 are/* PIE control registers */* eCAN control and status registers */* eCAN local acceptance masks */* eCAN message

34、 object time stamps */* eCAN object time-out registers */* eCAN mailboxes */* System control registers */* SPI registers */* SCI-A registers */* external interrupt registers */* GPIO mux registers */* GPIO data registers */* ADC registers */* Event Manager A registers */* Event Manager B registers *

35、/* SCI-B registers */* McBSP registers */* Part of FLASHA. CSM password locations. */PieVectTableFile : PIE_VECT, PAGE = 1 /* Peripheral Frame 0 Register Structures */XintfRegsFile: XINTF,PAGE = 1CpuTimer0RegsFile: CPU_TIMER0, PAGE = 1PieCtrlRegsFile: PIE_CTRL,PAGE = 1/* Peripheral Frame 1 Register

36、Structures*/SysCtrlRegsFile: SYSTEM,PAGE = 1SpiaRegsFile: SPIA,PAGE = 1SciaRegsFile: SCIA,PAGE = 1XIntruptRegsFile : XINTRUPT,PAGE = 1GpioMuxRegsFile: GPIOMUX,PAGE = 1GpioDataRegsFile : GPIODATPAGE = 1AdcRegsFile: ADC,PAGE = 1EvaRegsFile: EVA,PAGE = 1EvbRegsFile: EVB,PAGE = 1ScibRegsFile: SCIB,PAGE

37、= 1McbspaRegsFile: MCBSPA,PAGE = 1/* Peripheral Frame 2 Register Structures*/ECanaRegsFile: ECANA,PAGE = 1: FLASH_REGS, PAGE = 1: CSM,PAGE = 1FlashRegsFile CsmRegsFilePAGE = 1PAGE = 1PAGE = 1PAGE = 1ECanaLAMRegsFile : ECANA_LAM ECanaMboxesFile : ECANA_MBOX ECanaMOTSRegsFile : ECANA_MOTS ECanaMOTOReg

38、sFile : ECANA_MOTO /* Code Security Module Register Structures */CsmPwlFile : CSM_PWL,PAGE = 15.2 F2812.cmdPAGE 0:/* Program Memory */* Memory (RAM/FLASH/OTP) blocks can be moved to PAGE1 for data allocation */ZONE0 ZONE1RAML0 ZONE2 ZONE6OTP FLASHJ FLASHI FLASHH FLASHG FLASHF FLASHE FLASHD FLASHC FL

39、ASHA CSM_RSVD:origin=0x002000,length= 0x002000/* XINTF zone 0*/:origin=0x004000,length= 0x002000/* XINTF zone 1*/:origin = 0x008000, length = 0x001000/* on-chip RAM block L0 */:origin=0x080000,length= 0x080000/* XINTF zone 2*/:origin=0x100000,length= 0x080000/* XINTF zone 6*/:origin = 0x3D7800, leng

40、th = 0x000800/* on-chip OTP */:origin = 0x3D8000, length = 0x002000/* on-chip FLASH */:origin = 0x3DA000, length = 0x002000/* on-chip FLASH */:origin = 0x3DC000, length = 0x004000/* on-chip FLASH */:origin =0x3E0000, length = 0x004000/* on-chip FLASH*/:origin =0x3E4000, length = 0x004000/* on-chip F

41、LASH*/:origin =0x3E8000, length = 0x004000/* on-chip FLASH*/:origin =0x3EC000, length = 0x004000/* on-chip FLASH*/:origin =0x3F0000, length = 0x004000/* on-chip FLASH*/:origin =0x3F6000, length = 0x001F80/* on-chip FLASH*/:origin = 0x3F7F80, length = 0x000076/* Part of FLASHA. Program with all 0x000

42、0when CSM is in use. */BEGIN:origin = 0x3F7FF6, length = 0x000002/* Part of FLASHA. Used for boot to Flashbootloader mode.On this mode,when boot is filished,it turns to address 0x3F7FF6 to run */CSM_PWL:origin = 0x3F7FF8, length = 0x000008/* Part of FLASHA. CSM password locations inFLASHA */* ZONE7

43、ROM RESET zone 7 (MP/MCn=1) */ VECTORS zone 7 (MP/MCn=1) */:origin = 0x3FC000, length = 0x003FC0/* XINTF zone 7 available if MP/MCn=1 */:origin = 0x3FF000, length = 0x000FC0/* Boot ROM available if MP/MCn=0 */:origin = 0x3FFFC0, length = 0x000002/* part of boot ROM (MP/MCn=0) or XINTF:origin = 0x3FF

44、FC2, length = 0x00003E/* part of boot ROM (MP/MCn=0) or XINTFPAGE 1 :/* Data Memory */* Memory (RAM/FLASH/OTP) blocks can be moved to PAGE0 for program allocation */* Registers remain on PAGE1*/RAMM0RAMM1RAML0RAML1FLASHBRAMH0:origin = 0x000000, length = 0x000400/* on-chip RAM block M0 */:origin = 0x

45、000400, length = 0x000400/* on-chip RAM block M1 */:origin = 0x008000, length = 0x001000/* on-chip SARAM block L0*/:origin = 0x009000, length = 0x001000/* on-chip SARAM block L1*/:origin = 0x3F4000, length = 0x002000/* on-chip FLASH */:origin = 0x3F8000, length = 0x002000/* on-chip RAM block H0 */*

46、Allocate sections to memory blocks.Note:codestart user defined section in DSP28_CodeStartBranch.asm used to redirect code execution when booting to flashramfuncs user defined section to store functions that will be copied from Flash into RAM*/SECTIONS/* Allocate program areas: */.cinit .pinit.text codestart ramfuncs: FLASHAPAGE = 0: FLASHA,PAGE =0: FLASHAPAGE = 0: BEGINPAGE =0:LOAD = FLASHD, PAGE = 0, RUN = RAML0, PAGE = 1, LOAD_START(_RamfuncsLoadStart), LOAD_END(_RamfuncsLoadEnd), RUN_START(_Ramfuncs

温馨提示

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

评论

0/150

提交评论