OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 2514|回复: 0

通用定时器PWM控制两个舵机,延时1秒旋转90度(无删版心路历程))

[复制链接]

28

主题

28

帖子

0

精华

初级会员

Rank: 2

积分
116
金钱
116
注册时间
2019-10-16
在线时间
18 小时
发表于 2019-11-24 21:13:30 | 显示全部楼层 |阅读模式
两个c文件访问同一个全局变量
(1)不用头文件

在file_a.c中定义一个全局变量:int flag ;
在file_b.c中:extern int flag;即可。
(2)利用头文件

在file_a.c中定义一个全局变量:int flag;
在common.h中定义:extern int flag;
然后在file_b.c中包含common.h文件即可。
注:file_a.c中不可包含头文件common.h。


我们使用STM32输出PWM时会使用定时器的PWM输出模式来进行生成,但是这样子生成PWM是有局限的,它只能生成四路频率相同的PWM,当你设定了TIMx_PSC(预分频寄存器)和TIMx_ARR(自动重装载寄存器),这时PWM的频率就被定下来了,为系统的时钟/TIMx_PSC+1/TIMx_ARR+1,你可以通过改变各个通道的CCR寄存器来改变占空比。但是如果我们想生成多路不同频率的PWM的话,使用这个方法只能使用多个定时器了,这样对于定时器资源较少的板子无疑是不可取的


<=、>= 是关系运算符,
&&、|| 是逻辑运算符
关系运算符的优先级大于逻辑运算符,所以会优先计算四个大小判断,假设x = 10;
原来的表达式:
x >= 1 && x <= 10 || x >= 200 && x <= 210
在执行完关系运算以后:
1 && 1 || 0 && 0
在这个表达式中,又因为&&运算符比||运算符的优先级高一级,所以会先进行&&运算,表达式变成:
1 || 0
最后进行 || 运算,得到结果:
1


简单说就是如果是多个else if的话,只要第一个if条件成立,即使满足else if的条件也不会执行else if及else的内容,如果是多个if的话,最后的else会执行的;else与最近的if匹配,包括else if 的if

led.h
  1. #ifndef __LED_H
  2. #define __LED_H

  3. void LED_Init(void);

  4. #define LED0 PBout(5)
  5. #define LED1 PEout(5)

  6. #endif
复制代码


led.c
  1. #include "led.h"
  2. #include "stm32f10x.h"

  3. void LED_Init(void)
  4. {
  5.         GPIO_InitTypeDef GPIO_InitStructure;
  6.        
  7.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOE,ENABLE);//使能GPIOA和GPIOB
  8.                                                                                                                                                                                                                                                                                                          //| 既是逻辑运算符也是位运算符;|| 只是逻辑运算符
  9.                                                                                                                                                                                                                                                                                                                 //| 不具有短路效果,即左边true,右边还会执行;
  10.         GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
  11.         GPIO_InitStructure.GPIO_Pin=GPIO_Pin_5;
  12.         GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
  13.         GPIO_Init(GPIOB,&GPIO_InitStructure);
  14.   GPIO_SetBits(GPIOB,GPIO_Pin_5);       
  15.        
  16.         GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
  17.         GPIO_InitStructure.GPIO_Pin=GPIO_Pin_5;
  18.         GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
  19.         GPIO_Init(GPIOE,&GPIO_InitStructure);       
  20.   GPIO_SetBits(GPIOE,GPIO_Pin_5);               
  21. }
复制代码


key.h
  1. #ifndef __KEY_H
  2. #define __key_h
  3. #include "sys.h"

  4. #define KEY0  GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_4)
  5. #define KEY1  GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_3)
  6. #define WK_UP GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0)//读取按键3(WK_UP)

  7. #define KEY0_PRES         1        //KEY0按下
  8. #define KEY1_PRES          2        //KEY1按下
  9. #define WKUP_PRES   3        //KEY_UP按下(即WK_UP/KEY_UP)


  10. void KEY_Init(void);//IO初始化
  11. u8 KEY_Scan(u8);          //按键扫描函数               


  12. #endif
复制代码


key.c
  1. #include "key.h"
  2. #include "delay.h"
  3. //#include "led.h"

  4. void KEY_Init(void) //IO初始化
  5. {
  6.         GPIO_InitTypeDef GPIO_InitStructure;

  7.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOE,ENABLE);//使能PORTA,PORTE时钟

  8.         GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_4|GPIO_Pin_3;//KEY0-KEY1
  9.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //设置成上拉输入
  10.         GPIO_Init(GPIOE, &GPIO_InitStructure);//初始化GPIOE4,3

  11.         //初始化 WK_UP-->GPIOA.0          下拉输入
  12.         GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_0;
  13.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; //PA0设置成输入,默认下拉          
  14.         GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.0

  15. }

  16. //mode:0,不支持连续按;1,支持连续按
  17. /*
  18. u8 KEY_Scan(u8 mode)
  19. {         
  20.         static u8 key_up=1;//按键按松开标志
  21.         if(mode)
  22.                 key_up=1;  //支持连按                  
  23.         if(key_up&&(KEY0==0||KEY1==0||WK_UP==1))
  24.         {
  25.                 delay_ms(10);//去抖动
  26.                 key_up=0;
  27.                 if(KEY0==0)
  28.                         return KEY0_PRES;
  29.                 else if(KEY1==0)
  30.                         return KEY1_PRES;
  31.                 else if(WK_UP==1)
  32.                         return WKUP_PRES;
  33.         }else if(KEY0==1&&KEY1==1&&WK_UP==0)
  34.         key_up=1;             
  35.         return 0;// 无按键按下
  36. }
  37. */

  38. u8 KEY_Scan(u8 mode)
  39. {         
  40.         static u8 flag=0;//TMD罪魁祸首就是你我真的是傻->->
  41.         static u8 key_up=1;//按键按松开标志
  42.        
  43.         if(mode)
  44.                 key_up=1;  //支持连按                  
  45.         if(key_up&&(KEY0==0||KEY1==0))//他不会再进来第二次了
  46.         {
  47.                 delay_ms(10);//去抖动
  48.                 key_up=0;
  49.                 if((KEY0==0)&&(KEY1==1))
  50.                 {
  51.                         flag=1;
  52.                         return 1;
  53.                 }
  54.                 if((KEY1==0)&&(KEY0==1))
  55.                 {
  56.                         flag=2;
  57.                         return 2;
  58.                 }
  59.                 if((KEY1==0)&&(KEY0==0))
  60.                 {
  61.                         //if(!flag)//现在这个灯的状态比较乱
  62.                         //LED0=!LED0;

  63.                         if(flag==1)
  64.                         {
  65.                                 //LED0=1;//说明确实没有进来
  66.                                 return 3;
  67.                         }
  68.                         if(flag==2)
  69.                         {
  70.                                 return 4;
  71.                                 //LED0=0;
  72.                         }
  73.                 }
  74.         }
  75.         if((KEY0==1)&&(KEY1==1))
  76.         {
  77.                 key_up=1;
  78.     flag=0;               

  79.         }
  80.         /*
  81.         if(KEY0==0&&KEY1==1)
  82.         {
  83.                 flag=0;
  84.                 return 3;
  85.         }
  86.         if(KEY0==1&&KEY1==0)
  87.         {
  88.                 flag=0;
  89.                 return 4;
  90.         }
  91.         */
  92.         return 0;// 无按键按下
  93. }
复制代码


pwm.h
  1. #ifndef __PWM_H
  2. #define __PWM_H

  3. #include "sys.h"

  4. void TIM3_PWM_Init1(u16 arr,u16 psc);
  5. void TIM3_PWM_Init2(u16 arr,u16 psc);


  6. #endif
复制代码


pwm.c
  1. #include "pwm.h"


  2. void TIM3_PWM_Init1(u16 arr,u16 psc)//PA.7
  3. {
  4.        
  5.         GPIO_InitTypeDef GPIO_InitStructure;
  6.         TIM_TimeBaseInitTypeDef TIM_TimeBaseInitstruct;
  7.         TIM_OCInitTypeDef TIM_OCInitStructure;
  8.        
  9.        
  10.         RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
  11.         //RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
  12.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
  13.        
  14.        
  15.         GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;
  16.         GPIO_InitStructure.GPIO_Pin=GPIO_Pin_7;
  17.         GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
  18.         GPIO_Init(GPIOA,&GPIO_InitStructure);
  19.   //GPIO_SetBits(GPIOA,GPIO_Pin_1);
  20.        
  21.         //GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3, ENABLE);
  22.        

  23.         TIM_TimeBaseInitstruct.TIM_ClockDivision=TIM_CKD_DIV1;
  24.         TIM_TimeBaseInitstruct.TIM_CounterMode=TIM_CounterMode_Up;
  25.         TIM_TimeBaseInitstruct.TIM_Period=arr;
  26.         TIM_TimeBaseInitstruct.TIM_Prescaler=psc;
  27.         TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitstruct);
  28.        

  29.         TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //选择 PWM 模式 2
  30.         TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
  31.         TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性高
  32.         TIM_OC2Init(TIM3, &TIM_OCInitStructure); //初始化 TIM3 OC1
  33.        
  34.         TIM_Cmd(TIM3, ENABLE);
  35.        
  36.         TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable);

  37.         //TIM_ARRPreloadConfig(TIM3,ENABLE);//为什么正点原子的教程里没有加这个函数,可没有这个除了例程别的引脚都没法动,加了一次之后就不需要要能控制舵机了
  38. }


  39. void TIM3_PWM_Init2(u16 arr,u16 psc)//PA.6
  40. {
  41.        
  42.         GPIO_InitTypeDef GPIO_InitStructure;
  43.         TIM_TimeBaseInitTypeDef TIM_TimeBaseInitstruct;
  44.         TIM_OCInitTypeDef TIM_OCInitStructure;
  45.        
  46.        
  47.         RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
  48.         //RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
  49.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
  50.        
  51.        
  52.         GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;
  53.         GPIO_InitStructure.GPIO_Pin=GPIO_Pin_6;
  54.         GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
  55.         GPIO_Init(GPIOA,&GPIO_InitStructure);
  56.   //GPIO_SetBits(GPIOA,GPIO_Pin_1);
  57.        
  58.         //GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3, ENABLE);
  59.        

  60.         TIM_TimeBaseInitstruct.TIM_ClockDivision=TIM_CKD_DIV1;
  61.         TIM_TimeBaseInitstruct.TIM_CounterMode=TIM_CounterMode_Up;
  62.         TIM_TimeBaseInitstruct.TIM_Period=arr;
  63.         TIM_TimeBaseInitstruct.TIM_Prescaler=psc;
  64.         TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitstruct);
  65.        

  66.         TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //选择 PWM 模式 2
  67.         TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
  68.         TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性高
  69.         TIM_OC1Init(TIM3, &TIM_OCInitStructure); //初始化 TIM3 OC1
  70.        
  71.         TIM_Cmd(TIM3, ENABLE);
  72.        
  73.         TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Enable);

  74.         //TIM_ARRPreloadConfig(TIM3,ENABLE);//为什么正点原子的教程里没有加这个函数,可没有这个除了例程别的引脚都没法动,加了一次之后就不需要要能控制舵机了
  75. }
复制代码


timer.h
  1. #ifndef __TIMER_H
  2. #define __TIMER_H

  3. #include "sys.h"

  4. void TIM2_Init(u16 arr,u16 psc);


  5. #endif
复制代码


timer.c
  1. #include "timer.h"
  2. #include "led.h"




  3. void TIM2_Init(u16 arr,u16 psc)
  4. {
  5.        
  6.         TIM_TimeBaseInitTypeDef TIM_TimeBaseInitstruct;
  7.          NVIC_InitTypeDef NVIC_InitStructure;
  8.        
  9.         RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);
  10.        
  11.         TIM_TimeBaseInitstruct.TIM_ClockDivision=TIM_CKD_DIV1;
  12.         TIM_TimeBaseInitstruct.TIM_CounterMode=TIM_CounterMode_Up;
  13.         TIM_TimeBaseInitstruct.TIM_Period=arr;
  14.         TIM_TimeBaseInitstruct.TIM_Prescaler=psc;
  15.         TIM_TimeBaseInit(TIM2,&TIM_TimeBaseInitstruct);
  16.        
  17.         TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);
  18.        
  19.         NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;                        //使能按键TIME2所在的中断通道
  20.   NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02;        //抢占优先级2,
  21.   NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x03;                                        //子优先级3
  22.   NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                                                                //使能TIM3中断通道
  23.   NVIC_Init(&NVIC_InitStructure);

  24.         TIM_Cmd(TIM2, ENABLE);        
  25.        
  26. }
复制代码


main.c
  1. #include "usart.h"

  2. u16 count=0;
  3. u16 mark1=0;
  4. u16 mark2=0;
  5. u16 flag1=0;
  6. u16 flag2=0;

  7. int main()
  8. {
  9.        
  10.         //u16 delay_time=500;
  11.         /*
  12.                 u16 i;
  13.                 u16 angle=57;
  14.                 u16 angle2=57;
  15.         */
  16.         //u16 times=0;
  17.        
  18.         delay_init();
  19.        
  20.         LED_Init();//多用了1个led初始化按键控制就有用了,原来是我忘记调用KEY_Init()函数,我TMD
  21.        
  22.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);       

  23.         TIM3_PWM_Init1(199,7199);
  24.         TIM3_PWM_Init2(199,7199);//这个改成59的时候为什么就不行了,同一个定时器只能生成一种PWM,不是一个
  25.        
  26.         uart_init(115200);
  27.         KEY_Init();
  28.         TIM2_Init(9,7199);//有这个时不会运行,为啥这个有错会影响后面的呢,函数里面参数没全部改过来
  29.        
  30.         while(1)
  31.         {
  32.                
  33.                
  34.                 /*
  35.                 if(count%500==0||1==KEY_Scan(1)||2==KEY_Scan(1)||3==KEY_Scan(1)||4==KEY_Scan(1))//为什么按下按键就不执行这个语句了,不打印,灯不闪,这个按键返回值有问题,好了,count计数到500的时候可能没有运行到这
  36.                 {                                                                         //同时按两个按键停了
  37.                         printf("%d  %d  %d %d/r/n",KEY_Scan(1),mark1,mark2,count);
  38.                         //LED0=!LED0;
  39.                 }
  40.                 */
  41.                
  42.                 //我的按键函数写的太复杂了,可以简化成
  43. /*
  44.                 if(KEY0==0)
  45.                 {
  46.                         if(flag1==0)
  47.                         {
  48.                                 mark1=count;
  49.                                 flag1=1;
  50.                         }
  51.                         if(count-mark1>=0)
  52.                         {
  53.                                 TIM_SetCompare1(TIM3,185);
  54.                         }
  55.           }
  56.                 else
  57.                 {
  58.                         TIM_SetCompare1(TIM3,185);
  59.                         flag1=0;
  60.                 }
  61.                
  62.                 if(KEY1==0)
  63.                 {
  64.                         if(flag2==0)
  65.                         {
  66.                                 mark2=count;
  67.                                 flag2=1;
  68.                         }
  69.                         if(count-mark1>=0)
  70.                         {
  71.                                 TIM_SetCompare1(TIM3,185);
  72.                         }
  73.           }
  74.                 else
  75.                 {
  76.                         TIM_SetCompare1(TIM3,185);
  77.                         flag2=0;
  78.                 }
  79. */               
  80.                
  81.                
  82.                
  83.                
  84.                
  85.        
  86.                 if((count-mark1>=1000)&&(flag1==1))
  87.                 {
  88.                         TIM_SetCompare1(TIM3,185);
  89.                 }
  90.                 if((count-mark2>=1000)&&(flag2==1))
  91.                 {
  92.                         TIM_SetCompare2(TIM3,185);
  93.                 }

  94.                 if(1==KEY_Scan(1))
  95.                 {
  96.                         if(flag1==0)
  97.                         {
  98.                                 mark1=count;
  99.                                 flag1=1;
  100.                         }
  101.                         if(flag2==1)
  102.                                 flag2=0;
  103.                         TIM_SetCompare2(TIM3,195);
  104.                 }

  105.                 if(2==KEY_Scan(1))
  106.                 {
  107.                         if(flag2==0)
  108.                         {
  109.                                 mark2=count;
  110.                                 flag2=1;
  111.                         }
  112.                         if(flag1==1)
  113.                                 flag1=0;
  114.                         TIM_SetCompare1(TIM3,195);
  115.                 }
  116.                
  117.                 if(3==KEY_Scan(1))
  118.                 {
  119.                         if(flag2==0)
  120.                         {
  121.                                 mark2=count;
  122.                                 flag2=1;
  123.                         }
  124.                 }
  125.                 if(4==KEY_Scan(1))
  126.                 {
  127.                         if(flag1==0)
  128.                         {
  129.                                 mark1=count;
  130.                                 flag1=1;
  131.                         }
  132.                 }
  133.                 if(0==KEY_Scan(1))
  134.                 {
  135.                         flag1=0;
  136.                         flag2=0;
  137.                         TIM_SetCompare1(TIM3,195);
  138.                         TIM_SetCompare2(TIM3,195);
  139.                 }

  140.                 /*
  141.                 if(count%500==0)
  142.                 {
  143.                         printf("%d  %d  %d  %d  %d\n",count,mark1,mark2,flag1,flag2);
  144.                 }
  145.                 */
  146.                
  147.                 /*
  148.                 if(times%100==0)
  149.                 {
  150.                  printf("%d  %d  %d\n",count,mark1,mark2);
  151.                 LED0=0;
  152.                
  153.                 }
  154.                 times++;
  155.                 delay_ms(20);
  156.                 if(times%200==0)
  157.                 {
  158.                 printf("1111");
  159.                 LED0=1;
  160.                 }
  161.                 */
  162.                
  163.                
  164.                 /*即时按键控制
  165.                 if(1==KEY_Scan(1))
  166.                 {
  167.                         TIM_SetCompare2(TIM3,185);
  168.                         delay_ms(delay_time);
  169.                         LED0=0;            
  170.                 }
  171.                 TIM_SetCompare2(TIM3,195);
  172.                 if(2==KEY_Scan(1))
  173.                 {
  174.                         TIM_SetCompare1(TIM3,185);
  175.                         delay_ms(delay_time);
  176.                         LED0=0;            
  177.                 }
  178.                 TIM_SetCompare1(TIM3,195);
  179.                 */
  180.                
  181.                
  182.                
  183.                 /*
  184.                 KEY_Scan(0);
  185.                 if(count-mark1==1000)
  186.                 {
  187.                         TIM_SetCompare2(TIM3,185);
  188.                 }
  189.                 if(count-mark2==1000)
  190.                 {
  191.                         TIM_SetCompare1(TIM3,51);
  192.                 }
  193.                 */
  194.                 /*
  195.                 for(i=0;i<4;i++)
  196.                 {
  197.                         delay_ms(delay_time);
  198.                         TIM_SetCompare2(TIM3,angle);
  199.                         angle-=5;
  200.                         }
  201.                 for(i=0;i<4;i++)
  202.                 {
  203.                         delay_ms(delay_time);
  204.                         TIM_SetCompare2(TIM3,angle);
  205.                         angle+=5;
  206.                 }
  207.                
  208.                 for(i=0;i<4;i++)
  209.                 {
  210.                         delay_ms(delay_time);
  211.                         TIM_SetCompare1(TIM3,angle2);
  212.                         angle2-=5;
  213.                         }
  214.                 for(i=0;i<4;i++)
  215.                 {
  216.                         delay_ms(delay_time);
  217.                         TIM_SetCompare1(TIM3,angle2);
  218.                         angle2+=5;
  219.                 }
  220.                 */
  221.                
  222.                 /*
  223.                 if(1==KEY_Scan(1))//mode=0时可以返回0,mode=1时返回1,没按键
  224.                 {
  225.                         TIM_SetCompare2(TIM3,185);
  226.                         delay_ms(delay_time);
  227.                         LED0=0;            //多用LED指示状态,为什么led不亮
  228.                 }
  229.                
  230.                 if(2==KEY_Scan(1))//mode=0时可以返回0,mode=1时返回1,没按键
  231.                 {
  232.                         TIM_SetCompare1(TIM3,185);
  233.                         delay_ms(delay_time);
  234.                         LED0=0;            //多用LED指示状态,为什么led不亮
  235.                 }
  236.                
  237.                 TIM_SetCompare2(TIM3,180);
  238.                 delay_ms(delay_time);
  239.                 TIM_SetCompare2(TIM3,175);
  240.                 delay_ms(delay_time);
  241.                 TIM_SetCompare1(TIM3,180);
  242.                 delay_ms(delay_time);
  243.                 TIM_SetCompare1(TIM3,175);
  244.                 delay_ms(delay_time);
  245.                 LED0=1;
  246.                 LED1=0;
  247.                
  248.     */
  249.                 /*
  250.                 if(2==KEY_Scan(0))
  251.                 {
  252.                         TIM_SetCompare1(TIM3,185);
  253.                         delay_ms(delay_time);
  254.                 }
  255.                 */
  256.         }       
  257.                
  258. }
复制代码

























正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-25 08:06

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表