切换到宽版
  • 13379阅读
  • 6回复

[STM]使用STM32单片机通过emWin的GRAPH控件显示波形 [复制链接]

上一主题 下一主题
离线inthesun
 

发帖
9
M币
-477
专家
0
粉丝
5
只看楼主 倒序阅读 我要置顶 楼主  发表于: 2016-05-28
使用emWin已经有一段时间了,一直没用过GRAPH波形显示控件,前两天无聊,想利用STM32单片机ADC采样,通过GRAPH控件进行显示,看看效果怎么样。
单片机使用的是STM32F103ZET6,它提供了3路独立ADC转换通道,其中ADC1、ADC3支持DMA传输,ADC使用DMA的时候要注意对应的DMA通道号,否则无法进行传输,刚开始在这边浪费了不少时间。同时开启DMA传输完成中断,通过DMA传输中断标志,更新波形数据。


ADC初始化部分代码:
  1. unsigned char DMA1_TransferCompleteFlag = 0, DMA2_TransferCompleteFlag = 0;
  2. #define ADC1_DR_Address    ((uint32_t)0x4001244C)//ADC数据寄存器的基地址
  3. #define ADC2_DR_Address    ((uint32_t)0x4001284C)
  4. #define ADC3_DR_Address    ((uint32_t)0x40013C4C)
  5. //ADC_DR(ADC规则数据寄存器),偏移量=0x4c  ADC1(0x40012400-0x400127ff)
  6. //so ADC1_DR_Address=0x40012400+0x4c
  7. //==========================================================================================
  8. unsigned short    ADC1ConvertedValue[500];
  9. unsigned short    ADC3ConvertedValue[500];
  10. unsigned short     CH1_Buffer[500];
  11. unsigned short     CH2_Buffer[500];
  12. void ADC1_Init(void)
  13. {
  14.     ADC_InitTypeDef        ADC_InitStructure;
  15.     GPIO_InitTypeDef    GPIO_InitStructure;
  16.     DMA_InitTypeDef        DMA_InitStructure;
  17.     NVIC_InitTypeDef    NVIC_InitStructure;
  18.     
  19.     RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);         //使能DMA时钟
  20.     RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1 | RCC_APB2Periph_GPIOA, ENABLE);      //使能ADC和GPIOC时钟
  21.     RCC_ADCCLKConfig(RCC_PCLK2_Div2);   //设置ADC分频因子2 72M/2=32,?ADC最大时间不能超过14M
  22.     
  23.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
  24.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;        //模拟输入引脚
  25.     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  26.     GPIO_Init(GPIOA, &GPIO_InitStructure);
  27.     
  28.     DMA_DeInit(DMA1_Channel1);          //开启DMA1的第一通道
  29.     DMA_ITConfig(DMA1_Channel1, DMA_IT_TC, ENABLE);//开启中断
  30.     DMA_InitStructure.DMA_PeripheralBaseAddr = ADC1_DR_Address;          //DMA对应的外设基地址
  31.     DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)&ADC1ConvertedValue;   //内存存储基地址
  32.     DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;                  //DMA的转换模式为SRC模式,由外设搬移到内存
  33.     DMA_InitStructure.DMA_BufferSize = 500;           //DMA缓存大小,500个
  34.     DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;    //接收一次数据后,设备地址禁止后移
  35.     DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;    //接收一次数据后,目标内存地址后移
  36.     DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;  //定义外设数据宽度为16位
  37.     DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;  //DMA搬移数据尺寸,HalfWord就是为16位
  38.     DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;   //转换模式,循环缓存模式。
  39.     DMA_InitStructure.DMA_Priority = DMA_Priority_High;    //DMA优先级高
  40.     DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;          //M2M模式禁用
  41.     DMA_Init(DMA1_Channel1, &DMA_InitStructure);
  42.     DMA_Cmd(DMA1_Channel1, ENABLE);
  43.     
  44.     NVIC_InitStructure.NVIC_IRQChannel = DMA1_Channel1_IRQn;
  45.     NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2 ;//抢占优先级3
  46.     NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;        //子优先级3
  47.     NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;            //IRQ通道使能
  48.     NVIC_Init(&NVIC_InitStructure);    //根据指定的参数初始化VIC寄存器
  49.     
  50.     ADC_InitStructure.ADC_Mode = ADC_Mode_RegSimult;        //独立的转换模式
  51.     ADC_InitStructure.ADC_ScanConvMode = DISABLE;          //开启扫描模式
  52.     ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;   //开启连续转换模式
  53.     ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;    //ADC外部开关,关闭状态
  54.     ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;   //对齐方式,ADC为12位中,右对齐方式
  55.     ADC_InitStructure.ADC_NbrOfChannel = 1;     //开启通道数,1个
  56.     ADC_Init(ADC1, &ADC_InitStructure);
  57.     
  58.     ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 1, ADC_SampleTime_1Cycles5);      
  59.     ADC_DMACmd(ADC1, ENABLE);      //ADC命令,使能
  60.     ADC_Cmd(ADC1, ENABLE);  //开启ADC
  61.     ADC_ResetCalibration(ADC1);      //重新校准
  62.     while(ADC_GetResetCalibrationStatus(ADC1));  //等待重新校准完成
  63.     ADC_StartCalibration(ADC1);        //开始校准
  64.     while(ADC_GetCalibrationStatus(ADC1));       //等待校准完成
  65.     ADC_SoftwareStartConvCmd(ADC1, ENABLE);    //连续转换开始,ADC通过DMA方式不断的更新RAM区。
  66. }
  67. void ADC3_Init(void)
  68. {
  69.     ADC_InitTypeDef        ADC_InitStructure;
  70.     GPIO_InitTypeDef    GPIO_InitStructure;
  71.     DMA_InitTypeDef        DMA_InitStructure;
  72.     NVIC_InitTypeDef    NVIC_InitStructure;
  73.     
  74.     RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA2, ENABLE);         //使能DMA时钟
  75.     RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC3 | RCC_APB2Periph_GPIOA, ENABLE);      //使能ADC和GPIOC时钟
  76.     RCC_ADCCLKConfig(RCC_PCLK2_Div2);   //设置ADC分频因子2 72M/2=32,?ADC最大时间不能超过14M
  77.     
  78.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
  79.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;        //模拟输入引脚
  80.     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  81.     GPIO_Init(GPIOA, &GPIO_InitStructure);
  82.     
  83.     DMA_DeInit(DMA2_Channel5);          //开启DMA2的第一通道
  84.     DMA_ITConfig(DMA2_Channel5, DMA_IT_TC, ENABLE);//开启中断
  85.     DMA_InitStructure.DMA_PeripheralBaseAddr = ADC3_DR_Address;          //DMA对应的外设基地址
  86.     DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)&ADC3ConvertedValue;   //内存存储基地址
  87.     DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;                  //DMA的转换模式为SRC模式,由外设搬移到内存
  88.     DMA_InitStructure.DMA_BufferSize = 500;           //DMA缓存大小,500个
  89.     DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;    //接收一次数据后,设备地址禁止后移
  90.     DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;    //接收一次数据后,目标内存地址后移
  91.     DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;  //定义外设数据宽度为16位
  92.     DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;  //DMA搬移数据尺寸,HalfWord就是为16位
  93.     DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;   //转换模式,循环缓存模式。
  94.     DMA_InitStructure.DMA_Priority = DMA_Priority_High;    //DMA优先级高
  95.     DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;          //M2M模式禁用
  96.     DMA_Init(DMA2_Channel5, &DMA_InitStructure);
  97.     DMA_Cmd(DMA2_Channel5, ENABLE);
  98.     
  99.     NVIC_InitStructure.NVIC_IRQChannel = DMA2_Channel4_5_IRQn;
  100.     NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2 ;//抢占优先级3
  101.     NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;        //子优先级3
  102.     NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;            //IRQ通道使能
  103.     NVIC_Init(&NVIC_InitStructure);    //根据指定的参数初始化VIC寄存器
  104.   
  105.     ADC_InitStructure.ADC_Mode = ADC_Mode_RegSimult;        //独立的转换模式
  106.     ADC_InitStructure.ADC_ScanConvMode = DISABLE;          //开启扫描模式
  107.     ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;   //开启连续转换模式
  108.     ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;    //ADC外部开关,关闭状态
  109.     ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;   //对齐方式,ADC为12位中,右对齐方式
  110.     ADC_InitStructure.ADC_NbrOfChannel = 1;     //开启通道数,1个
  111.     ADC_Init(ADC3, &ADC_InitStructure);
  112.     
  113.     ADC_RegularChannelConfig(ADC3, ADC_Channel_0, 1, ADC_SampleTime_1Cycles5);      
  114.     ADC_DMACmd(ADC3, ENABLE);      //ADC命令,使能
  115.     ADC_Cmd(ADC3, ENABLE);  //开启ADC
  116.     ADC_ResetCalibration(ADC1);      //重新校准
  117.     while(ADC_GetResetCalibrationStatus(ADC3));  //等待重新校准完成
  118.     ADC_StartCalibration(ADC3);        //开始校准
  119.     while(ADC_GetCalibrationStatus(ADC3));       //等待校准完成
  120.     ADC_SoftwareStartConvCmd(ADC3, ENABLE);    //连续转换开始,ADC通过DMA方式不断的更新RAM区。
  121. }
  122. void DMA1_Channel1_IRQHandler()
  123. {
  124.     ADC_DMACmd(ADC1, DISABLE);      //ADC命令,禁止    
  125.     if(DMA_GetITStatus(DMA1_IT_TC1))
  126.     {    
  127.         DMA1_TransferCompleteFlag = 1;
  128.         DMA_ClearITPendingBit(DMA1_IT_GL1);
  129.     }
  130. }
  131. void DMA2_Channel4_5_IRQHandler()
  132. {
  133.     ADC_DMACmd(ADC3, DISABLE);      //ADC命令,禁止
  134.     if(DMA_GetITStatus(DMA2_IT_TC5))
  135.     {    
  136.         DMA2_TransferCompleteFlag = 1;
  137.         DMA_ClearITPendingBit(DMA2_IT_GL5);
  138.     }
  139. }
获取了ADC数据,接下来就是对数据进行波形显示了。首先需要创建一个小工具hGraph,创建两个数据对象hData[2],分别保存ADC1和ADC3的转化数据,然后将创建的数据附加到小工具hGraph,具体代码如下:
  1. int ChOffset_y[2] = {100, 25};
  2. #define COLOR_BK          GUI_BLACK
  3. #define COLOR_BORDER      GUI_DARKBLUE
  4. #define COLOR_FRAME       GUI_LIGHTCYAN
  5. #define COLOR_GRID        GUI_GRAY
  6. static GUI_CONST_STORAGE GUI_COLOR _aColorsCh1Arrow[] = {
  7.   0xFFFFFF, GUI_YELLOW
  8. };
  9. static GUI_CONST_STORAGE GUI_COLOR _aColorsCh2Arrow[] = {
  10.   0xFFFFFF, GUI_GREEN
  11. };
  12. static GUI_CONST_STORAGE GUI_COLOR _aChColors[] = {
  13.   GUI_YELLOW, GUI_GREEN
  14. };
  15. static GUI_CONST_STORAGE GUI_LOGPALETTE _PalCh1Arrow = {
  16.   2,
  17.   1,
  18.   &_aColorsCh1Arrow[0]
  19. };
  20. static GUI_CONST_STORAGE GUI_LOGPALETTE _PalCh2Arrow = {
  21.   2,
  22.   1,
  23.   &_aColorsCh2Arrow[0]
  24. };
  25. static GUI_CONST_STORAGE unsigned char _acp[] = {
  26.   X_______,
  27.   XX______,
  28.   XXXX____,
  29.   XXXXXX__,
  30.   XXXX____,
  31.   XX______,
  32.   X_______,
  33. };
  34. static GUI_CONST_STORAGE GUI_BITMAP _Ch1bmp = {
  35.   8,            /* XSize */
  36.   7,             /* YSize */
  37.   1,             /* BytesPerLine */
  38.   1,             /* BitsPerPixel */
  39.   _acp,  /* Pointer to picture data (indices) */
  40.   &_PalCh1Arrow     /* Pointer to palette */
  41. };
  42. static GUI_CONST_STORAGE GUI_BITMAP _Ch2bmp = {
  43.   8,            /* XSize */
  44.   7,             /* YSize */
  45.   1,             /* BytesPerLine */
  46.   1,             /* BitsPerPixel */
  47.   _acp,  /* Pointer to picture data (indices) */
  48.   &_PalCh2Arrow     /* Pointer to palette */
  49. };
  50. static void _UserDraw(WM_HWIN hWin, int Stage) {
  51.     GUI_RECT Rect;
  52.     unsigned short i;    
  53.     WM_GetInsideRect(&Rect);
  54.     
  55.     if (Stage == GRAPH_DRAW_LAST) {
  56.         GUI_DrawBitmap(&_Ch1bmp, Rect.x0, Rect.y1-ChOffset_y[0]-30);
  57.         GUI_DrawBitmap(&_Ch2bmp, Rect.x0, Rect.y1-ChOffset_y[1]-30);        
  58.     }
  59.     else if (Stage == GRAPH_DRAW_FIRST) {
  60.         GUI_SetColor(COLOR_GRID);    
  61.         for (i=Rect.x0+7; i<Rect.x0+7+250; i+=5){//横
  62.             GUI_DrawPixel(i, Rect.y0+12+1);
  63.             GUI_DrawPixel(i, Rect.y0+12+2);        
  64.             GUI_DrawPixel(i, Rect.y0+12+25);    
  65.             GUI_DrawPixel(i, Rect.y0+12+50);
  66.             GUI_DrawPixel(i, Rect.y0+12+75);    
  67.             GUI_DrawPixel(i, Rect.y0+12+99);        
  68.             GUI_DrawPixel(i, Rect.y0+12+100);    
  69.             GUI_DrawPixel(i, Rect.y0+12+101);
  70.             GUI_DrawPixel(i, Rect.y0+12+125);        
  71.             GUI_DrawPixel(i, Rect.y0+12+150);    
  72.             GUI_DrawPixel(i, Rect.y0+12+175);        
  73.             GUI_DrawPixel(i, Rect.y0+12+199);    
  74.             GUI_DrawPixel(i, Rect.y0+12+200);        
  75.         }
  76.         for (i=Rect.y0+12; i<Rect.y0+12+200; i+=5){//竖
  77.             GUI_DrawPixel(Rect.x0+7+1, i);
  78.             GUI_DrawPixel(Rect.x0+7+2, i);        
  79.             GUI_DrawPixel(Rect.x0+7+25, i);    
  80.             GUI_DrawPixel(Rect.x0+7+50, i);
  81.             GUI_DrawPixel(Rect.x0+7+75, i);    
  82.             GUI_DrawPixel(Rect.x0+7+100, i);        
  83.             GUI_DrawPixel(Rect.x0+7+124, i);    
  84.             GUI_DrawPixel(Rect.x0+7+125, i);
  85.             GUI_DrawPixel(Rect.x0+7+126, i);        
  86.             GUI_DrawPixel(Rect.x0+7+150, i);    
  87.             GUI_DrawPixel(Rect.x0+7+175, i);        
  88.             GUI_DrawPixel(Rect.x0+7+200, i);    
  89.             GUI_DrawPixel(Rect.x0+7+225, i);    
  90.             GUI_DrawPixel(Rect.x0+7+249, i);    
  91.             GUI_DrawPixel(Rect.x0+7+250, i);        
  92.         }
  93.     }
  94. }
  95. #define BUTTON_UNPRESSED_BKCOLOR    GUI_DARKGREEN
  96. #define BUTTON_PRESSED_BKCOLOR        GUI_LIGHTGREEN
  97. #define BUTTON_TEXTCOLOR            GUI_WHITE
  98. void Task_Gui(void *pdata)
  99. {
  100.     OS_ERR                 err;
  101.     WM_HWIN             hGraph,    hItem;
  102.     GRAPH_DATA_Handle   hData[2];    
  103.     unsigned short    threshold_value = 3000;
  104.     unsigned int    Xsync=0;
  105.     unsigned int    i=0;
  106.     GUI_Init(); //STemWin初始化
  107.     WM_SetDesktopColor(GUI_BLACK);
  108.     WM_SetCreateFlags(WM_CF_MEMDEV);
  109.     hGraph = GRAPH_CreateEx(0, 0, 320, 240, WM_HBKWIN, WM_CF_SHOW | WM_CF_CONST_OUTLINE, 0, 0);
  110.     GRAPH_SetUserDraw(hGraph, _UserDraw);
  111.     GRAPH_SetBorder(hGraph, 8, 13, 320-8-250, 240-13-200);
  112.     WM_SetHasTrans (hGraph);
  113.     WIDGET_SetEffect(hGraph, &WIDGET_Effect_None);
  114.     GRAPH_SetColor (hGraph, COLOR_BK,     GRAPH_CI_BK);
  115.     GRAPH_SetColor (hGraph, COLOR_BORDER, GRAPH_CI_BORDER);
  116.     GRAPH_SetColor (hGraph, COLOR_FRAME,  GRAPH_CI_FRAME);
  117.     GRAPH_SetColor (hGraph, COLOR_GRID,   GRAPH_CI_GRID);
  118.   //GRAPH_SetGridVis  (hGraph, 1);    //自绘网格线,这里禁止
  119.   //GRAPH_SetLineStyleH(hGraph, GUI_LS_DOT);
  120.   //GRAPH_SetLineStyleV(hGraph, GUI_LS_DOT);    
  121.     GRAPH_SetGridDistX(hGraph, 25);
  122.     GRAPH_SetGridDistY(hGraph, 25);
  123.     GRAPH_SetGridFixedX(hGraph, 1);
  124.     for (i=0; i<2; i++) {
  125.         hData[i] = GRAPH_DATA_YT_Create(_aChColors[i], 250, 0, 0);
  126.         GRAPH_AttachData(hGraph, hData[i]);
  127.         GRAPH_DATA_YT_SetOffY(hData[i], ChOffset_y[i]);
  128.         GRAPH_DATA_YT_SetAlign(hData[i], GRAPH_ALIGN_LEFT);
  129.     }
  130.     for (i=0; i<5; i++) {
  131.         hItem = BUTTON_CreateEx(8+250+5,12+i*42,52,34,hGraph, WM_CF_SHOW | WM_CF_CONST_OUTLINE, 0, 0);
  132.         BUTTON_SetTextAlign(hItem, GUI_TA_HCENTER|GUI_TA_VCENTER);
  133.         BUTTON_SetBkColor(hItem, BUTTON_CI_UNPRESSED, BUTTON_UNPRESSED_BKCOLOR);
  134.         BUTTON_SetBkColor(hItem, BUTTON_CI_PRESSED, BUTTON_PRESSED_BKCOLOR);
  135.         BUTTON_SetTextColor(hItem, BUTTON_BI_UNPRESSED, BUTTON_TEXTCOLOR);
  136.         BUTTON_SetTextColor(hItem, BUTTON_BI_PRESSED, BUTTON_TEXTCOLOR);
  137.         BUTTON_SetFocussable(hItem, 0);// Set all buttons non focussable
  138.         WIDGET_SetEffect(hItem, &WIDGET_Effect_None);//1??3DD??
  139.     }
  140.     while(1) {
  141.         GUI_Exec();    
  142.         OSTimeDlyHMSM(0,0,0,10,OS_OPT_TIME_PERIODIC,&err);//延时10ms
  143.         
  144.         if (DMA1_TransferCompleteFlag && DMA2_TransferCompleteFlag)    {
  145.             DMA2_TransferCompleteFlag = 0;
  146.             DMA1_TransferCompleteFlag = 0;
  147.             for(i=0; i<500; i++) {
  148.                 CH1_Buffer[i] = ADC1ConvertedValue[i];
  149.                 CH2_Buffer[i] = ADC3ConvertedValue[i];    
  150.             }
  151.             ADC_DMACmd(ADC1, ENABLE);      //ADC命令,使能
  152.             ADC_DMACmd(ADC3, ENABLE);      //ADC命令,使能
  153.         
  154.             for(i=125; i<500-125; i++){
  155.                 if (CH1_Buffer[i]    < threshold_value    &&
  156.                     CH1_Buffer[i+1] > threshold_value){
  157.                     Xsync = i-125;
  158.                     break;
  159.                 }        
  160.             }
  161.             GRAPH_DATA_YT_Clear(hData[0]);
  162.             GRAPH_DATA_YT_Clear(hData[1]);
  163.             for (i=0; i<250; i++) {//更新hData数据
  164.                 GRAPH_DATA_YT_AddValue(hData[0], (((CH1_Buffer[Xsync+i]>>6)*165)>>6)>>1);
  165.                 GRAPH_DATA_YT_AddValue(hData[1], (((CH2_Buffer[Xsync+i]>>6)*165)>>6)>>1);
  166.             }
  167.         }
  168.     }
  169. }
用555搭了个多谐振荡器产生一路信号,然后再RC积分电路产生一路信号,信号频率57K左右,最后显示照片:





[ 此帖被inthesun在2016-05-28 22:16重新编辑 ]
本文内容包含图片或附件,获取更多资讯,请 登录 后查看;或者 注册 成为会员获得更多权限
本帖最近打赏记录:共1条打赏M币+3
关键词: STM32ADCemWinGRAPH
离线qq76832893

发帖
498
M币
1368
专家
0
粉丝
38
只看该作者 1楼 发表于: 2016-05-28
请登录后查看
离线qjj2857

发帖
644
M币
532
专家
2
粉丝
12
只看该作者 2楼 发表于: 2016-05-28
请登录后查看

发帖
406
M币
841
专家
1
粉丝
8
只看该作者 3楼 发表于: 2016-05-28
请登录后查看
离线inthesun

发帖
9
M币
-477
专家
0
粉丝
5
只看该作者 4楼 发表于: 2016-05-30
回 qjj2857 的帖子
请登录后查看
离线cao57508

发帖
2265
M币
3657
专家
9
粉丝
85
只看该作者 5楼 发表于: 2016-06-22
请登录后查看
离线cqzk

发帖
160
M币
74
专家
0
粉丝
4
只看该作者 6楼 发表于: 2017-12-31
请登录后查看
快速回复
限80 字节
温馨提示:欢迎交流讨论,请勿发布纯表情、纯引用等灌水帖子;以免被删除
 
上一个 下一个