南京大学ARM9处理器C语言编程616章.ppt_第1页
南京大学ARM9处理器C语言编程616章.ppt_第2页
南京大学ARM9处理器C语言编程616章.ppt_第3页
南京大学ARM9处理器C语言编程616章.ppt_第4页
南京大学ARM9处理器C语言编程616章.ppt_第5页
已阅读5页,还剩451页未读 继续免费阅读

下载本文档

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

文档简介

第六章 S3C2410的串口UART及编程,6.1 S3C2410的串口UART概述 6.1.1 S3C2410异步串行通信(UART)单元 S3C2410 UART单元提供3个独立的异步串行通信接口,皆可工作于查询、中断和DMA模式。使用系统时钟最高波特率达230. 4 kb/s,如果使用外部设备提供的时钟,可以达到更高的速率。每一个UART单元包含一个16字节的FIFO(First Input First Output,先进先出移位寄存器),用于数据的接收和发送。 S3C2410 UART支持可编程波特率、红外发送/接收( UART2 )、1个或2个停止位、5位/6位/7位/8位数据宽度和奇偶校验。,6.1.2 波特率的产生 波特率由一个专用的UART波特率分频寄存器(UBRDIVn)控制,UBRDIVn值计算公 如下: UBRDIVn=(int)ULK/(波特率 16)1 或者 UBRDIVn=(int) PLK/(波特率 16)1 式中:时钟选用ULK还是PLK由UART控制寄存器UCONn10的状态决定。如果UCONn10=0,则用PLK作为波特率发生器的时钟源频率;否则选用ULK作为波特率发生器的时钟源频率。UBRDIVn的值必须在1(2161)之间。 例如:若ULK或者PLK等于40 MHz,当波特率为115200 b/s时,则 UBRDIVn=(int)40 000 000/(115 200 16)一1=int(21. 7)1= 211=20,6.1.3 UART通信操作 下面简略介绍UART操作,关于数据发送、数据接收、中断产生、波特率产生、查询检测模式、红外模式的详细介绍,参见下面6.3节。 发送数据帧是可编程的。一个数据帧包含1个起始位、58个数据位、1个可选的奇偶校验位和12位停止位,停止位通过行控制寄存器ULCONn配置。 与发送数据帧类似,接收数据帧也是可编程的。接收帧由1个起始位、58个数据位、l个可选的奇偶校验位以及12位行控制寄存器ULCONn中设定的停止位组成。接收器还可以检测溢出错、奇偶校验错、帧错误和传输中断,每一个错误均可以设置一个错误标志。, 溢出错误(overrun error):指已接收到的数据在读取之前被新接收的数据覆盖; 奇偶校验错:指接收器检测到的校验和与设置的不符; 帧错误:指没有接收到有效的停止位; 传输中断:表示接收数据RxDn保持逻辑0超过一帧的传输时间。 在FIFO模式下,如果RxFIFO非空,而在3个字的传输时间内没有接受到数据,则产生超时。,6.2 UART的控制寄存器 6.2.1 UART行控制寄存器ULCONn 该寄存器的位6决定是否使用红外模式,位5、位4和位3决定校验方式,位2决定停止位长度,位1和位0决定每帧的数据位数。具体如下: ULCONn7 保留; ULCONn6 红外线模式,0:正常模式;1:红外线模式; ULCONn5:3 校验模式,0xx:无校验;100:奇校验;101:偶校验; ULCONn2 停止位,0:一个停止位;1:二个停止位; ULCONn1:0 数据位,00:5位;01:6位;10:7位;11:8位。,6.2.2 UART控制寄存器UCONn 该寄存器决定UART的各种模式。 UCONn10 1:ULK做波特率发生器;0:PLK做波特率发生器。 UCONn9 1:Tx中断电平触发;0:Tx中断脉冲触发。 UCONn8 1:Rx中断电平触发;0:Rx中断脉冲触发。 UCONn7 1:接收超时中断允许;0:接收超时中断禁止。 UCONn6 1:产生接收错误中断;0:不产生接收错误中断。 UCONn5 l:发送直接传给接收方式(loopback);0:正常模式。 UCONn4 1:发送间断信号;0:正常模式发送。,UCONn3:2 发送模式选择: 00:禁止发送; 01:中断或查询模式; 10:DMA0请求(UART0 ) , DMA3请求(UART2); 11:DMAl请求(UART1)。 UCONn1:0 接收模式选择。 00:禁止接收; 01:中断或查询模式; 10 : DMA0请求UART0,DMA2请求UART2; 11:DMAl请求UART1。,6.2.3 UART FIFO控制寄存器UFCONn UFCONn7:6 00:Tx FIFO寄存器中有0字节就触发中断; 01:Tx FIFO寄存器中有4字节就触发中断; 10:Tx FIFO寄存器中有8字节就触发中断; 11:Tx FIFO寄存器中有12字节就触发中断。 UFCONn5:4 00:Rx FIFO寄存器中有4字节就触发中断; 01:Rx FIFO寄存器中有8字节就触发中断; 10:Rx FIFO寄存器中有12字节就触发中断; 11:Rx FIFO寄存器中有16字节就触发中断。,UFCONn3 保留。 UFCONn2 1: FIFO复位清零Tx FIFO;0 : FIFO复位不清零TxFIFO。 UFCONn1 1: FIFO复位清零Rx FIFO;0:F1FO复位不清零RxFIFO。 UFCONn0 1:允许FIFO功能;0:禁止FIFO功能。,6.2.4 UART MODEM控制寄存器UMCONn UMCONn7:5 保留,必须全为0。 UMCONn4 1:允许使用AFC模式;0:禁止使用AFC模式。 UMCONn3 保留,必须全为0。 UMCONn0 1:激活rRTS;0:不激活rRTS。 6.2.5 发送寄存器UTXH和接收寄存器URXH 这两个寄存器存放发送和接收的数据,当然只有1字节(8位数据)。需要注意的是,在发生溢出错误时,接收的数据必须被读出来,否则会引发下次溢出错误。,6.2.6 发送和接收状态寄存器UTRSTATn UTRSTATn发送和接收状态寄存器包括 UTRSTAT0, UTRSTAT1 and UTRSTAT2 UTRSTATn 寄存器各位定义: UTRSTATn 1 发送缓冲器空标志 0 =不空; 1 = 空。 UTRSTATn 0 接收缓冲器有接收数据标志 0 =空; 1 = 接收缓冲器有数据。 6.2.7 波特率分频寄存器UBRDIV 波特率分频寄存器UBRDIV的定义和使用在6.1.2中已叙述,不再重复。 6.2.8 UART单元各寄存器的定义 在随书提供的软件包2410test中,在2410addr.h文件中有关于UART单元各寄存器的定义。,/UART #define rULCON0 ( * (volatile unsigned * )0x50000000)/UART 0 Line control #define rUCON0 ( * (volatile unsigned * )0x50000004)/UART 0 control #define rUFCON0 ( * (volatile unsigned * )0x50000008)/UART 0 FIFO control #define rUMCON0 ( * (volatile unsigned * )0x5000000c)/UART 0 Modem control #define rUTRSTAT0 ( * (volatile unsigned * )0x50000010)/UART 0 Tx/Rx status #define rUERSTAT0 ( * (volatile unsigned * )0x50000014)/UART 0 Rx error status #define rUFSTAT0 ( * (volatile unsigned * )0x50000018)/UART 0 FIFO status,#define rUMSTAT0 ( * (volatile unsigned * )0x5000001c)/UART 0 Modem status #define rUBRDIV0 ( * (volatile unsigned * )0x50000028)/UART 0 Baud rate diviaor #define rULCON1 ( * (volatile unsigned * )0x50004000)/UART 1 Line control #define rUCON1 ( * (volatile unsigned * )0x50004004)/UART 1 Control #define rUFCON1 ( * (volatile unsigned * )0x50004008)/UART 1 FIFO control #define rUMCON1 ( * (volatile unsigned * )0x5000400c)/UART 1 Modem control #define rUTRSTAT1 ( * (volatile unsigned * )0x50004010)/UART 1 Tx/Rx status,#define rUERSTAT1 ( * (volatile unsigned * )0x50004014)/UART 1 Rx error status #define rUFSTAT1 ( * (volatile unsigned * )0x50004018)/UART 1 FIFO status #define rUMSTAT1 ( * (volatile unsigned * )0x5000401c)/UART 1 Modem status #define rUBRDIV1 ( * (volatile unsigned * )0x50004028)/UART 1 Baud rate divisor #define rULCON2 ( * (volatile unsigned * )0x50008000)/UART 2 Line control #define rUCON2 ( * (volatile unsigned * )0x50008004)/UART 2 Control #define rUFCON2( * (volatile unsigned * )0x50008008)/UART 2 FIFO control,#define rUMCON2 ( * (volatile unsigned * )0x5000800c)/UART 2 Modem control #define rUTRSTAT2 ( * (volatile unsigned * )0x50008010)/UART 2 Tx/Rx status #define rUERSTAT2 ( * (volatile unsigned * )0x50008014)/UART 2 Rx error status #define rUFSTAT2 ( * (volatile unsigned * )0x50008018)/UART 2 FIFO status #define rUMSTAT2 ( * (volatile unsigned * )0x5000801c)/UART 2 Modem status #define rUBRDIV2 ( * (volatile unsigned * )0x50008028)/UART 2 Baud rate divisor #ifdef_BIG_ENDIAN,#define rUTXH0 ( * (volatile unsigned char * )0x50000023)/UART 0 Transmission Hold #define rURXH0 ( * (volatile unsigned char * )0x50000027)/UART 0 Receive buffer #define rUTXH1 ( * (volatile unsigned char * )0x50004023)/UART 1 Transmission Hold #define rURXH1 ( * (volatile unsigned char * )0x50004027)/UART 1 Receive buffer #define rUTXH2 ( * (volatile unsigned char * )0x50008023)/UART 2 Transmission Hold,#define rURXH2 ( * (volatile unsigned char * )0x50008027)/UART 2 Receive buffer #define WrUTXH0(ch) ( * (volatile unsigned char * )0x50000023)=(unsigned char)(ch) #define RdURXH0() ( * (volatile unsigned char * )0x50000027) #define WrUTXH1(ch) ( * (volatile unsigned char * )0x50004023)=(unsigned char)(ch) #define RdURXH1() ( * (volatile unsigned char * )0x50004027) #define WrUTXH20(ch) ( * (volatile unsigned char * )0x50008023)=(unsigned char)(ch) #define RdURXH2() ( * (volatile unsigned char * )0x50008027) #difine UTXH0 (0x50000020+3) /Byte_access address by DMA #define URXH0 (0x50000024+3) #difine UTXH1 (0x50004020+3),#define URXH1 (0x50004024+3) #difine UTXH2 (0x50008020+3 ) #define URXH2 (0x50008024+3) #else/Little Endian #define rUTXH0 ( * (volatile unsigned char * )0x50000020)/UART 0 Transmission Hold #define rURXH0 ( * (volatile unsigned char * )0x50000024)/UART 0 Receive buffer #define rUTXH1 ( * (volatile unsigned char * )0x50004020)/UART 1 Transmission Hold #define rURXH1 ( * (volatile unsigned char * )0x50004024)/UART 1 Receive buffer #define rUTXH2 ( * (volatile unsigned char * )0x50000820)/UART 2 Transmission Hold,#define rURXH2 ( * (volatile unsigned char * )0x50008024)/UART 2 Receive buffer #define WrUTXH0(ch) ( * (volatile unsigned char * )0x50000020)=(unsigned char)(ch) #define RdURXH0() ( * (volatile unsigned char * )0x50000024) #define WrUTXH1(ch) ( * (volatile unsigned char * )0x50004020)=(unsigned char)(ch) #define RdURXH1() ( * (volatile unsigned char * )0x50004024) #define WrUTXH2(ch) ( * (volatile unsigned char * )0x50008020)=(unsigned char)(ch) #define RdURXH2() ( * (volatile unsigned char * )0x50008024) #difine UTXH0 (0x50000020+3) /Byte_access address by DMA,#define URXH0 (0x50000024+3) #difine UTXH1 (0x50004020+3) #define URXH1 (0x50004024+3) #difine UTXH2 (0x50008020+3 ) #define URXH2 (0x50008024+3) #endif,6.3 UART通信程序编写 6.3.1 通信程序编写步骤 UART通信程序可以采用查询、中断和DMA模式。我们通过使用较多的中断方式来介UART通信程序的编写。简单做法是,UART通信程序的编写参照例子程序。 选通道,通过函数Uart_Select();选UART0UART2; 选波特率和波特率发生器时钟,选波特率通过函数Uart_Pclk_En(int ch, int baud)或Uart_Pclk_En(int ch, int baud)来进行。时钟选UCLK ,rUCON0|=0x400;时钟选PCLK ,rUCON0, 通信控制字(rUCON0)设定,如时钟选ULK做波特率发生器;Tx中断脉冲触发,Rx中断脉冲触发;接收超时中断允许;产生接收错误中断;正常模式发送: rUCON0|= (TX_INTTYPE9)|(RX_INTTYPE8)|(07)|(06)|(05)|(04)|(12)|(1); I/O口初始化,因为UART通信使用H口的第二功能,所以H口要上拉禁止:rGPHUP|=0x1ff。H口控制寄存器nRTS1,nCTS1功能使能,rGPHCON&=0x3c0000,rGPHCON|=0x2faaa; 设中断服务函数入口地址,把中断服务函数入口地址赋函数指针PISR_UARTn, 注意,接收中断服务函数入口地址和发送中断服务函数入口地址是一个,在中断服务函数中根据 UTRSTATn 1和UTRSTATn 0状态决定是发送中断还是接收中断。, 打开总中断屏蔽和子中断屏蔽等待中断: rINTMSK=(BIT_UART0); rINTSUBMSK=(BIT_SUB_TXD0); 进入中断后,先屏蔽发送和接收中断,防止新来中断干扰我们的正常发送和接收,正常发送和接收结束后,清中断挂起和中断源挂起寄存器:ClearPending(BIT_UART0),rSUBSRCPND=(BIT_SUB_TXD0(发送),rSUBSRCPND=(BIT_SUB_RXD0|BIT_SUB_ERR0)(接收); 取消中断屏蔽,等下一次中断。 6.3.2 通信程序编写示例 下面给出的几个函数,是查询方式URAT通信常用到的主要函数,包括URAT初始化,字符的发送、接收函数,希望大家仔细阅读,理解每一行的含义。,1, UART 通信,采用查询方式: /引用头文件 #include “2410addr.h“ #include “2410lib.h“ #include “option.h“ #include “def.h“ #include #include #include #include #include ,/函数声明 void Uart_Init(int pclk,int baud); char Uart_Getch(void); char Uart_GetKey(void); void Uart_GetString(char *string); void Uart_SendByte(int data); void Uart_SendString(char *pt); void Uart_Select(int ch); /- / 串口初始化,输入PCLK,输入波特率 /-,static int whichUart=0; void Uart_Init(int pclk,int baud) int i; if(pclk = 0) pclk = PCLK; rUFCON0 = 0x0; /UART channel 0 FIFO control register, FIFO disable rUFCON1 = 0x0; /UART channel 1 FIFO control register, FIFO disable rUFCON2 = 0x0; /UART channel 2 FIFO control register, FIFO disable rUMCON0 = 0x0; /UART chaneel 0 MODEM control register, AFC disable rUMCON1 = 0x0; /UART chaneel 1 MODEM control register, AFC disable,/UART0 rULCON0 = 0x3; /Line control register : Normal,No parity,1 stop,8 bits. / 0 0 0 0 0 0 1 1 rUCON0 = 0x245; / Control register / 10 9 8 7 6 5 4 3:2 1:0 / Clock Sel, Tx Int, Rx Int, Rx Time Out, Rx err, Loop-back, Send break, Transmit Mode, Receive Mode 0 1 0 0 1 0 0 0 1 0 1 / PCLK ,Level Pulse Disable Generate Normal Normal Interrupt or Polling / rUBRDIV0=( (int)(pclk/16./baud) -1 ); /Baud rate divisior register 0 rUBRDIV0=( (int)(pclk/16./baud+0.5) -1 ); /Baud rate divisior register 0,/UART1 rULCON1 = 0x3; rUCON1 = 0x245; rUBRDIV1=( (int)(pclk/16./baud) -1 ); /UART2 rULCON2 = 0x3; rUCON2 = 0x245; rUBRDIV2=( (int)(pclk/16./baud) -1 ); for(i=0;i100;i+); /- / 选择串口通道 /- void Uart_Select(int ch) whichUart = ch; ,/- / 等待发送移位寄存器空 /- void Uart_TxEmpty(int ch) if(ch=0) while(!(rUTRSTAT0 /Wait until tx shifter is empty. ,/- / 接收串口一字节数据,注意 RdURXH0(),RdURXH1(),RdURXH2() 的使用 /- char Uart_Getch(void) if(whichUart=0) while(!(rUTRSTAT0 ,else if(whichUart=2) while(!(rUTRSTAT2 ,else if(whichUart=1) if(rUTRSTAT1 ,/- / 串口得到字符串 /- void Uart_GetString(char *string) char *string2 = string; char c; while(c = Uart_Getch()!=r) if(c=b) if( (int)string2 (int)string ) Uart_Printf(“b b“); string-; ,else *string+ = c; Uart_SendByte(c); *string=0; Uart_SendByte(n); ,/- / 得到串口初始号 /- int Uart_GetIntNum(void) char str30; char *string = str; int base = 10; int minus = 0; int result = 0; int lastIndex; int i; Uart_GetString(string);,if(string0=-) minus = 1; string+; if(string0=0 ,if(stringlastIndex=h | stringlastIndex=H ) base = 16; stringlastIndex = 0; lastIndex-; if(base=10) result = atoi(string); result = minus ? (-1*result):result; ,else for(i=0;i=lastIndex;i+) if(isalpha(stringi) if(isupper(stringi) result = (result4) + stringi - A + 10; else result = (result4) + stringi - a + 10; ,else result = (result4) + stringi - 0; result = minus ? (-1*result):result; return result; /- / 串口发送字节 /- void Uart_SendByte(int data) if(whichUart=0), if(data=n) while(!(rUTRSTAT0 else if(whichUart=1) if(data=n), while(!(rUTRSTAT1 else if(whichUart=2) if(data=n), while(!(rUTRSTAT2 ,/- / 串口发送字符串 /- void Uart_SendString(char *pt) while(*pt) Uart_SendByte(*pt+); 2,UART0 中断方式发送和接收 /- / UART0中断方式发送和接收 /-,void Test_Uart0_Int(void) Uart_Port_Set(); Uart_Select(0); /* UART0 Tx test with interrupt */ isTxInt=1; uart0TxStr=“ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890-UART0 Tx interrupt test is good!rn“; Uart_Printf(“Uart channel 0 Tx Interrupt Testn“);,pISR_UART0=(unsigned)Uart0_TxInt; rULCON0=(0 UCLK fuction rUCON0|= (TX_INTTYPE9)|(RX_INTTYPE8)|(07)|(06)|(05)|(04)|(12)|(1); /Clock,Tx:Def,Rx:Def,Rx timeout:x,Rxerror int:x,Loop-back:x,Send break:x,Tx:int,Rx:int Uart_TxEmpty(0); /wait until tx buffer is empty. rINTMSK=(BIT_UART0); rINTSUBMSK=(BIT_SUB_TXD0); while(isTxInt);,/* UART0 Rx test with interrupt */ isRxInt=1; uart0RxStr=(char *)UARTBUFFER; Uart_Printf(“nUart channel 0 Rx Interrupt Test:n“); Uart_Printf(“After typing ENTER key, you will see the characters which was typed by you.“);,Uart_Printf(“nTo quit, press ENTER key.!n“); Uart_TxEmpty(0); /wait until tx buffer is empty. pISR_UART0 =(unsigned)Uart0_RxIntOrErr; rULCON0=(0 UCLK fuction rUCON0|= (TX_INTTYPE9)|(RX_INTTYPE8)|(07)|(16)|(05)|(04)|(12)|(1); /Clock,Tx:pulse,Rx:pulse,Rx:timeout:x,Rx,errorint:o,Loop-back:x,Sendbreak:x,Tx:int,Rx:int / Clear Int Pending and Unmask ClearPending(BIT_UART0); rINTMSK=(BIT_UART0);,rSUBSRCPND=(BIT_SUB_TXD0|BIT_SUB_RXD0|BIT_SUB_ERR0); rINTSUBMSK=(BIT_SUB_RXD0|BIT_SUB_ERR0); while(isRxInt); rINTSUBMSK|=(BIT_SUB_RXD0|BIT_SUB_ERR0); rINTMSK|=(BIT_UART0); Uart_Printf(“%sn“,(char *)UARTBUFFER); Uart_Port_Return(); /- /UART发送和接收用到的I/O口保存和初始化 /-,void Uart_Port_Set(void) /Push UART GPIO port configuration save_rGPHCON=rGPHCON; save_rGPHDAT=rGPHDAT; save_rGPHUP=rGPHUP; /Configure UART port rGPHCON /SUBINT ALL MASK /Push Uart control registers,save_ULCON0=rULCON0; save_UCON0=rUCON0; save_UFCON0=rUFCON0; save_UMCON0=rUMCON0; save_ULCON1=rULCON1; save_UCON1 =rUCON1; save_UFCON1=rUFCON1; save_UMCON1=rUMCON1; save_ULCON2=rULCON2; save_UCON2 =rUCON2; save_UFCON2=rUFCON2; save_UMCON2=rUMCON2; /Initialize UART1,2 port ,/- / UART发送和接收结束,用到的I/O口恢复原来状态 /- void Uart_Port_Return(void) /Pop UART GPIO port configuration rGPHCON=save_rGPHCON; rGPHDAT=save_rGPHDAT; rGPHUP=save_rGPHUP; /Pop Uart control registers rULCON0=save_ULCON0; rUCON0 =save_UCON0; rUFCON0=save_UFCON0; rUMCON0=save_UMCON0; rULCON1=save_ULCON1; rUCON1 =save_UCON1;,rUFCON1=save_UFCON1; rUMCON1=save_UMCON1; rULCON2=save_ULCON2; rUCON2 =save_UCON2; rUFCON2=save_UFCON2; rUMCON2=save_UMCON2; /- / UART发送和接收使用UCLK,并计算rUBRDIV0和设定波特率 /-,void Uart_Uclk_En(int ch,int baud) /* int ch, baud; Uart_Printf(“nSelect UART channel0:UART0/1:UART1/2:UART2:n“); ch=Uart_GetIntNum(); Uart_Printf(“nSelect baud rate :n“); baud=Uart_GetIntNum(); */ if(ch = 0) Uart_Select(0); rUCON0|=0x400; / Select UCLK rUBRDIV0=( (int)(UCLK/16./baud) -1 ); /Baud rate divisior register Uart_Printf(“UCLK is enabled by UART0.n“); ,else if(ch=1) Uart_Select(1); rUCON1|=0x400; / Select UCLK rUBRDIV1=( (int)(UCLK/16./baud) -1 ); /Baud rate divisior register Uart_Select(0); Uart_Printf(“UCLK is enabled by UART1.n“); else Uart_Select(2); rUCON2|=0x400; / Select UCLK rUBRDIV2=( (int)(UCLK/16./baud) -1 ); /Baud rate divisior register Uart_Select(0); Uart_Printf(“UCLK is enabled by UART2.n“); /for(i=0;i100;i+); / For the satble operation ,/- / UART发送和接收使用PCLK,并计算rUBRDIV0和设定波特率 /- void Uart_Pclk_En(int ch, int baud) /* int ch, baud; Uart_Printf(“nSelect UART channel0:UART0/1:UART1/2:UART2:n“); ch=Uart_GetIntNum(); Uart_Printf(“nSelect baud rate :n“); baud=Uart_GetIntNum(); */ if(ch = 0) Uart_Select(0); rUCON0 ,else if(ch=1) Uart_Select(1); rUCON1|=0x3ff; / Select PCLK rUBRDIV1=( (int)(PCLK/16./baud) -1 ); /Baud rate divisior register Uart_Select(0); Uart_Printf(“PCLK is enabled by UART1.n“); else Uart_Select(2); rUCON2|=0x3ff; / Select PCLK rUBRDIV2=( (int)(PCLK/16./baud) -1 ); /Baud rate divisior register Uart_Select(0); Uart_Printf(“PCLK is enabled by UART2.n“); /for(i=0;i100;i+); / For the satble operation ,/- / UART0发送中断服务程序 /- void _irq Uart0_TxInt(void) rINTSUBMSK|=(BIT_SUB_RXD0|BIT_SUB_TXD0|BIT_SUB_ERR0); / Just for the safety if(*uart0TxStr != 0) WrUTXH0(*uart0TxStr+); ClearPending(BIT_UART0); / Clear

温馨提示

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

评论

0/150

提交评论