搜索
bottom↓
回复: 9

<分享>STM32输出可控数量的pwm波形

[复制链接]

出0入53汤圆

发表于 2022-10-29 13:17:37 | 显示全部楼层 |阅读模式
在做步进电机驱动程序,想让电机按一定速度运行一定角度,于是采用了

一个主定时器产生pwm,另外一个从定时器负责发送脉冲数量的计数

STM32F103VE 时钟72MHz

实现:输出可控数量与频率的脉冲(pwm)

使用一个(主)定时器作为另一个(从)定时器的预分频器(外部时钟触发源)

本例子通过<df_MAIN_TIM_1_OR_8>修改可以实现TIM1和TIM8主的切换产生PWM信号,TIM2作为从定时器,用于对主定时器的计数,计数到达设定数量,停止pwm输出

TIM8已验证功能-ok;TIM1仿真运行正常,输出未验证


  1. #define df_MAIN_TIM_1                        0                                        //主定时器1
  2. #define df_MAIN_TIM_8                        1                                        //主定时器8
  3. #define df_MAIN_TIM_1_OR_8                df_MAIN_TIM_8                //定时器选择

  4. void TIM1_MasterPwmOutInit(void);
  5. void TIM8_MasterPwmOutInit(void);

  6. //TIM1_主pwm输出初始化
  7. void TIM1_MasterPwmOutInit(void){
  8. GPIO_InitTypeDef GPIO_InitStructure;
  9. TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
  10. TIM_OCInitTypeDef  TIM_OCInitStructure;
  11. //pwm频率=72000000/psc/arr  这里为了测试设置了1Hz用于led观测
  12. unsigned short arr=10000;//周期
  13. unsigned short psc=7200;//分频
  14.        
  15.     RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_TIM1 , ENABLE); //时钟使能

  16.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;                   //TIM1_CH4 PA11
  17.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;             //复用推挽输出
  18.     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  19.     GPIO_Init(GPIOA, &GPIO_InitStructure);

  20.     TIM_TimeBaseStructure.TIM_Period = arr-1;                 //使用Cycle来控制频率(f=72/(71+1)/Cycle)  当Cycle为100时脉冲频率为10KHZ                           
  21.     TIM_TimeBaseStructure.TIM_Prescaler = psc-1;                    //设置用来作为TIMx时钟频率除数的预分频值                                                     
  22.     TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;     //设置时钟分割:TDTS= Tck_tim            
  23.     TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上计数模式
  24.     TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;            //重复计数,一定要=0!!!(高级定时器特有)
  25.     TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure);                                       

  26.     TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;                          //选择定时器模式:TIM脉冲宽度调制模式1      
  27.     TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;         //比较输出使能
  28.     TIM_OCInitStructure.TIM_Pulse = psc/2-1;                            //设置待装入捕获寄存器的脉冲值(占空比:默认50%,这可也可以调节如果需要的话将它作为一个参数传入即可)                                   
  29.     TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;              //输出极性      

  30.     TIM_OC4Init(TIM1, &TIM_OCInitStructure);                                        //使能通道4                                                

  31.     TIM_SelectMasterSlaveMode(TIM1, TIM_MasterSlaveMode_Enable);        //设置为主从模式
  32.     TIM_SelectOutputTrigger(TIM1, TIM_TRGOSource_Update);                        //选择定时器1的触发方式(使用更新事件作为触发输出)
  33.    

  34.     TIM_OC4PreloadConfig(TIM1, TIM_OCPreload_Enable);               //使能通道4预装载寄存器   
  35.        
  36.     TIM_ARRPreloadConfig(TIM1, ENABLE);                             //使能TIM1在ARR上的预装载寄存器  
  37.        
  38.     //TIM_CtrlPWMOutputs(TIM1, ENABLE);                                                           //高级定时器一定要加上,主输出使能     
  39. }

  40. //TIM8_pwm输出初始化
  41. void TIM8_MasterPwmOutInit(void){
  42. GPIO_InitTypeDef GPIO_InitStructure;
  43. TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
  44. TIM_OCInitTypeDef  TIM_OCInitStructure;
  45. //pwm频率=72000000/psc/arr  这里为了测试设置了1Hz用于led观测
  46. unsigned short arr=10000;//周期
  47. unsigned short psc=7200;//分频
  48.        
  49. {
  50.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM8, ENABLE);
  51.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC | RCC_APB2Periph_AFIO, ENABLE);  //使能GPIO外设和AFIO复用功能模块时钟使能
  52.        
  53.         //PC6-CH1
  54.         //PC7-CH2
  55.         //PC8-CH3 cut_pwm
  56.         //PC9-CH4 out_pwm
  57.         //GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9;//初始化GPIO
  58.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9;//初始化GPIO
  59.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;                                                  //复用推挽输出
  60.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  61.         GPIO_Init(GPIOC, &GPIO_InitStructure);
  62.                
  63.         TIM_TimeBaseStructure.TIM_Period = arr;                                                                 //设置在下一个更新事件装入活动的自动重装载寄存器周期的值
  64.         TIM_TimeBaseStructure.TIM_Prescaler =psc;                                                                 //设置用来作为TIMx时钟频率除数的预分频值  72MHz/(psc+1)/(arr+1)=频率
  65.         TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;                                 //设置时钟分割:TDTS = Tck_tim
  66.         TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;                          //TIM向上计数模式
  67.     TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;                                    //重复计数,一定要=0!!!(高级定时器特有)<<<这里必须设置否则从计数器不正常
  68.         TIM_TimeBaseInit(TIM8, &TIM_TimeBaseStructure);                                                 //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位
  69.          
  70. //        {//CH1
  71. //                TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;                                                 //选择定时器模式:TIM脉冲宽度调制模式1
  72. //                TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;                        //使能/失能OCx管脚
  73. //                TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable;                 //使能/失能OCxN管脚(使用OCxN必须使能TIM_OutputState)
  74. //                TIM_OCInitStructure.TIM_Pulse = arr+1;                                                                         //设置待装入捕获比较寄存器的脉冲值
  75. //                TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;                                 //输出极性:TIM输出比较极性高
  76. //                TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_Low;                                //输出极性
  77. //                TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Set;                                //BDTR寄存器的MOE为0时对应管脚状态
  78. //                TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCIdleState_Reset;                        //BDTR寄存器的MOE为0时对应管脚状态
  79. //                TIM_OC1Init(TIM8, &TIM_OCInitStructure);                                                                  //根据TIM_OCInitStruct中指定的参数初始化外设TIMx
  80. //               
  81. //                TIM_OC1PreloadConfig(TIM8, TIM_OCPreload_Enable);                                                  //使能TIMx在CCR2上的预装载寄存器
  82. //        }
  83. //        {//CH2
  84. //                TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;                                                 //选择定时器模式:TIM脉冲宽度调制模式1
  85. //                TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;                        //使能/失能OCx管脚
  86. //                TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable;                 //使能/失能OCxN管脚(使用OCxN必须使能TIM_OutputState)
  87. //                TIM_OCInitStructure.TIM_Pulse = arr+1;                                                                         //设置待装入捕获比较寄存器的脉冲值
  88. //                TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;                                 //输出极性:TIM输出比较极性高
  89. //                TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_Low;                                //输出极性
  90. //                TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Set;                                //BDTR寄存器的MOE为0时对应管脚状态
  91. //                TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCIdleState_Reset;                        //BDTR寄存器的MOE为0时对应管脚状态
  92. //                TIM_OC2Init(TIM8, &TIM_OCInitStructure);                                                                  //根据TIM_OCInitStruct中指定的参数初始化外设TIMx
  93. //               
  94. //                TIM_OC2PreloadConfig(TIM8, TIM_OCPreload_Enable);                                                  //使能TIMx在CCR2上的预装载寄存器
  95. //        }
  96.         {//CH3
  97.                 TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;                                                 //选择定时器模式:TIM脉冲宽度调制模式1
  98.                 TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;                        //使能/失能OCx管脚
  99.                 TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable;                 //使能/失能OCxN管脚(使用OCxN必须使能TIM_OutputState)
  100.                 TIM_OCInitStructure.TIM_Pulse = arr/2-1;                                                                 //设置待装入捕获比较寄存器的脉冲值 占空比
  101.                 TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;                                 //输出极性:TIM输出比较极性高
  102.                 TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_Low;                                //输出极性
  103.                 TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Set;                                //BDTR寄存器的MOE为0时对应管脚状态
  104.                 TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCIdleState_Reset;                        //BDTR寄存器的MOE为0时对应管脚状态
  105.                 TIM_OC3Init(TIM8, &TIM_OCInitStructure);                                                                  //根据TIM_OCInitStruct中指定的参数初始化外设TIMx
  106.                
  107.                 TIM_OC3PreloadConfig(TIM8, TIM_OCPreload_Enable);                                                  //使能TIMx在CCR2上的预装载寄存器
  108.         }
  109.         {//CH4
  110.                 TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;                                                 //选择定时器模式:TIM脉冲宽度调制模式1
  111.                 TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;                        //使能/失能OCx管脚
  112.                 TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable;                 //使能/失能OCxN管脚(使用OCxN必须使能TIM_OutputState)
  113.                 TIM_OCInitStructure.TIM_Pulse = arr/2-1;                                                                 //设置待装入捕获比较寄存器的脉冲值 占空比
  114.                 TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;                                 //输出极性:TIM输出比较极性高
  115.                 TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_Low;                                //输出极性
  116.                 TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Reset;                        //BDTR寄存器的MOE为0时对应管脚状态
  117.                 TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCIdleState_Reset;                        //BDTR寄存器的MOE为0时对应管脚状态
  118.                 TIM_OC4Init(TIM8, &TIM_OCInitStructure);                                                                  //根据TIM_OCInitStruct中指定的参数初始化外设TIMx
  119.                
  120.                 TIM_OC4PreloadConfig(TIM8, TIM_OCPreload_Enable);                                                  //使能TIMx在CCR2上的预装载寄存器
  121.         }
  122.        
  123.         TIM_ARRPreloadConfig(TIM8, ENABLE);                                                                                 //使能TIMx在ARR上的预装载寄存器
  124.        
  125.        
  126. //        TIM_CtrlPWMOutputs(TIM8, ENABLE);                                                                                //TIM8->BDTR|=1<<15; 主输出MOE
  127.        
  128. //        TIM_Cmd(TIM8, ENABLE);                                                                                                  //使能TIMx外设
  129.         TIM_SetCompare3(TIM8,arr/2-1);                                                                                        //TIM8->CCR2 = x;更改占空比(设置范围0~arr)
  130.         TIM_SetCompare3(TIM8,arr/2-1);                                                                                        //TIM8->CCR2 = x;更改占空比(设置范围0~arr)
  131.        
  132. }               
  133.         {//设置为主从模式
  134.                 TIM_SelectMasterSlaveMode(TIM8, TIM_MasterSlaveMode_Enable);        //设置为主从模式
  135.                 TIM_SelectOutputTrigger(TIM8, TIM_TRGOSource_Update);                        //选择定时器1的触发方式(使用更新事件作为触发输出)        
  136.         }       
  137.                      
  138. }

  139. //TIM2从计数定时器初始化
  140. //设定脉冲数量后面可以通过TIM_SetAutoreload(TIM2,X);修改,这里预设了一个数值
  141. void TIM2_SlaveCountInit(void){
  142. TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
  143. NVIC_InitTypeDef NVIC_InitStructure;
  144. unsigned short PulseNum = 65535;                                                        //预设脉冲数
  145.        
  146. RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);                //使能定时器2的时钟
  147.        
  148.     TIM_TimeBaseStructure.TIM_Period = PulseNum-1;                           //脉冲数
  149.     TIM_TimeBaseStructure.TIM_Prescaler =0;   
  150.     TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;     
  151.     TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  
  152.     TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);  

  153. #if (df_MAIN_TIM_1_OR_8 == df_MAIN_TIM_1)
  154.     TIM_SelectInputTrigger(TIM2, TIM_TS_ITR0);                                        //选择定时器2的输入触发源(内部触发(TIM1))
  155. #elif (df_MAIN_TIM_1_OR_8 == df_MAIN_TIM_8)
  156.         TIM_SelectInputTrigger(TIM2, TIM_TS_ITR1);                                        //选择定时器2的输入触发源(内部触发(TIM8))
  157. #endif //df_MAIN_TIM_1_OR_8
  158.                                  
  159.         TIM_SelectSlaveMode(TIM2,TIM_SlaveMode_External1);                     //TIM2->SMCR|=0x07;设置从模式寄存器(SMS[2:0]:111 外部时钟模式1)

  160.     TIM_ITConfig(TIM2,TIM_IT_Update,DISABLE);                                        //更新中断失能

  161.     NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;        
  162.     NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
  163.     NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;     
  164.     NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  165.     NVIC_Init(&NVIC_InitStructure);                                                                //定时器2中断初始化
  166. }

  167. //定时器_主从_pwm计数_初始化
  168. void TIM_MasterSlave_PWMCount_Init(void){       
  169.     TIM2_SlaveCountInit();                                                //初始化 (从定时器)
  170.     TIM_ClearITPendingBit(TIM2,TIM_IT_Update);        //清除中断标志位
  171.     TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);        //使能更新中断
  172.        
  173. #if (df_MAIN_TIM_1_OR_8 == df_MAIN_TIM_1)       
  174.     TIM1_MasterPwmOutInit();                                                //使能定时器1(主定时器)   
  175. #elif (df_MAIN_TIM_1_OR_8 == df_MAIN_TIM_8)
  176.         TIM8_MasterPwmOutInit();                                                //使能定时器1(主定时器)
  177. #endif //df_MAIN_TIM_1_OR_8
  178. }

  179. //定时器_主从_pwm计数_开始
  180. //PulseNum :用于设定输出脉冲的数量
  181. void TIM_MasterSlave_PWMCount_Start(unsigned short PulseNum){
  182.         PulseNum = (PulseNum>1?PulseNum-1:PulseNum); //这里的数值不能为0,为0后TIM2将失效; 设置数-1为需要的脉冲数
  183.     TIM_Cmd(TIM2, ENABLE);                                                //使能TIM2 (从定时器)
  184.         TIM_SetAutoreload(TIM2,PulseNum);                        //设置脉冲数量
  185.         TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);        //使能更新中断
  186.        
  187. #if (df_MAIN_TIM_1_OR_8 == df_MAIN_TIM_1)            
  188.     TIM_Cmd(TIM1, ENABLE);                                                //使能定时器1
  189.         TIM_CtrlPWMOutputs(TIM1, ENABLE);                   //高级定时器一定要加上,主输出使能
  190. #elif (df_MAIN_TIM_1_OR_8 == df_MAIN_TIM_8)
  191.     TIM_Cmd(TIM8, ENABLE);                                                //使能定时器8
  192.         TIM_CtrlPWMOutputs(TIM8, ENABLE);                   //高级定时器一定要加上,主输出使能
  193. #endif //df_MAIN_TIM_1_OR_8
  194. }

  195. //当TIM的CNT寄存器的值到达设定的Update值会触发更新中断,此时设定的脉冲数已输出完毕,关闭TIM1和TIM2
  196. void TIM2_IRQHandler(void){
  197.     if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET){         //TIM_IT_Update
  198.      
  199.         TIM_ClearITPendingBit(TIM2, TIM_IT_Update);         // 清除中断标志位
  200. #if (df_MAIN_TIM_1_OR_8 == df_MAIN_TIM_1)       
  201.         TIM_CtrlPWMOutputs(TIM1, DISABLE);                          //主输出失能
  202.         TIM_Cmd(TIM1, DISABLE);                                                 //关闭定时器
  203. #elif (df_MAIN_TIM_1_OR_8 == df_MAIN_TIM_8)               
  204.         TIM_CtrlPWMOutputs(TIM8, DISABLE);                          //主输出失能
  205.         TIM_Cmd(TIM8, DISABLE);                                                 //关闭定时器
  206. #endif //df_MAIN_TIM_1_OR_8
  207.         TIM_Cmd(TIM2, DISABLE);                                                 //关闭定时器
  208.         TIM_ITConfig(TIM2, TIM_IT_Update, DISABLE);         //关闭TIM2更新中断
  209.     }
  210. }


  211. u8 ksw=0;
  212. void tim_test_co(void){
  213.         TIM_MasterSlave_PWMCount_Init();//初始化
  214.         while(1)
  215.         {
  216.                 if(ksw){
  217.                         ksw = 0;
  218.                         TIM_MasterSlave_PWMCount_Start(3);//启动3个pwm
  219.                 }
  220.         }
  221. }
复制代码

阿莫论坛20周年了!感谢大家的支持与爱护!!

月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!

出0入0汤圆

发表于 2022-10-29 14:12:55 | 显示全部楼层
感谢分享。。。

出0入0汤圆

发表于 2022-10-29 21:05:57 来自手机 | 显示全部楼层
感谢分享。。

出100入85汤圆

发表于 2022-10-30 13:11:17 来自手机 | 显示全部楼层
18年VIP++,牛

出0入53汤圆

 楼主| 发表于 2022-10-31 11:16:20 | 显示全部楼层
whatcanitbe 发表于 2022-10-30 13:11
18年VIP++,牛
(引用自4楼)

一直到我退休了

出0入4汤圆

发表于 2022-10-31 15:25:26 | 显示全部楼层
zhcj66 发表于 2022-10-31 11:16
一直到我退休了
(引用自5楼)

可能会多几个脉冲,你可以控控多种数量的,比如从几个到几千,印象中有这毛病。

出0入0汤圆

发表于 2022-11-3 16:37:53 | 显示全部楼层
这个控制方法以前用,后来参考别人的帖子,改成DMA 方式了  看看 我的帖子  占用资源少,一路可控只用一个定时器就能实现了,而且用DMA 方式,不占CPU

出0入53汤圆

 楼主| 发表于 2022-11-4 08:13:18 | 显示全部楼层
kyq_linux 发表于 2022-10-31 15:25
可能会多几个脉冲,你可以控控多种数量的,比如从几个到几千,印象中有这毛病。

...
(引用自6楼)

启用了CCR1和CCR2,在CCR1=0  CCR2 = 50(方波 占空比50%) ,启动输出,CCR1管脚会出现几个脉冲就消失了,不知道你遇到过吗?

出0入53汤圆

 楼主| 发表于 2022-11-4 08:18:30 | 显示全部楼层
磊磊映画 发表于 2022-11-3 16:37
这个控制方法以前用,后来参考别人的帖子,改成DMA 方式了  看看 我的帖子  占用资源少,一路可控只用一个 ...
(引用自7楼)

https://www.amobbs.com/thread-5758539-1-1.html

<STM32驱动步进电机精确可控输出脉冲个数方案及对比>
7.定时器CHx独立通道dma,改变dma传输长度控制个数(上一个用的溢出dma一个定时器只能产生一路有点浪费,改成用通道dma)
                                                              一个定时器可以产生3路或4路,dma限制不能是4,例如定时器5、8可以4路
                                                               优点:能读取剩余脉冲个数
                                                               可变占空比,周期,用于可以调速等         缺点:好像没哈缺点

这个DMA确实更好

出0入0汤圆

发表于 2022-11-4 17:37:23 | 显示全部楼层
zhcj66 发表于 2022-11-4 08:18
https://www.amobbs.com/thread-5758539-1-1.html


(引用自9楼)

嗯,做了两个项目实战得来的  
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-24 05:05

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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