关于CH32X033通用定时器作为计数器使用的问题

你好, 我将X033的TIM3用作计数器模式, 想实现100us中断一次, 但自己实现后发现频率不正确, 代码如下:

void TIM3_Init( uint16_t arr, uint16_t psc )
{
    TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure = { 0 };
    NVIC_InitTypeDef NVIC_InitStructure = { 0 };

    /**
     * 100us:
     *          arr = 100 - 1
     *          psc = SystemCoreClock / 1,000,000 - 1
     */

    /* Initialize Timer3 */
    TIM_TimeBaseStructure.TIM_Period = arr;
    TIM_TimeBaseStructure.TIM_Prescaler = psc;
    TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
    TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
    TIM_TimeBaseInit( TIM3, &TIM_TimeBaseStructure );

    TIM_ITConfig( TIM3, TIM_IT_Update, ENABLE );

    NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init( &NVIC_InitStructure );

    // TIM_SelectOutputTrigger(TIM3, TIM_TRGOSource_Update);

    /* Enable Timer3 */
    TIM_Cmd( TIM3, ENABLE );
}


X033的系统核心主频默认是48MHz, 根据此代码传参(arr = 100 - 1,  psc = SystemCoreClock / 1,000,000 - 1), 理应100us中断一次.


我在中断函数里, 每次调用就改变一次GPIO的状态:

        // 每计数一次, 代表100us
        g_TIM3_Counter++;

        GPIO_WriteBit(GPIOA, GPIO_Pin_6, g_TIM3_Counter & 0x01);


如果一切没问题, 那么我在GPIO A6管脚处用示波器采样, 采样的频率周期应该是200us, 正脉宽100us, 负脉宽100us.

但实际采样的结果却是频率周期为37.20us, 正脉宽18.40us, 负脉宽18.80us, 与预计的结果相差甚远, 这是为什么?

您好,注意初始化时要注意使能开启TIM3时钟,如下图1。附件是我的测试例程,测试没有问题的,如下图2,你可以参考一下。

icon_rar.gifCH32X035 定时器中断.zip

image.png

图1

image.png

图2


已解决, 我这好像是有异常导致MCU无限复位所以周期不正确, 最小化实现没问题.


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