STM32 波形采集、存储与回放.doc_第1页
STM32 波形采集、存储与回放.doc_第2页
STM32 波形采集、存储与回放.doc_第3页
STM32 波形采集、存储与回放.doc_第4页
STM32 波形采集、存储与回放.doc_第5页
已阅读5页,还剩20页未读 继续免费阅读

下载本文档

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

文档简介

波形采集、存储与回放系统设计摘要 本设计是基于数字示波器的原理,以STM32-cortex-m3作为控制芯片,把波形采集分为A、B两个通道,对A通道的输入信号进行衰减,对B通道的输入信号进行放大,然后采用内部集成的高速AD对信号进行实时采样,方式为上升沿内触发,可以实现波形的单次和多次触发存储和回放显示,以及频率、周期、峰-峰值的测量和显示,并具有掉电存储功能。由信号采集、数据处理、波形显示,控制面板等功能模块组成,整个系统分成A/D转换部分、D/A转换部分、波形存储部分、键盘输入控制四大部分,系统操作简便,输出波形可以在示波器输出显示,此存储示波器即具有一般示波器实时采样实时显示的功能,又可以对某段波形进行即时存储和连续回放显示,且界面友好,达到了较好的性能指标。具体设计原理以及过程在下面章节中详细说明。 关键字:STM32、波形采集、波形存储、波形回放AbstractThe design is based on the principle of digital oscilloscope, with STM32-cortex-m3 as the control chip, the waveform acquisition is divided into A, B two channel, the A channel input signal attenuation on B channel, the input signal is amplified, then using the internal integration of high-speed AD on real time data sampling, as rising edge trigger, can achieve waveform of single and multiple triggers the storage and playback and display, frequency, cycle, peak to peak value measurement and display, and power failure memory function. The signal acquisition, data processing, waveform display, the control panel and other functional modules, the system is divided into A/D transformation, D/A converting part, waveform storage, keyboard input control system four parts, simple operation, the output waveform can be output in the oscilloscope display, this storage oscilloscope namely has the common oscilloscope real-time sampling real time display function, can be a real-time storage and continuous playback waveform display, and friendly interface, has achieved good performance. The design principle and process are described in detail in the following sections.Keywords: STM32, waveform acquisition, storage, waveform waveform playback模拟路灯控制系统设计目 录一、总体方案思路及其设计41.1、采样方式41.2、双踪示波器显示方式51.3、控制部分方案的设计51.4、显示方式5二 、系统理论分析与功能模块设计52.1 、最小系统及A/D,D/A电路52. 2、 单元电路6三、软件设计103.1、软件流程103.2:软件子程序11四、测试方案与测试结果12五、结束语14附件1:系统程序14一、总体方案思路及其设计1、根据题目要求进行相关指标分析根据题目要求A通道只是对单极性(高电平为4V,低电平为0V,频率为1KHZ)的信号进行采集、存储和连续回放;B通道需要对双极性(电压峰峰值为 100mV、频率为 10Hz10kHz)的信号进行处理。对信号的采集要通过前置电路接到AD转换器,把方波、正弦波和三角波的大小和周期转化成数字量让STM32-cortex-m3单片机进行处理。对数据的存储和连续回放由单片机的内部程序来实现。2、方案比较与分析1.1、采样方式方案一:实时采样。实时采样是在信号存在期间对其采样。根据采样定理,采用速率必须高于信号最高频率分量的两倍。对于周期的正弦信号,一个周期内应该大于两个采样点。为了不失真的恢复原被测信号,通常一个周期内就需要采样八个点以上。由于实时采样对波形逐点进行采集,可以实时显示输入信号的波形因此适合任何形式的信号波形,重复或者不重复的,单次的或者连续的。由于所采集的信息是按时间顺序的,因而易于实现波形的显示功能。方案二:等效时间采样法。采用中高速模数转换器,对于频率较高的周期性信号采用等效时间采样的方法,即对每个周期仅采样一个点,经过若干个周期后就可对信号各个部分采样一遍。而这些点可以借助步进延迟方法均匀地分布于信号波形的不同位置。其中步进延迟是每一次采样比上一次样点的位置延迟t时间。只要精确控制从触发获得采样的时间延迟,就能够准确地恢复出原始信号。等效采样可以实现很高的数字化转换速率。其基本原理就是通过多次触发,多次采样而获得并重建信号波形。前提是信号必须是重复的。等效采样通过多次采样,把在信号的不同周期中采样得到的数据进行重组,从而能够重建原始的信号波形。等效时间采样虽然可以对很高频率的信号进行采样,可是步进延迟的采样技术与电路较为复杂。再者,它只限于处理周期信号,而且对单次触发采样无能为力。实时采样可以实现整个频段的全速采样,因此本设计采用方案一。1.2、双踪示波器显示方式方案一:每个通道都有一套独立的ADC和存储器,双踪显示时,只需轮流选择不同通道的波形数据,就可以实现两路波形的同时显示。方案二:只使用一片ADC,一片存储器和一片DAC,在采样的时候,用存储器地址的最低位控制模拟开关。通过切换两路模拟信号,将采集到的数据分别存储到存储器的奇地址和偶地址上,双踪显示时通过扫描存储器中的数据即可将两路波形同时显示出来。方案二使用的硬件电路较少,故我们选择方案二。1.3、控制部分方案的设计方案一、单片机STM32Cortex-M3完成对其他各部分控制。方案二、采用单片机STC90C51作为控制部分。方案论证:方案一STM32Cortex-M3是一种高速/低功耗/性价比高的单片机可完成对其他各部分的控制。内部具有强大的存储空间且能够实现各种复杂的控制功能。方案二STC90C51的功耗比较大,数据传输速率比较低,要实现比较复杂的控制功能较困难。故本设计采用STM32Cortex-M3单片机。 1.4、显示方式方案一、采用传统数码管作为显示。方案二、采用液晶屏作显示。方案论证:方案一采用数码管显示虽然控制简单,亮度大,价格便宜。缺点是功耗较大,显示不清晰,操作不方便。方案二液晶显示器则具有耗电少、配置简单灵活、安装方便、耐振动、使用寿命长、美观等优点。同时可以显示菜单等复杂的界面,更易于操作。本设计系统采用LCD显示器。二 、系统理论分析与功能模块设计2.1 、最小系统及A/D,D/A电路图1 2. 2、 单元电路1)数据存储电路 图 32)按键电路图43)电压比较器电路图53、12864显示五、结束语经过四天三夜的辛勤努力,本设计实现了题目的全部要求。但由于时间紧,任务重,系统还存在许多可以改进的地方,比如电路布局、抗干扰性等方面还有很大的提升空间,经过改进,相信性能还会有进一步的提升。本次竞赛极大的锻炼了我们各方面的能力,虽然我们遇到了很多困难和障碍,但总体上成功与挫折交替,困难与希望并存,我们将继续努力争取更大的进步。参考文献1 周航慈.单片机应用程序设计技术.北京航空航天大学出版社2 胡汉才.单片机原理及其接口技术.清华大学出版社3 康华光.电子技术基础(数字部分).高等教育出版社,2001附件1:系统程序1602.c文件#include1602.h#include delay.h #include stm32f10x_it.h #define LCD_RS1 GPIO_SetBits(GPIOE,GPIO_Pin_3) / 指令数据选择 #define LCD_RS0 GPIO_ResetBits(GPIOE,GPIO_Pin_3) #define LCD_RW1 GPIO_SetBits(GPIOE,GPIO_Pin_4) / #define LCD_RW0 GPIO_ResetBits(GPIOE,GPIO_Pin_4) #define LCD_EN1 GPIO_SetBits(GPIOE,GPIO_Pin_2) / #define LCD_EN0 GPIO_ResetBits(GPIOE,GPIO_Pin_2) void write_code(u16 a) LCD_RS0; /写指令 LCD_RW0; /写 LCD_EN0; GPIOE-BSRR =(aBRR = (aBSRR =(aBSRR低16位的某位为1,则对应的I/O端口置1;而置GPIOD-BSRR低16位的某位为0,则对应的I/O端口不变。 GPIOE-BRR =(aBRR低16位的某位为1,则对应的I/O端口置0;而置GPIOD-BRR低16位的某位为0,则对应的I/O端口不变。 delay_ms(5); LCD_EN1;/送入1602 delay_ms(5); LCD_EN0; void init_1602(void) write_code(0x01);/清平 write_code(0x06);/写一个字后指针加以,整平不移动 write_code(0x0c);/ 光标打开,显示打开 write_code(0x38);/八位数据接口 两行显示 5X7 点阵 write_code(0x80+0x00); DAC.c文件#include stm32f10x.h#include delay.h#includeGPIO_RCC.h#includeLCD12864.h#includeI2C.hu8 dis16= 波形回放中. ;u8 dis116= 波形直放中. ;u8 dis216= 储存回放中. ;u8 dis316= 存储提取中. ;u8 tab11020;u8 tab1020;/存放ADC采集数据u8 Q=1;u16 i;u8 j;u8 Q4;/进入提示状态标志位int main(void) delay_init(72); RCC_Configuration(); GPIO_Configuration(); ADC_Configuration(); DAC_Configuration();TIM_Configuration(); NVIC_Configuration(); EXTI_Configuration(); init_12864(); while (1) if(Q=5) if(Q4!=3) /波形回放 lcd_pos(3,0); for(i=0;i16;i+) write_data(disi); / Q4=3; for(i=0;i=7) Q=1; Q4=0; if(Q=1) init_12864(); if(Q=6) /波形直接播放 if(Q4!=6) lcd_pos(3,0); for(i=0;i4); if(Q=2) if(Q4!=8) lcd_pos(3,0); for(i=0;i16;i+) /存储波形提取中 write_data(dis3i); / for(j=0;j4;j+)for(i=0;i256;i+) if(j=0) tab1i=IRcvStr(0xa0,i); if(j=1) tab1i+256=IRcvStr(0xa2,i); if(j=2)tab1i+512=IRcvStr(0xa4,i); if(j=3) tab1i+768=IRcvStr(0xa6,i); delay_ms(3); lcd_pos(3,0); for(i=0;i16;i+) /存储播放 write_data(dis2i); / Q4=8; for(i=0;iCTRL&=0xfffffffb;/bit2清空,选择外部时钟 HCLK/8fac_us=SYSCLK/8; fac_ms=(u16)fac_us*1000; /延时nms/注意nms的范围/SysTick-LOAD为24位寄存器,所以,最大延时为:/nms=0xffffff*8*1000/SYSCLK/SYSCLK单位为Hz,nms单位为ms/对72M条件下,nmsLOAD=(u32)nms*fac_ms;/时间加载(SysTick-LOAD为24bit)SysTick-VAL =0x00; /清空计数器SysTick-CTRL=0x01 ; /开始倒数 dotemp=SysTick-CTRL;while(temp&0x01&!(temp&(1CTRL=0x00; /关闭计数器SysTick-VAL =0X00; /清空计数器 /延时nus/nus为要延时的us数. void delay_us(u32 nus)u32 temp; SysTick-LOAD=nus*fac_us; /时间加载 SysTick-VAL=0x00; /清空计数器SysTick-CTRL=0x01 ; /开始倒数 dotemp=SysTick-CTRL;while(temp&0x01&!(temp&(1CTRL=0x00; /关闭计数器SysTick-VAL =0X00; /清空计数器 GPIO_RCC.c文件#include stm32f10x.h#includeGPIO_RCC.hvoid RCC_Configuration(void) /* 使用外部RC晶振 */* RCC system reset(for debug purpose) */RCC_DeInit(); /将外部RCC设置为缺省值 RCC_HSEConfig(RCC_HSE_ON);/开启外部高速晶振 while (RCC_GetFlagStatus(RCC_FLAG_HSERDY) = RESET);/等待外部高速晶振准备就绪 FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable); /开启FLASH预读缓冲功能,加速FLASH的读取。所有程序中必须的用法,位置:RCC初始化子函数里面,时钟起振之后 FLASH_SetLatency(FLASH_Latency_2); /FLASH时序延迟几个周期,等待总线同步操作。 /推荐按照单片机系统运行频率,024MHz时,取Latency=0;2448MHz时,取Latency=1;4872MHz时,取Latency=2。 RCC_HCLKConfig(RCC_SYSCLK_Div1); /设置AHB时钟 为系统时钟 RCC_PCLK2Config(RCC_HCLK_Div1); /设置高速AHB2时钟 为HCLK时钟 RCC_PCLK1Config(RCC_HCLK_Div2); /设置低速AHB1时钟 为HCLK时钟 RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9); / RCC_ADCCLKConfig(RCC_PCLK2_Div6);/设置PLL倍频系数即PLL输入时钟为外部高速时钟 倍频系数为9 即72M RCC_PLLCmd(ENABLE); /使能PLL while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) = RESET);/等待外部高速晶振准备就绪 RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); RCC_ADCCLKConfig(RCC_PCLK2_Div6);/配置ADC时钟为六分频/设置系统时钟为PLL倍频值 while(RCC_GetSYSCLKSource() != 0x08);/返回用作系统时钟的时钟源,等待返回为PLL时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE , ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA , ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD , ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE); GPIO_PinRemapConfig(GPIO_Remap_SWJ_Disable,ENABLE); /设置JTAG完全式失能 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2|RCC_APB1Periph_TIM3, ENABLE); /开启定时器2时钟, RCC_APB1PeriphClockCmd(RCC_APB1Periph_DAC, ENABLE); void NVIC_Configuration(void)NVIC_InitTypeDef NVIC_InitStructure;NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);/ 设置先占优先级2位,从优先级2位 ; NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn; / TIM2 全局中断 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2; / 先占优先级 0 ; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; / 从优先级 0 ; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;/ IRQ通道被使能 ; NVIC_Init(&NVIC_InitStructure);NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn; / TIM3 全局中断 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority =1; / 先占优先级 0 ; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; / 从优先级 0 ; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;/ IRQ通道被使能 ; NVIC_Init(&NVIC_InitStructure); NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;/EXTI0_IRQChannel;/设置外部中断0 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority =0;/主优先级为0 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;/从优先级为0 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;/中断使能 NVIC_Init(&NVIC_InitStructure); void GPIO_Configuration(void) GPIO_InitTypeDef GPIO_InitStructure; /* Configure PC.01 (ADC Channel11) as analog input */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; GPIO_Init(GPIOA, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin= GPIO_Pin_5|GPIO_Pin_4;/选择P GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;/管脚频率为50MHZ GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;/设模式为模拟 GPIO_Init(GPIOA , &GPIO_InitStructure);/初始化GPIOA寄存器GPIO_InitStructure.GPIO_Pin= GPIO_Pin_All;/选择P GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;/管脚频率为50MHZ GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;/设模式为模拟 GPIO_Init(GPIOE , &GPIO_InitStructure);/初始化GPIOA寄存器GPIO_InitStructure.GPIO_Pin= GPIO_Pin_0;/选择P GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;/管脚频率为50MHZ GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;/设置为上拉输入 GPIO_Init(GPIOA , &GPIO_InitStructure);/初始化GPIOA寄存器 GPIO_SetBits(GPIOA,GPIO_Pin_0);/设置PA.0 1 端口上拉GPIO_InitStructure.GPIO_Pin= GPIO_Pin_8|GPIO_Pin_10;/选择P GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;/管脚频率为50MHZ GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;/设模式为模拟 GPIO_Init(GPIOD , &GPIO_InitStructure);/初始化GPIOA寄存器 GPIO_InitStructure.GPIO_Pin= GPIO_Pin_9|GPIO_Pin_11;/选择P GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;/管脚频率为50MHZ GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;/设模式为模拟 GPIO_Init(GPIOD , &GPIO_InitStructure);/初始化GPIOA寄存器GPIO_SetBits(GPIOD,GPIO_Pin_9|GPIO_Pin_11);/设置PA.9 11 端口上拉 void ADC_Configuration(void)ADC_InitTypeDef ADC_InitStructure; ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; / ADC1和ADC2工作在独立模式 ; ADC_InitStructure.ADC_ScanConvMode = ENABLE; / 模数转换工作在扫描模式(多通道)模式 ; ADC_InitStructure.ADC_ContinuousConvMode = ENABLE; / 模数转换工作在连续模式 ; ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;/ 转换由软件而不是外部触发启动 ; ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; / ADC数据右对齐 ; ADC_InitStructure.ADC_NbrOfChannel =1; / 顺序进行规则转换的ADC通道的数目 1 ; ADC_Init(ADC1, &ADC_InitStructure); / 设置指定ADC的规则组通道1,设置它们的转化顺序和采样时间为55.5周期 ; ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 1, ADC_SampleTime_55Cycles5); /ADC_DMACmd(ADC1, ENABLE); / 使能指定的ADC的DMA请求 ; ADC_Cmd(ADC1, ENABLE); / 使能指定的ADC ; ADC_ResetCalibration(ADC1);/ 重置指定的ADC的校准寄存器 ; while(ADC_GetResetCalibrationStatus(ADC1); / 获取ADC重置校准寄存器的状态 ; ADC_StartCalibration(ADC1); / 开始指定ADC的校准程序 ; while(ADC_GetCalibrationStatus(ADC1); / 获取指定ADC的校准状态 ; ADC_SoftwareStartConvCmd(ADC1, ENABLE);/ 使能指定的ADC的软件转换启动功能 ;void DAC_Configuration(void) DAC_InitTypeDef DAC_InitStructure;DAC_InitStructure.DAC_Trigger = DAC_Trigger_None; DAC_InitStructure.DAC_WaveGeneration = DAC_WaveGeneration_None; DAC_InitStructure.DAC_LFSRUnmask_TriangleAmplitude = DAC_LFSRUnmask_Bits11_0; DAC_InitStructure.DAC_OutputBuffer = DAC_OutputBuffer_Enable; DAC_Init(DAC_Channel_1, &DAC_InitStructure); DAC_Cmd(DAC_Channel_1, ENABLE); DAC_InitStructure.DAC_Trigger = DAC_Trigger_None; DAC_InitStructure.DAC_WaveGeneration = DAC_WaveGeneration_None; DAC_InitStructure.DAC_LFSRUnmask_TriangleAmplitude = DAC_LFSRUnmask_Bits7_0; DAC_InitStructure.DAC_OutputBuffer = DAC_OutputBuffer_Enable; DAC_Init(DAC_Channel_2, &DAC_InitStructure); DAC_Cmd(DAC_Channel_2, ENABLE);void TIM_Configuration(void) TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_TimeBaseStructure.TIM_Period =7199; / 自动重装载寄存器周期的值 ; TIM_TimeBaseStructure.TIM_Prescaler =9999; / 设置了用来作为TIM2时钟频率除数的预分频值。 TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; / 设置了时钟分割 作用就是在未分频之前根据要求建立新的分频器, /确定定时器,确定一定的延时时间,在此时间内完成一定预期的功能 TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; / TIM向上计数模式 ; TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);/ 初始化TIM2的时间基数单位 ; TIM_Cmd(TIM3, ENABLE);/ 使能TIM2外设 ; TIM_ClearFlag(TIM3, TIM_FLAG_Update); / 清除TIM2的更新标志位 ; TIM_ITConfig(TIM3, TIM_IT_Update, ENABLE); / 使能TIM2中断源 ;TIM_TimeBaseStructure.TIM_Period =3599; / 自动重装载寄存器周期的值 ; TIM_TimeBaseStructure.TIM_Prescaler =2000; / 设置了用来作为TIM2时钟频率除数的预分频值。 TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; / 设置了时钟分割 作用就是在未分频之前根据要求建立新的分频器, /确定定时器,确定一定的延时时间,在此时间内完成一定预期的功能 TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; / TIM向上计数模式 ; TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);/ 初始化TIM2的时间基数单位 ; TIM_Cmd(TIM2, ENABLE);/ 使能TIM2外设 ; TIM_ClearFlag(TIM2, TIM_FLAG_Update); / 清除TIM2的更新标志位 ; TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE); / 使能TIM2中断源 ;void EXTI_Configuration(void)EXTI_InitTypeDef EXTI_InitStructure;/*外部中断0配置*/ GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource0); /把PC.8设置为外部中断5 EXTI_DeInit(); /将EXIT寄存器重设置为缺省值 EXTI

温馨提示

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

评论

0/150

提交评论