基于立创·梁山派的示波器设计 - 嘉立创EDA开源硬件平台

编辑器版本 ×
标准版 Standard

1、简单易用,可快速上手

2、流畅支持300个器件或1000个焊盘以下的设计规模

3、支持简单的电路仿真

4、面向学生、老师、创客

专业版 professional

1、全新的交互和界面

2、流畅支持超过3w器件或10w焊盘的设计规模,支持面板和外壳设计

3、更严谨的设计约束,更规范的流程

4、面向企业、更专业的用户

专业版 基于立创·梁山派的示波器设计

简介:基于梁山派的双通道示波器设计

开源协议: GPL 3.0

(未经作者授权,禁止转载)

创建时间: 2023-12-08 20:26:58
更新时间: 2023-12-10 01:20:07
描述

功能介绍:

1、双通道采集

2、DAC多种波形生成并且频率可调

3、多种方式控制控制

  • 带有波形参数显示:可对幅值和周期进行调节
  • 垂直和水平位置均可调,并带有指示;
  • 有上升下降沿两种触发方式;
  • 最高实时采样率:600ksps;
  • 信号耦合方式:DC/AC;
  • 可显示tts值
  • 最高输入电压:±16Vpp(探头倍数为10:1),±15Vpp

3、技能掌握

      硬件开发能力
  • 学习嵌入式项目电路分析的能力,学会如何看懂原理图;
  • 初步学习掌握元器件选型与数据手册阅读的基础能力;
  • 巩固掌握模拟电路,数字电路基础;
  • 了解示波器工作原理与采样电路设计的基本方法;
  • 掌握示波器基础理论与关键指标;
  • 学习原理图设计与PCB设计技巧,培养独立项目设计思维;
  • 掌握万用表、示波器、信号发生器、学生电源等仪器的使用,具备基础电路分析能力;
  • 掌握电烙铁、热风枪等工具使用,具备元器件焊接与硬件调试能力,成为新一代“焊武帝”

实物焊接图如下:

 

7个方框分别是:1、对波形进行暂停并查看历史波形  2、调节电压分辨率    3、调节时间分辨率   4、改变不同的输出波形(正弦波,三角波方波等) 5、改变输出波形的频率   6、FFT(快速傅里叶变化的预估值)7、FFT的计数倍数

     软件开发能力
  • 了解GD32基础功能及外设的使用,上手GD32项目开发;
  • 了解ADC采集原理,实现电压的采集功能;
  • 了解LCD驱动原理,实现屏幕驱动;
  • 掌握UI界面的制作;
  • 掌握嵌入式软件开发、代码的阅读与BUG调试的方法与技巧

主程序代码如下:

#include "gd32f4xx.h"
#include "systick.h"
#include <stdio.h>
#include "main.h"
#include "bsp_led.h"
#include "sys.h"
#include "bsp_usart.h"
#include "bsp_key.h"
#include "bsp_basic_timer.h"
 
#include "bsp_lcd.h"
#include "bsp_spi.h"
#include "bsp_gui.h"
#include "exmc_sdram.h"
 
#include "bsp_dac.h"
#include "bsp_adc.h"
#include "touch.h"
 
#include "arm_math.h"  
 
 
//ADC采集数据指针
uint16_t *adc_tmp;
uint16_t *adc_tmp1;
 
//FFT变量
#define FFT_LENGTH 1024 //FFT长度,默认是1024点FFT
float fft_inputbuf[FFT_LENGTH*2]; //FFT输入数组
float fft_outputbuf[FFT_LENGTH]; //FFT输出数组
arm_cfft_radix4_instance_f32 scfft;
 
//FFT显示处理
float max_fft;
uint16_t fft_number;
//uint16_t fft_n; //缩放比例
 
//频域显示状态
uint8_t fft_show_state = 1;   //默认1显示探头1的,2显示探头2,0不显示
 
uint16_t Lase_Trigger_number,Lase_Trigger_number1;
uint8_t show_updata;
uint16_t data_tmp;
 
//波轮按键对应设置
uint8_t keya_set=0;
uint8_t keya_number=3;
uint8_t keyb_set=0;
uint8_t keyb_number=4;
 
//触控的坐标和触控状态
uint16_t touch_x;
uint16_t touch_y;
uint8_t touch_state = 0;    //0代表未屏幕未被触控,1代表屏幕已被触控
uint8_t touch_judge = 0;    
 
/*!
    \brief    main function
    \param[in]  none
    \param[out] none
    \retval     none
*/
int main(void)
{
    uint32_t i;
    
    nvic_priority_group_set(NVIC_PRIGROUP_PRE2_SUB2);  // 优先级分组
    systick_config();
    led_gpio_config();  // led初始化
    key_gpio_config(); // key初始化
    usart_gpio_config(9600U);
    
    //sram初始化
    exmc_synchronous_dynamic_ram_init(EXMC_SDRAM_DEVICE0);
    
    //LCD初始化
    LCD_Init();
    delay_1ms(50);
    Spi2_Dma_Init();
    Lcd_Gram_Fill(Show_GramA,GRAM_BLACK);   //将颜色数据写入缓冲区
    LCD_Show_Gram(Show_GramA);
    while(Lcd_Show_Over);
    LCD_BLK_Set();//打开背光
    delay_1ms(10);
    Lcd_Gram_Fill(Show_GramA,GRAM_BLACK);
    Lcd_Gram_Fill(Show_GramB,GRAM_BLACK);
    
    
    //开启定时器固定刷屏
    Lcd_Show_Time();
    
    //波形输出
    dac_config();
    Dac_Show_Wav(wav_number);
    Dac_Time_Hz(wav_Fps);
    
    //ADC采集
    adc_config();
    adc_setio_init();
    alternating_direct_set(ac_dc);
    gather_rate_set(gather_rate);
    adc_speed_set(adc_speed);
 
TP_Init();
    
    ////FFT初始化 scfft结构体
    arm_cfft_radix4_init_f32(&scfft,FFT_LENGTH,0,1);
    
    //绘制功能图标
    POINT_COLOR=GRAM_WHITE; //画笔颜色
    for(i=0;i<10;i++) Lcd_Show_Data(i);
    POINT_COLOR=GRAM_YELLOW; //画笔颜色
    Lcd_Show_Data(keya_number);
    POINT_COLOR=GRAM_GREEN; //画笔颜色
    Lcd_Show_Data(keyb_number);
    POINT_COLOR=GRAM_WHITE; //画笔颜色
    
    while(1) 
    {
        //定时器循环固定数据刷屏
        while(Lcd_Show_Over);
        if(show_updata)
        {
            show_updata=0;
            Show_Star=1;            //开始这个一帧标志
            while(Show_Star);       //等待帧处理
        }
 
 
//触摸检测,仅支持单触摸,不支持连触
TP_Scan(0);
if(touch_state == 0)
{
if(tp_dev.sta&TP_PRES_DOWN)//有触摸被按下
{  
delay_1ms(1);//必要的延时,否则老认为有按键按下.    
if((tp_dev.x[0]<(LCD_W-1)&&tp_dev.x[0]>=1)&&(tp_dev.y[0]<(LCD_H-1)&&tp_dev.y[0]>=1))
touch_x = tp_dev.x[0];
touch_y = tp_dev.y[0];
touch_judge = 1;
//printf("X:%d, Y:%d\r\n", tp_dev.x[0], tp_dev.y[0]);
}    
}
}
if(tp_dev.sta&TP_PRES_DOWN)//有触摸被按下
touch_state = 1;
else
touch_state = 0;
 
 
        
        if(adc_power)
        {
            //等待采集完成
            while(!adc_dma_ok);
            adc_dma_ok=0;
            
            //配置指针 添加计算缓冲  DMA采样速度过快
            if(adc_dma_AB) adc_tmp = adc_value + adc_buff_2x;
            else adc_tmp = adc_value ;
if(adc_dma_AB1) adc_tmp1 = adc_value1 + adc_buff_2x;
else adc_tmp1 = adc_value1;
for(i=0;i<adc_buff_2x;i++) 
{
adc_buff[i] = adc_tmp[i];
adc_buff1[i] = adc_tmp1[i];
}
            
if(fft_show_state == 1)
{
//FFT运算 <1ms
for(i=0;i<FFT_LENGTH;i++)//生成信号序列
{
fft_inputbuf[2*i]=adc_buff[i];//生成输入信号实部
fft_inputbuf[2*i+1]=0;//虚部全部为0
}
arm_cfft_radix4_f32(&scfft,fft_inputbuf);//FFT计算(基4)
arm_cmplx_mag_f32(fft_inputbuf,fft_outputbuf,FFT_LENGTH);//把运算结果复数求模得幅值 
fft_outputbuf[0] = 0;//第一个值非常大,这里舍弃
//测算最大FFT点
max_fft = 0;
fft_number=0;
for(i=0;i<320;i++)
{
if(fft_outputbuf[i] > max_fft)
{
max_fft = fft_outputbuf[i];
fft_number = i;
}
}
//自动评估FFT缩放等级
fft_n = max_fft/150 + 1; //只显示150个刻度
for(i=0;i<320;i++)
{
Show_LinB[i]=(fft_outputbuf[i]/fft_n +27);
if(Show_LinB[i] > 227) Show_LinB[i]=227-8;
else if(Show_LinB[i] < 27) Show_LinB[i]=27-8;
else Show_LinB[i]=Show_LinB[i]-8;
}
//FFT频率估测
fft_fps = (2000000 / (0x01<<adc_speed)) * fft_number / 1024;
}
else if(fft_show_state == 2)
{
//FFT运算 <1ms
for(i=0;i<FFT_LENGTH;i++)//生成信号序列
{
fft_inputbuf[2*i]=adc_buff1[i];//生成输入信号实部
fft_inputbuf[2*i+1]=0;//虚部全部为0
}
arm_cfft_radix4_f32(&scfft,fft_inputbuf);//FFT计算(基4)
arm_cmplx_mag_f32(fft_inputbuf,fft_outputbuf,FFT_LENGTH);//把运算结果复数求模得幅值 
fft_outputbuf[0] = 0;//第一个值非常大,这里舍弃
//测算最大FFT点
max_fft = 0;
fft_number=0;
for(i=0;i<320;i++)
{
if(fft_outputbuf[i] > max_fft)
{
max_fft = fft_outputbuf[i];
fft_number = i;
}
}
//自动评估FFT缩放等级
fft_n = max_fft/150 + 1; //只显示150个刻度
for(i=0;i<320;i++)
{
Show_LinB[i]=(fft_outputbuf[i]/fft_n +27);
if(Show_LinB[i] > 227) Show_LinB[i]=227-8;
else if(Show_LinB[i] < 27) Show_LinB[i]=27-8;
else Show_LinB[i]=Show_LinB[i]-8;
}
//FFT频率估测
fft_fps = (2000000 / (0x01<<adc_speed)) * fft_number / 1024;
}
            
            
            //////设定值判定  Trigger  上升下降沿
            Trigger_number=0;
            max_data = 2048+(Trigger-Level)*16;
            if(wav_trigger)
            {
                for(i=lin_stat_set;i<lin_over_set;i++) 
                {
                    if(adc_tmp[i] <  max_data-25) 
                    {
                        for(;i<lin_over_set;i++) 
                        {
                            if(adc_tmp[i] > max_data)
                            {
                                Trigger_number=i-lin_stat_set;
                                break;
                            }
                        }
                        break;
                    }
                }
            }
            else
            {
                for(i=lin_stat_set;i<lin_over_set;i++) 
                {
                    if(adc_tmp[i] >  max_data+25) 
                    {
                        for(;i<lin_over_set;i++) 
                        {
                            if(adc_tmp[i] < max_data)
                            {
                                Trigger_number=i-lin_stat_set;
                                break;
                            }
                        }
                        break;
                    }
                }
            }
            Trigger_number1=0;
            max_data = 2048+(Trigger1-Level1)*16;
            if(wav_trigger)
            {
                for(i=lin_stat_set;i<lin_over_set;i++) 
                {
                    if(adc_tmp1[i] <  max_data-25) 
                    {
                        for(;i<lin_over_set;i++) 
                        {
                            if(adc_tmp1[i] > max_data)
                            {
                                Trigger_number1=i-lin_stat_set;
                                break;
                            }
                        }
                        break;
                    }
                }
            }
            else
            {
                for(i=lin_stat_set;i<lin_over_set;i++) 
                {
                    if(adc_tmp1[i] >  max_data+25) 
                    {
                        for(;i<lin_over_set;i++) 
                        {
                            if(adc_tmp1[i] < max_data)
                            {
                                Trigger_number1=i-lin_stat_set;
                                break;
                            }
                        }
                        break;
                    }
                }
            }
            
            //缓存缩放裁剪导入
            for(i=0;i<320;i++)
            {
                Show_LinA[i]=((adc_buff[i+Trigger_number] + 0x08)>>4) + Level;//
                if(Show_LinA[i] > 227) Show_LinA[i]=227-8;
                else if(Show_LinA[i] < 27) Show_LinA[i]=27-8;
                else Show_LinA[i]=Show_LinA[i]-8;
 
                Show_LinA1[i]=((adc_buff1[i+Trigger_number1] + 0x08)>>4) + Level1;
                if(Show_LinA1[i] > 227) Show_LinA1[i]=227-8;
                else if(Show_LinA1[i] < 27) Show_LinA1[i]=27-8;
                else Show_LinA1[i]=Show_LinA1[i]-8;
            }
            
            //显示数据
            if(Show_AB)  Lcd_Show_Wav(Show_GramA);
            else Lcd_Show_Wav(Show_GramB);
 
//触摸判断操作
if(touch_judge == 1)
{
//开始暂停
if(touch_x >= 10 & touch_x <= 26 & touch_y >= 2 & touch_y <= 18)
{
Lase_Trigger_number = Trigger_number+1;
Key_Make_Set(0); //开始暂停
}
 
//下降沿上升沿
if(touch_x >= 125 & touch_x <= 141 & touch_y >= 2 & touch_y <= 18)
{
if(wav_trigger)
Key_Make_Set(4);
else
Key_Make_Set(5);
}
 
//ACDC
if(touch_x >= 150 & touch_x <= 166 & touch_y >= 2 & touch_y <= 18)
{
Key_Make_Set(6); //ACDC
}
 
//增加放大倍数
if(touch_x >= 175 & touch_x <= 191 & touch_y >= 2 & touch_y <= 18)
{
Key_Make_Set(11);
}
 
//减小放大倍数
if(touch_x > 191 & touch_x <= 207 & touch_y >= 2 & touch_y <= 18)
{
Key_Make_Set(10);
}
 
//减少采样速度
if(touch_x >= 240 & touch_x <= 261 & touch_y >= 2 & touch_y <= 18)
{
Key_Make_Set(13); //增加波形种类
}
 
//增加采样速度
if(touch_x > 261 & touch_x <= 282 & touch_y >= 2 & touch_y <= 18)
{
Key_Make_Set(14); //增加波形种类
}
 
//改变波形种类
if(touch_x >= 10 & touch_x <= 42 & touch_y >= 222 & touch_y <= 238)
{
Key_Make_Set(23); //增加波形种类
}
 
//FFT功能
if(touch_x >= 100 & touch_x <= 132 & touch_y >= 222 & touch_y <= 238)
{
Key_Make_Set(29); //FFT
}
            //拨轮A
            if(key[3] == Key_Time)
            {
                if(keya_set)
                {
                    key[3] = Key_No; //需要再次释放
Lcd_Show_Data(keya_number);
                    if(keya_number < 9) keya_number++;
                    POINT_COLOR=GRAM_YELLOW; //画笔颜色
                    Lcd_Show_Data(keya_number);
                    POINT_COLOR=GRAM_WHITE; //画笔颜色
                }
                else
                {
 
                    if(keya_number==5 || keya_number==6 || keya_number==8) key[3]--; //不需要释放
                    else key[3] = Key_No; //需要再次释放
                    POINT_COLOR=GRAM_YELLOW; //画笔颜色
                    Key_Make_Set(keya_number*3 + 2); //减1
                    POINT_COLOR=GRAM_WHITE; //画笔颜色
                }
            }
            if(key[4] == Key_Time)
            {
                key[4] = Key_No; //需要再次释放
                keya_set = !keya_set;
            }
            if(key[5] == Key_Time)
            {
                if(keya_set)
                {
                    key[5] = Key_No; //需要再次释放
Lcd_Show_Data(keya_number);
                    if(keya_number) keya_number--;
                    POINT_COLOR=GRAM_YELLOW; //画笔颜色
                    Lcd_Show_Data(keya_number);
                    POINT_COLOR=GRAM_WHITE; //画笔颜色
                }
                else
                {
                    if(keya_number==5 || keya_number==6 || keya_number==8) key[5]--; //不需要释放
                    else key[5] = Key_No; //需要再次释放
                    POINT_COLOR=GRAM_YELLOW; //画笔颜色
                    Key_Make_Set(keya_number*3 + 1); //减1
                    POINT_COLOR=GRAM_WHITE; //画笔颜色
                }
            }
            //拨轮B
            if(key[6] == Key_Time)
            {
                if(keyb_set)
                {
                    key[6] = Key_No; //需要再次释放
Lcd_Show_Data(keyb_number);
                    if(keyb_number < 9) keyb_number++;
                    POINT_COLOR=GRAM_GREEN; //画笔颜色
                    Lcd_Show_Data(keyb_number);
                    POINT_COLOR=GRAM_WHITE; //画笔颜色
                }
                else
                {
                    if(keyb_number==5 || keyb_number==6 || keyb_number==8) key[6]--; //不需要释放
                    else key[6] = Key_No; //需要再次释放
                    POINT_COLOR=GRAM_GREEN; //画笔颜色
                    Key_Make_Set(keyb_number*3 + 2); //减1
                    POINT_COLOR=GRAM_WHITE; //画笔颜色
                }
            }
            if(key[7] == Key_Time)
            {
                key[7] = Key_No; //需要再次释放
                keyb_set = !keyb_set;
            }
            if(key[8] == Key_Time)
            {
                if(keyb_set)
                {
                    key[8] = Key_No; //需要再次释放
Lcd_Show_Data(keyb_number);
                    if(keyb_number) keyb_number--;
                    POINT_COLOR=GRAM_GREEN; //画笔颜色
                    Lcd_Show_Data(keyb_number);
                    POINT_COLOR=GRAM_WHITE; //画笔颜色
                }
                else
                {
                    if(keyb_number==5 || keyb_number==6 || keyb_number==8) key[8]--; //不需要释放
                    else key[8] = Key_No; //需要再次释放
                    POINT_COLOR=GRAM_GREEN; //画笔颜色
                    Key_Make_Set(keyb_number*3 + 1); //减1
                    POINT_COLOR=GRAM_WHITE; //画笔颜色
                }
            }
            
            
            
            //更新显示
            show_updata=1;
        }
        else
        {
//确定最大/小值
min_data=0xffff;
min_data1=0xffff;
max_data=0;
max_data1=0;
for(i=0;i<300;i++) 
{
if(adc_tmp[i+Trigger_number]< min_data) min_data=adc_tmp[i+Trigger_number];
if(adc_tmp[i+Trigger_number]> max_data) max_data=adc_tmp[i+Trigger_number];
 
if(adc_tmp1[i+Trigger_number1]< min_data1) min_data1=adc_tmp1[i+Trigger_number1];
if(adc_tmp1[i+Trigger_number1]> max_data1) max_data1=adc_tmp1[i+Trigger_number1];
}
            if(Lase_Trigger_number != Trigger_number) 
            {
                Lase_Trigger_number = Trigger_number;
                //缓存导入
                for(i=0;i<320;i++)
                {
                    Show_LinA[i]=((adc_tmp[i+Trigger_number] + 0x08)>>4) + Level;
                    //Show_LinA[i]=((adc_tmp[i+Trigger_number] )>>4) + Level;
                    if(Show_LinA[i] > 227) Show_LinA[i]=227-8;
                    else if(Show_LinA[i] < 27) Show_LinA[i]=27-8;
                    else Show_LinA[i]=Show_LinA[i]-8;
                }
            }
 
            if(Lase_Trigger_number1 != Trigger_number1) 
            {
                Lase_Trigger_number1 = Trigger_number1;
                //缓存导入
                for(i=0;i<320;i++)
                {
                    Show_LinA1[i]=((adc_tmp1[i+Trigger_number1] + 0x08)>>4) + Level1;
                    //Show_LinA[i]=((adc_tmp[i+Trigger_number] )>>4) + Level;
                    if(Show_LinA1[i] > 227) Show_LinA1[i]=227-8;
                    else if(Show_LinA1[i] < 27) Show_LinA1[i]=27-8;
                    else Show_LinA1[i]=Show_LinA1[i]-8;
                }
            }
 
//显示数据
if(Show_AB)
{
//绘制波形
Lcd_Show_Wav(Show_GramA);
}
else
{
//绘制波形
Lcd_Show_Wav(Show_GramB);
}
//更新显示
show_updata=1;
 
//触摸判断操作
if(touch_judge == 1)
{
if(touch_x >= 10 & touch_x <= 26 & touch_y >= 2 & touch_y <= 18)
{
Key_Make_Set(0); //开始暂停
}
if(touch_x >= 11 & touch_x <= 82 & touch_y >= 20 & touch_y <= 80)
{
if(ch_state == 0)
ch_state =1;
else if(ch_state == 1)
ch_state = 0;
}
}
            //拨轮A
            if(key[3] == Key_Time)
            {
                key[3]--;
                if(Trigger_number < adc_buff_2x-320) Trigger_number+=5;
            }
            if(key[4] == Key_Time)
            {
                key[4] = Key_No; //需要再次释放
            }
            if(key[5] == Key_Time)
            {
                key[5]--;
                if(Trigger_number > 5) Trigger_number-=5;
                else if(Trigger_number) Trigger_number = 0;
                else;
            }
            //拨轮B
            if(key[6] == Key_Time)
            {
                key[6]--;
                if(Trigger_number1 < adc_buff_2x-320) Trigger_number1+=5;
            }
            if(key[7] == Key_Time)
            {
                key[7] = Key_No; //需要再次释放
            }
            if(key[8] == Key_Time)
            {
                key[8]--;
                if(Trigger_number1 > 5) Trigger_number1-=5;
                else if(Trigger_number1) Trigger_number1 = 0;
                else;
            }
            
        }     
touch_judge = 0;
        //delay_1ms(200);
    }
}
 
//屏幕刷新 50mS
void TIMER3_IRQHandler(void)
{
    timer_interrupt_flag_clear(TIMER3, TIMER_INT_FLAG_UP);
    if(Show_Star)
    {
        //LED1_TOGGLE();
        Show_Star=0;
        if(Show_AB)LCD_Show_Gram(Show_GramA);
        else LCD_Show_Gram(Show_GramB);
        Show_AB =!Show_AB;
    }
 
    //拨码A
    if(KeyAUp) key[3] &= Key_Time;
    else if(key[3] < Key_Time) key[3]++;
    else;
    if(KeyAOn) key[4] &= Key_Time;
    else if(key[4] < Key_Time) key[4]++;
    else;
    if(KeyADown) key[5] &= Key_Time;
    else if(key[5] < Key_Time) key[5]++;
    else;
    //拨码B
    if(KeyBUp) key[6] &= Key_Time;
    else if(key[6] < Key_Time) key[6]++;
    else;
    if(KeyBOn) key[7] &= Key_Time;
    else if(key[7] < Key_Time) key[7]++;
    else;
    if(KeyBDown) key[8] &= Key_Time;
    else if(key[8] < Key_Time) key[8]++;
    else;
    
}
 
//ADC采集
void DMA1_Channel0_IRQHandler(void)
{
    //LED3_TOGGLE();
    adc_dma_ok=1;
    if(dma_interrupt_flag_get(DMA1, DMA_CH0,DMA_INT_FLAG_HTF) == SET) adc_dma_AB=0;
    else adc_dma_AB=1;
   dma_interrupt_flag_clear(DMA1, DMA_CH0, DMA_INT_FLAG_FTF|DMA_INT_FLAG_HTF);
}
 
//ADC2采集
void DMA1_Channel1_IRQHandler(void)
{
    //LED2_TOGGLE();
    adc_dma_ok1=1;
    if(dma_interrupt_flag_get(DMA1, DMA_CH1,DMA_INT_FLAG_HTF) == SET) adc_dma_AB1=0;
    else adc_dma_AB1=1;
   dma_interrupt_flag_clear(DMA1, DMA_CH1, DMA_INT_FLAG_FTF|DMA_INT_FLAG_HTF);
}

4、教程资料

设计图
原理图
1 /
PCB
1 /
未生成预览图,请在编辑器重新保存一次
工程视频/附件
序号 文件名称 下载次数
1

梁山派双通道示波器-程序.7z

11
2

12月10日(1).mp4

5
工程成员
侵权投诉
相关工程
换一批
加载中...
添加到专辑 ×

加载中...

温馨提示 ×

是否需要添加此工程到专辑?

温馨提示
动态内容涉嫌违规
内容:
  • 153 6159 2675

服务时间

周一至周五 9:00~18:00
  • 技术支持

support
  • 开源平台公众号

MP