问答

汇集网友智慧,解决技术难题

21ic问答首页 - GD32F303定时器捕获频率出现问题

PWM 定时器 触发 GD32F303 更新 遇到

GD32F303定时器捕获频率出现问题

xiaohuyu2025-12-02
捕获PWM频率时,采用从触发,每次进入捕获中断时将定时器复位,同时打开更新中断,当定时器更新时将频率值设置为最大值,遇到的问题是,在捕获中断中捕获到的值不正常,怀疑没有自动复位于是在捕获中断中手动将CNT的值复位,现在遇到的问题是误触发更新中断,无法正常捕获频率,但在捕获中断中断点等待一会,再运行程序,捕获到的值就正常了。

回答 +关注 1
4255人浏览 8人回答问题 分享 举报
8 个回答
  • 建议捕获中采用类似
    while (HAL_IC***** != HAL_OK){;}
    之类的确认就可以了,我以前出现过很多类似的事件,
    例如 HAL_PWM_Start(),经常有没按我想象的时间启动,总有个"启动"过程。
    以前的例程这些都有,但后来发现没有也可以,所以大家慢慢都省了,其实
    在逻辑和时间要求严格的地方,是不可以的!
  • 不要在中断中重复操作硬件寄存器
  • 从触发模式自动复位 CNT无需手动干预。
  • 增加输入滤波抑制噪声
  • 移除手动复位 CNT 的操作,从触发模式已经会自动复位 CNT,无需在中断中再次复位。
  • 更新中断应仅用于超时处理,避免与捕获中断冲突。
  • 可能由于定时器未正确复位或从触发模式配置不当。
  •   /************************IO口配置******************************/  
      rcu_periph_clock_enable(RCU_TIMER2);
      nvic_irq_enable(TIMER2_IRQn,1,0);
      BSP_IntVectSet(BSP_INT_ID_TIM3, BSP_TIM_Capture_IRQHandler);
      gpio_init(GPIOA,GPIO_MODE_IN_FLOATING,GPIO_OSPEED_50MHZ,GPIO_PIN_7);
      
      /************************定时器配置****************************/
      FANCAPTURETIM.prescaler=19;
      FANCAPTURETIM.alignedmode=TIMER_COUNTER_EDGE;
      FANCAPTURETIM.counterdirection=TIMER_COUNTER_CENTER_UP;
      FANCAPTURETIM.period=63999;
      FANCAPTURETIM.clockdivision=TIMER_CKDIV_DIV1;
      timer_init(TIMER2,&FANCAPTURETIM);
      
      timer_auto_reload_shadow_enable(TIMER2);//使能自动装载影子寄存器
      timer_internal_clock_config(TIMER2);    //配置为内部时钟模式

      sConfigIC.icpolarity = TIMER_IC_POLARITY_RISING;
      sConfigIC.icselection = TIMER_IC_SELECTION_DIRECTTI;
      sConfigIC.icprescaler = TIMER_IC_PSC_DIV1;
      sConfigIC.icfilter = 0;
      timer_input_capture_config( TIMER2 , TIMER_CH_1 , &sConfigIC);
      
      timer_input_trigger_source_select(TIMER2,TIMER_SMCFG_TRGSEL_CI1FE1);
      timer_slave_mode_select(TIMER2,TIMER_SLAVE_MODE_RESTART);
      timer_master_slave_mode_config(TIMER2,TIMER_MASTER_SLAVE_MODE_ENABLE);
      
      timer_interrupt_flag_clear(TIMER2,TIMER_INT_FLAG_UP);
      timer_interrupt_enable(TIMER2,TIMER_INT_UP);
      
      timer_interrupt_flag_clear(TIMER2,TIMER_INT_FLAG_CH1);
      timer_interrupt_enable(TIMER2,TIMER_INT_CH1);
      timer_enable(TIMER2);

    ////////////////***********中断函数如下****************////////////////////////

    if(timer_interrupt_flag_get(TIMER2,TIMER_INT_FLAG_CH1))
      {
        timer_interrupt_flag_clear(TIMER2,TIMER_INT_FLAG_CH1);
        timer_counter_value_config(TIMER2,0);
        g_motor_speed_val = timer_channel_capture_value_register_read(TIMER2,TIMER_CH_1)+1;

      }
      if(timer_interrupt_flag_get(TIMER2,TIMER_INT_FLAG_UP))
      {
        timer_interrupt_flag_clear(TIMER2,TIMER_INT_FLAG_UP);
        g_motor_speed_val = 0xffff;
      }


您需要登录后才可以回复 登录 | 注册