发新帖我要提问
123
返回列表
打印
[其他ST产品]

newlab平台stm32总结

[复制链接]
手机看帖
扫描二维码
随时随地手机跟帖
41
纠结的那些年|  楼主 | 2023-8-26 18:03 | 只看该作者 回帖奖励 |倒序浏览
使用中断方式接收:可以在数据收到的第一时间,马上跳转到中断函数来做及时的处理,提高实时性

使用特权

评论回复
42
纠结的那些年|  楼主 | 2023-8-26 18:03 | 只看该作者

#include "stm32f10x.h" //STM32头文件
#include "sys.h"
#include "delay.h"
#include "led.h"
#include "usart.h"
#include "key.h"
extern unsigned char  LED7Code[];
int main (void){//
        u8 a;
        //初始化程序
        RCC_Configuration(); //时钟设置
        LED8_Init();//8位数码管初始化
        USART1_Init(115200); //串口初始化

        while(1){
                //实现串口控制8位数码管
                if(USART_GetFlagStatus(USART1,USART_FLAG_RXNE) != RESET){  //查询串口标志位
                        a = USART_ReceiveData(USART1);//读取接收到的数据
                        printf("%c",a); //把收到的数据发送到电脑
                        if(a>='0'&&a<='9'){
                                GPIO_Write(GPIOA,LED7Code[a-'0']);//显示数字
                        }
                }
                LATCH_KEY1();//按下key1,发送key1被按下信息
                LATCH_KEY2();//按下key2,发送key2被按下信息

//      delay_ms(1000);
        }
}


使用特权

评论回复
43
纠结的那些年|  楼主 | 2023-8-26 18:03 | 只看该作者
用例
WIFI模块
步骤:
1.连接
2.平台命令获取及分析
3.单片机数据发送
接线:
stm32 P10 Tx - wifi RX
stm32 P11 Rx - wifi TX

使用特权

评论回复
44
纠结的那些年|  楼主 | 2023-8-26 18:03 | 只看该作者
int main()
{
        uint8_t IpData[128];
        int8_t temp;//检验热点是否连接成功,成功为1,失败为0
        uint8_t TryCount=0;
        RCC_Configuration(); //系统时钟初始化
        TIM2_Init();
        USART1_Init(115200);//串口一初始化
        printf("init...\r\n");
        UART4_Init(115200);//WiFi串口四初始化
        for(TryCount=0; TryCount<3; TryCount++)//三次连接
        {
                printf("start link %d times.\r\n",TryCount+1);
                temp=ConnectToServer((char *)MY_DEVICE_ID, (char *)MA_SECRET_KEY);//连接热点和服务器
                if(temp != 0)//连接失败 temp = -1:WIFI模式设置错误 -2:WIFI连接错误 -3:端口或地址错误 -4:第一次握手数据发送错误 -5未响应错误
                {
                        printf("Connect To Server ERROR=%d\r\n",temp);
                }
                else
                {
                        break;
                }
        }
        printf("link success\r\n");
        ClrAtRxBuf();//清空AT缓存
        //==================以上为WIFI连接函数===========================

        while(1)
        {
        //===================以下为WIFI接收到云平台数据函数==================
                if(F_AT_RX_FINISH)//判断是否接收到UART4_RX数据
                {         // 接收到数据包
                        ESP8266_GetIpData((uint8_t *)AT_RX_BUF, (char *)IpData);//获取数据,存入IpData
                        USER_DataAnalysisProcess((char *)IpData);//分析数据,在这个函数里对数据进行处理
                        memset(IpData, 0x00, 128);//清空数据
                        ClrAtRxBuf();
                }
                ///==================已下为WIFI发送单片机数据到云平台函数==================
                if(TimeCount >= 1000)//10S发送一次数据 timeCount每计数100次代表1s
                {
                        TimeCount=0;
                        ESP8266_SendSensor((char *)"wind", (char *)"2020-10-16 14:10:26", GPIO_ReadOutputDataBit(GPIOA,GPIO_Pin_0));//发送数据函数,参数1标识名 参数二:时间 参数三:数据如温度,低频高低
                        ClrAtRxBuf();
                }
        }
       
}

//=================以下为分析函数具体实现============
void USER_DataAnalysisProcess(char *RxBuf)
{
        char *cmdid = NULL;
        uint8_t TxetBuf[128];//发送数据
        if(strstr((const char *)RxBuf, (const char *)PING_REQ) != NULL)//心跳请求//strstr()查找子串在主串第一次出现的位置,判断是否收到数据
        {
                if(ESP8266_IpSend((char *)PING_RSP, strlen((const char *)PING_RSP)) < 0)//响应心跳
                {//发送失败
                        printf("发送心跳包失败!\r\n");
                }
                else
                {
                        printf("心跳包!\r\n");
                }
        }
        else if(strstr((const char *)RxBuf, (const char *)"\"t\":5") != NULL)//命令请求//收到请求
        {
                if(strstr((const char *)RxBuf, (const char *)"\"apitag\":\"ctrl\"") != NULL)//判断收到的标识名
                {
                        memset(TxetBuf,0x00,128);//清空缓存
///=====================操作代码书写区域=====================
                        //==============判断收到的数据,在里面执行需要的操作==============
                        if((strstr((const char *)RxBuf, (const char *)"\"data\":1") != NULL))
                        {
                                GPIO_SetBits(GPIOA,GPIO_Pin_0);
                                cmdid = USER_GetJsonValue((char *)RxBuf, (char *)"cmdid");
                                sprintf((char *)TxetBuf,"{\"t\":6,\"cmdid\":%s,\"status\":0,\"data\":1}",cmdid);
                                //printf("%s\r\n",TxetBuf);
                                if(ESP8266_IpSend((char *)TxetBuf, strlen((char *)TxetBuf)) < 0)
                                {//发送失败
                                        //printf("发送响应失败!\r\n");
                                }
                        }
                        else if((strstr((const char *)RxBuf, (const char *)"\"data\":0") != NULL))//关灯
                        {
                                GPIO_ResetBits(GPIOA,GPIO_Pin_0);
                                cmdid = USER_GetJsonValue((char *)RxBuf, (char *)"cmdid");
                                sprintf((char *)TxetBuf,"{\"t\":6,\"cmdid\":%s,\"status\":0,\"data\":0}",cmdid);
                                //printf("%s\r\n",TxetBuf);
                                if(ESP8266_IpSend((char *)TxetBuf, strlen((char *)TxetBuf)) < 0)
                                {//发送失败
                                        printf("发送响应失败!\r\n");
                                }
                        }
                }
        }
}

使用特权

评论回复
45
纠结的那些年|  楼主 | 2023-8-26 18:04 | 只看该作者
#ifndef _CloudReference_h_
#define _CloudReference_h_
//================在CloudReference.h设置WIFI名称和密码以及设备标识和传输密钥
#define WIFI_AP                "xin"//WiFi热点名称
#define WIFI_PWD        "987654321"        //WiFi密码
#define WIFI_AP1                "zhjt_220"//WiFi热点名称
#define WIFI_PWD1        "12345678zhjt"        //WiFi密码
#define SERVER_IP        "120.77.58.34"        //服务器IP地址
#define SERVER_PORT        8600                        //服务器端口号

#define MY_DEVICE_ID  "light2018052790"//设备标识
#define MA_SECRET_KEY "1d1c815e2a504ff9abcf6301134f27d3"//传输密钥

#endif /*_CloudReference_h_*/

使用特权

评论回复
46
纠结的那些年|  楼主 | 2023-8-26 18:04 | 只看该作者
语音模块
使用xfs5152ce.c和usart3.c极fifo.c文件,主要功能语音识别和文本合成

使用特权

评论回复
47
纠结的那些年|  楼主 | 2023-8-26 18:04 | 只看该作者
步骤:
/***************************************************************
  *        Name                :        MAIN.C
  *        Data                :        2019.7.15
  *        Author        :        NIEAOWEI
  *        Note                :        本实验主要是测试语音模块,连续读不卡顿,中断读,
                                                        以及语音识别功能。
****************************************************************/
#include "usart3.h"
#include "delay.h"
#include "fifo.h"
#include "xfs5152ce.h"
#include "usart1.h"

int main(){
        uint8_t data[10];
        uint8_t a;
        delay_init();
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
        Usart1_Init(115200);
        usart3_init();
       
        delay_ms(1);
       
        printf("start...\r\n");
       
        xfs_voice_start((unsigned char *)"请说出启动指令",XFS_FORMAT_GBK,1);//语音合成播放指定文本 *data 需要合成播放的文本 format 编码格式 wait_finish 是否等待上次合成结束
        xfs_voice_start((unsigned char *)"请说出启动指令",XFS_FORMAT_GBK,1);//语音合成函数,可以播放想要的信息,参数1 要播放的文字 参数2 编码格式 参数3 是否等待上次合成结束,1等待
        xfs_voice_start((unsigned char *)"请说出启动指令",XFS_FORMAT_GBK,1);
        printf("%d,%d\r\n",usart3_rx_fifo.in,usart3_rx_fifo.out);
       
        //*delay_ms(1000);
        if(xfs_recognize(&a, 5000) == 1)
        {
                xfs_voice_start((unsigned char *)"语音识别成功", XFS_FORMAT_GBK, 1);
                sprintf((char *)data,"%d",a);
                xfs_voice_start((unsigned char *)data,XFS_FORMAT_GBK,1);
                xfs_voice_start((unsigned char *)cmd_word_list[a],XFS_FORMAT_GBK,1);
        }else{
                xfs_voice_start((unsigned char *)"语音识别失败",XFS_FORMAT_GBK,1);
        }
        printf("re :%d\r\n",a);
        for(a=0;a<100;a++){
                printf("%x,",usart3_rx_fifo.data[a]);
        }
        printf("%d,%d\r\n",usart3_rx_fifo.in,usart3_rx_fifo.out);
       
        while(1){
                delay_ms(1000);
                printf("runnig...\r\n");
        };
               
}



使用特权

评论回复
48
纠结的那些年|  楼主 | 2023-8-26 18:04 | 只看该作者
四、ADC输出
步骤:
1.时钟初始化
2.ADC初始化
3.声明外部变量,获取电压值,通过公式转化成对应的数据值
连线:
温度光照传感器J6,接PB0
ADC_IN1 PA1
ADC_IN4 PA4
ADC_IN5 PA5
ADC_IN6 PA6
ADC_IN7 PA7
ADC_IN8 PB0
ADC_IN9 PB1
ADC_IN10 PC0
ADC_IN11 PC1
ADC_IN12 PC2
ADC_IN13 PC3

使用特权

评论回复
49
纠结的那些年|  楼主 | 2023-8-26 18:04 | 只看该作者

#define ADC1_DR_Address    ((uint32_t)0x4001244C)//ADC1外设地址

#define ADCPORT                GPIOB        //定义ADC接口
#define ADC_CH8                GPIO_Pin_0       
#define ADC_CH9                GPIO_Pin_1       
vu16 ADC_DMA_IN5; //ADC数值存放的变量

void ADC_DMA_Init(void){ //DMA初始化设置
        DMA_InitTypeDef DMA_InitStructure;//定义DMA初始化结构体
        DMA_DeInit(DMA1_Channel1);//复位DMA通道1
        DMA_InitStructure.DMA_PeripheralBaseAddr = ADC1_DR_Address; //定义 DMA通道外设基地址=ADC1_DR_Address
        DMA_InitStructure.DMA_MemoryBaseAddr = (u32)&ADC_DMA_IN5; //定义DMA通道ADC数据存储器(其他函数可直接读此变量即是ADC值)                //修改一:获取ADC数值地址
        DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;//指定外设为源地址
        DMA_InitStructure.DMA_BufferSize = 1;//定义DMA缓冲区大小(根据ADC采集通道数量修改)                                                                                                                                                                //修改二:获取ADC的通道数
        DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;//当前外设寄存器地址不变
        DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Disable;//当前存储器地址:Disable不变,Enable递增(用于多通道采集)                                //修改三:多道采集用Enable
        DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;//定义外设数据宽度16位
        DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord; //定义存储器数据宽度16位
        DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;//DMA通道操作模式位环形缓冲模式
        DMA_InitStructure.DMA_Priority = DMA_Priority_High;//DMA通道优先级高
        DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;//禁止DMA通道存储器到存储器传输
        DMA_Init(DMA1_Channel1, &DMA_InitStructure);//初始化DMA通道1
        DMA_Cmd(DMA1_Channel1, ENABLE); //使能DMA通道1
}
void ADC_GPIO_Init(void){ //GPIO初始化设置
        GPIO_InitTypeDef  GPIO_InitStructure;        
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOC,ENABLE);      
        RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);//使能DMA时钟(用于ADC的数据传送)
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);//使能ADC1时钟
    GPIO_InitStructure.GPIO_Pin = ADC_CH8; //选择端口                                                                                                                                                                                                                                                                                            //修改四:  设置获取ADC端口的引脚                        
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; //选择IO接口工作方式      
        GPIO_Init(ADCPORT, &GPIO_InitStructure);                                                                                                                                                                                                                                                                                                                                        //修改五:ADCPORT修改接口               
}
void ADC_Configuration(void){ //初始化设置
        ADC_InitTypeDef ADC_InitStructure;//定义ADC初始化结构体变量
        ADC_GPIO_Init();//GPIO初始化设置
        ADC_DMA_Init();//DMA初始化设置
        ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;//ADC1和ADC2工作在独立模式
        ADC_InitStructure.ADC_ScanConvMode = ENABLE; //使能扫描
        ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;//ADC转换工作在连续模式
        ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;//有软件控制转换
        ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;//转换数据右对齐
        ADC_InitStructure.ADC_NbrOfChannel = 1;//顺序进行规则转换的ADC通道的数目(根据ADC采集通道数量修改)                                                                                                                //修改六:通道数
        ADC_Init(ADC1, &ADC_InitStructure); //根据ADC_InitStruct中指定的参数初始化外设ADCx的寄存器
        //设置指定ADC的规则组通道,设置它们的转化顺序和采样时间
        //ADC1,ADC通道x,规则采样顺序值为y,采样时间为28周期                 
        ADC_RegularChannelConfig(ADC1, ADC_Channel_8, 1, ADC_SampleTime_28Cycles5);//ADC1选择信道x,采样顺序y,采样时间n个周期                                        //修改七:信道要改为对应引脚通道

        ADC_DMACmd(ADC1, ENABLE);// 开启ADC的DMA支持(要实现DMA功能,还需独立配置DMA通道等参数)
        ADC_Cmd(ADC1, ENABLE);//使能ADC1
        ADC_ResetCalibration(ADC1); //重置ADC1校准寄存器
        while(ADC_GetResetCalibrationStatus(ADC1));//等待ADC1校准重置完成
        ADC_StartCalibration(ADC1);//开始ADC1校准
        while(ADC_GetCalibrationStatus(ADC1));//等待ADC1校准完成
        ADC_SoftwareStartConvCmd(ADC1, ENABLE); //使能ADC1软件开始转换
}

使用特权

评论回复
50
纠结的那些年|  楼主 | 2023-8-26 18:05 | 只看该作者
#include "stm32f10x.h" //STM32头文件
#include "sys.h"
#include "delay.h"
#include "usart.h"

#include "adc.h"

extern vu16 ADC_DMA_IN5; //声明外部变量

int main (void){//主程序
        delay_ms(500); //上电时等待其他器件就绪
        RCC_Configuration(); //系统时钟初始化
        ADC_Configuration(); //ADC初始化设置
        USART1_Init(115200);
        while(1){
                printf("值:%0.3f\r\n",ADC_DMA_IN5*(3.3/4095));//光照公式
                delay_ms(500); //延时
        }
}

使用特权

评论回复
51
纠结的那些年|  楼主 | 2023-8-26 18:05 | 只看该作者
用途
温度光照传感器
使用的是 temp_light.c temp_light.h源文件
实验步骤:
1.初始化温度光照
2.使用GetTemp函数获取温度
3.使用GetLight函数获取光照
接线:
温度输出口:PC0
光照输出口:PC1

使用特权

评论回复
52
纠结的那些年|  楼主 | 2023-8-26 18:05 | 只看该作者
uint8_t GetTemp(){
        uint16_t temp;
        temp=GetADC_Time(TEMP_CH,10);
        printf("temp adc value:%d\r\n",temp);
        return calculateTemperature(calculateResValue(temp));
}

/***************************************************************
  *        @brief        获取一次光照值,以百分比的形式计算
  *        @param       
  *        @retval        float 光照值
****************************************************************/
//
float GetLight(){
        uint16_t        light;
        light=GetADC_Time(LIGHT_CH,10);
        printf("light adc value:%d\r\n",light);
        return 100-((float)light*1000/4096)*100/1000;
}

使用特权

评论回复
53
纠结的那些年|  楼主 | 2023-8-26 18:05 | 只看该作者
#include "usart1.h"
#include "delay.h"
#include <stdio.h>
#include "temp_light.h"

int main(){
        Byte temp[20];
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
        Usart1_Init(115200);
        delay_init();
        TEMP_LIGHT_Init();
        printf("runnning...\r\n");
        while(1){
                printf("temp:%d\r\n",GetTemp());
                printf("light:%d\r\n",GetLight());
                delay_ms(1000);
        }
}

使用特权

评论回复
54
纠结的那些年|  楼主 | 2023-8-26 18:05 | 只看该作者
五、DAC输出
步骤:
1.设置系统时钟
2.初始化DAC
3.DAC_OutVoltage(float Voltage)设置引脚输出电压值

使用特权

评论回复
55
纠结的那些年|  楼主 | 2023-8-26 18:06 | 只看该作者
接线:
DAC输出口
DAC_OUT1–PA4
DAC_OUT2–PA5

使用特权

评论回复
56
纠结的那些年|  楼主 | 2023-8-26 18:06 | 只看该作者
void DAC_Configuration(void)
{
  
        GPIO_InitTypeDef GPIO_InitStructure;
        DAC_InitTypeDef DAC_InitType;
        RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1,ENABLE);
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE );          //使能PORTA通道时钟
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_DAC, ENABLE );          //使能DAC通道时钟

        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;                                 // 端口配置
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;                  //模拟输入(STM32没有模拟输出模式,这里只好配置为模拟输入)
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOA, &GPIO_InitStructure);
                                       
        DAC_InitType.DAC_Trigger=DAC_Trigger_None;        //不使用触发功能 TEN1=0
        DAC_InitType.DAC_WaveGeneration=DAC_WaveGeneration_None;//不使用波形发生
        DAC_InitType.DAC_LFSRUnmask_TriangleAmplitude=DAC_LFSRUnmask_Bit0;//屏蔽、幅值设置
        DAC_InitType.DAC_OutputBuffer=DAC_OutputBuffer_Disable ;        //DAC1输出缓存关闭 BOFF1=1
  DAC_Init(DAC_Channel_1,&DAC_InitType);         //初始化DAC通道1

        DAC_Cmd(DAC_Channel_1, ENABLE);  //使能DAC1
  
  DAC_SetChannel1Data(DAC_Align_12b_R, 0);  //12位右对齐数据格式设置DAC值,默认输出0V

}
void DAC2_Configuration(void)
{
  
        GPIO_InitTypeDef GPIO_InitStructure;
        DAC_InitTypeDef DAC_InitType;
        RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA2,ENABLE);
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE );          //使能PORTA通道时钟
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_DAC, ENABLE );          //使能DAC通道时钟

        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;                                 // 端口配置
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;                  //模拟输入(STM32没有模拟输出模式,这里只好配置为模拟输入)
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOA, &GPIO_InitStructure);
                                       
        DAC_InitType.DAC_Trigger=DAC_Trigger_None;        //不使用触发功能 TEN1=0
        DAC_InitType.DAC_WaveGeneration=DAC_WaveGeneration_None;//不使用波形发生
        DAC_InitType.DAC_LFSRUnmask_TriangleAmplitude=DAC_LFSRUnmask_Bit0;//屏蔽、幅值设置
        DAC_InitType.DAC_OutputBuffer=DAC_OutputBuffer_Disable ;        //DAC1输出缓存关闭 BOFF1=1
  DAC_Init(DAC_Channel_2,&DAC_InitType);         //初始化DAC通道2

        DAC_Cmd(DAC_Channel_2, ENABLE);  //使能DAC2
  
  DAC_SetChannel2Data(DAC_Align_12b_R, 0);  //12位右对齐数据格式设置DAC值,默认输出0V

}

//设置通道1输出电压
// Voltage----电压值,取值范围为0~3.3V
void DAC1_OutVoltage(float Voltage)
{
        uint16_t data;
        data=(uint16_t)(Voltage*4095/3.3);//换算为12位整数值
        DAC_SetChannel1Data(DAC_Align_12b_R,data);//12位右对齐数据格式设置DAC值
        DAC_SoftwareTriggerCmd(DAC_Channel_1,ENABLE); //启动转换
}

void DAC2_OutVoltage(float Voltage)
{
        uint16_t data;
        data=(uint16_t)(Voltage*4095/3.3);//换算为12位整数值
        DAC_SetChannel2Data(DAC_Align_12b_R,data);//12位右对齐数据格式设置DAC值
        DAC_SoftwareTriggerCmd(DAC_Channel_2,ENABLE); //启动转换
}

使用特权

评论回复
57
纠结的那些年|  楼主 | 2023-8-26 18:06 | 只看该作者
#include "stm32f10x.h" //STM32
#include "sys.h"
#include "delay.h"
#include "usart.h"

#include "dac.h"


int main (void){
        float voltage=2;
        delay_ms(500); //
        RCC_Configuration(); // 系统时钟初始化
        DAC_Configuration(); //DAC初始化设置
        USART1_Init(115200);
        DAC1_OutVoltage(voltage);
        while(1){
                while(1)
        {
               
                delay_ms(1000);
               
                if (voltage<3.3)
                {voltage+=0.1;}
                else
                {voltage=0;}
                //voltage=3.3;
                DAC1_OutVoltage(voltage);
                while(USART_GetFlagStatus(USART1, USART_FLAG_TC)==RESET);
                printf("DAC输入的数字为:%d",(uint16_t)(voltage*4095/3.3));
                printf("DAC输出电压为:%.3f\n",voltage);
        }
        }
}

使用特权

评论回复
58
纠结的那些年|  楼主 | 2023-8-26 18:06 | 只看该作者
比赛总结:
熟悉stm32各个引脚的初始化,会各个模块的各种逻辑使用

使用特权

评论回复
59
houcs| | 2023-8-26 23:12 | 只看该作者
可使用PCTOLCD生成需要的点阵

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则