CH579动态调整TIM2 END周期PWM丢失


代码里更新END寄存值,按手册理解会自动清零COUNT,此时PWM应该根据POLAR输出对应的状态,实际测试没有输出保持了上一次的状态继续到下一个周期开始才会

测试代码如下:

  void TMR1_IRQHandler( void )

  {

    GPIOA_SetBits(GPIO_Pin_4);

    

    R8_TMR1_INT_FLAG = 0xff;

    

    R32_TMR2_CNT_END = 640000;

    R8_TMR2_CTRL_MOD = RB_TMR_COUNT_EN | RB_TMR_OUT_EN;//start

    

    GPIOA_ResetBits(GPIO_Pin_4);

  }

  

  void TimInit(void)

  {

    PWR_UnitModCfg(DISABLE, UNIT_SYS_LSE);     // 注意此引脚是LSE晶振引脚,要保证关闭才能使用其他功能

    GPIOA_ResetBits(GPIO_Pin_11);            // 配置PWM口 PA11

    GPIOA_ModeCfg(GPIO_Pin_11, GPIO_ModeOut_PP_5mA);

    

    GPIOA_ResetBits(GPIO_Pin_4); 

    GPIOA_ModeCfg(GPIO_Pin_4, GPIO_ModeOut_PP_5mA);

    

    R8_TMR2_CTRL_MOD = RB_TMR_ALL_CLEAR;

    R32_TMR2_CNT_END = 640000;

    R8_TMR2_CTRL_MOD = 0;//RB_TMR_OUT_POLAR;

    R32_TMR2_FIFO = 32000;//1ms

    //R8_TMR2_CTRL_MOD = RB_TMR_OUT_POLAR | RB_TMR_COUNT_EN | RB_TMR_OUT_EN;//start

    

    R8_TMR1_CTRL_MOD = RB_TMR_ALL_CLEAR;                                     /* 清除所有计数值 */

    R32_TMR1_CNT_END = 320000*5;                                 /* 设置定时时间 */

    R8_TMR1_CTRL_MOD = 0;                                      /* 设置定时器模式 */

    //R8_TMR1_INT_FLAG = R8_TMR1_INT_FLAG;                                  /* 清除标志 */

    R8_TMR1_INTER_EN = RB_TMR_IE_CYC_END;                                   /* 定时中断 */

    R8_TMR1_CTRL_MOD = RB_TMR_COUNT_EN;

    NVIC_EnableIRQ(TMR1_IRQn);

  }

PWM_LOST.png

微信已回复,请注意查收。


这个BUG解决办法如下:

R32_TMR2_CNT_END寄存器先设置为最小3;然后设置为正确的周期即可

  void TMR1_IRQHandler( void )

  {

    GPIOA_SetBits(GPIO_Pin_4);

  

    R8_TMR1_INT_FLAG = 0xff;

    

    R32_TMR2_CNT_END = 3;//set min value to fix pwm lost bug

    R32_TMR2_CNT_END = 640000;


    R8_TMR2_CTRL_MOD = RB_TMR_COUNT_EN | RB_TMR_OUT_EN;//start

  

    GPIOA_ResetBits(GPIO_Pin_4);

  }




只有登录才能回复,可以选择微信账号登录