【求助】CH32v103C8T6 TIM2输入捕获问题帮忙看看那里不对

void TIM2_IRQHandler(void) __attribute__((interrupt("WCH-Interrupt-fast")));

void TIM2_Int_Init(u16 arr,u16 psc)

{? ?GPIO_InitTypeDef? GPIO_InitStructure ;

? ??TIM_ICInitTypeDef? ?TIM_ICInitStructure ;

? ??TIM_TimeBaseInitTypeDef? TIM_TimeBaseStructure;

? ???NVIC_InitTypeDef NVIC_InitStructure;


? ? RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); //时钟使能

? ??RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);



? ???GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15;

? ???GPIO_InitStructure.GPIO_Mode =? GPIO_Mode_IPD;

? ???GPIO_Init(GPIOA, &GPIO_InitStructure);

? ? ??GPIO_ResetBits(GPIOA, GPIO_Pin_15);

? ???GPIO_PinRemapConfig(GPIO_FullRemap_TIM2, ENABLE); //PA0复用位定时器5

? ? ?TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值?

? ???TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值? 10Khz的计数频率

? ? ?TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_tim

? ???TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;? //TIM向上计数模式

? ??TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位


? ??TIM_ICInitStructure.TIM_Channel = TIM_Channel_1;? //选择通道2

? ???TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;//配置分频不分频

? ???TIM_ICInitStructure.TIM_ICFilter = 0x00;//IC1F=0000 配置输入滤波器 不滤波

? ???TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;//上升沿捕获

? ???TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;//映射到TI1上

? ???TIM_PWMIConfig(TIM2, &TIM_ICInitStructure);

? ? NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;

? ? NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;? //先占优先级0级

? ?NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;? //从优先级3级

? ?NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能

? ?NVIC_Init(&NVIC_InitStructure);? //根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器




?TIM2->INTFR = 0;

?TIM_ITConfig(TIM2, TIM_IT_CC1 , ENABLE);

?//TIM_ITConfig( TIM2, TIM_IT_Update ,ENABLE? );


?TIM_SelectInputTrigger(TIM2, TIM_TS_TI2FP2);

?TIM_SelectSlaveMode(TIM2, TIM_SlaveMode_Reset);

?TIM_SelectMasterSlaveMode(TIM2, TIM_MasterSlaveMode_Enable);j_0004.gif

?TIM_Cmd(TIM2, ENABLE);? //使能TIMx外设


}


u16 speed_JC;

void TIM2_IRQHandler(void)? ?//TIM2中断

{




?if (TIM_GetITStatus(TIM2, TIM_IT_CC1) != RESET) //检查指定的输入捕获中断发生与否:TIM 中断源

?{


?speed_JC++;



?printf ("%d\r\n",speed_JC);

?TIM_ClearITPendingBit(TIM2,TIM_IT_CC1);? //清除TIM定时器更新中断待处理位:TIM 中断源

?}


}








更新中断可以

捕获输入没反应



您好,附件为CH32V103 TIM2输入捕获例程,可以参考一下

icon_rar.gifCH32V103 TIM2_输入捕获.zip



void Input_Capture_Init_3( u16 arr, u16 psc )

{

    GPIO_InitTypeDef        GPIO_InitStructure={0};

    TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure={0};

    TIM_ICInitTypeDef       TIM_ICInitStructure={0};

    NVIC_InitTypeDef        NVIC_InitStructure={0};


    RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA, ENABLE );//使能GPIOA时钟和TIM2时钟

    RCC_APB1PeriphClockCmd( RCC_APB1Periph_TIM3, ENABLE);


    GPIO_PinRemapConfig(GPIO_FullRemap_TIM3, ENABLE);

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;

    GPIO_Init( GPIOA, &GPIO_InitStructure);

    GPIO_ResetBits( GPIOA, GPIO_Pin_6 );


    //定时器周期,实际就是设定自动重载寄存器 ARR 的值, ARR 为要装载到实际自动重载寄存器(即影子寄存器) 的值, 可设置范围为 0 至 65535。

    TIM_TimeBaseInitStructure.TIM_Period = arr;

    //定时器预分频器设置,时钟源经该预分频器才是定时器计数时钟CK_CNT,它设定 PSC 寄存器的值。

    //计算公式为: 计数器时钟频率 (fCK_CNT) 等于fCK_PSC / (PSC[15:0] + 1),可实现 1 至 65536 分频。

    TIM_TimeBaseInitStructure.TIM_Prescaler = psc;

    //时钟分频,设置定时器时钟 CK_INT 频率与死区发生器以及数字滤波器采样时钟频率分频比。可以选择 1、 2、 4 分频。

    TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;

    TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up; //设置计数模式,向上计数模式

    TIM_TimeBaseInitStructure.TIM_RepetitionCounter =  0x00;        //设置重复计数器的值,0。重复计数器,只有 8 位,只存在于高级定时器。

    TIM_TimeBaseInit( TIM3, &TIM_TimeBaseInitStructure); //初始化


    // 当用作PWM输入捕获模式时,只需要设置触发信号的那一路即可(用于测量周期)

    // 另外一路(用于测量占空比)会由硬件自带设置,不需要再配置


    // TIM_Channel:捕获通道 ICx 选择,可选 TIM_Channel_1、 TIM_Channel_2、TIM_Channel_3 或 TIM_Channel_4 四个通道。

    TIM_ICInitStructure.TIM_Channel = TIM_Channel_1;

    //配置输入捕获预分频器值,如果需要捕获输入信号的每个有效边沿,则设置 1 分频 即可

    TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;

    //输入捕获滤波器设置,可选设置 0x0 至 0x0F。它设定 CHCTLRx 寄存器ICxF[3:0]位的值。一般我们不使用滤波器,即设置为 0

    TIM_ICInitStructure.TIM_ICFilter = 0x0;

    //输入捕获边沿触发选择,可选上升沿触发、下降沿触发或边沿跳变触发。

    TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Falling;

    //输入通道选择,捕获通道 ICx 的信号可来自三个输入通道,分别为TIM_ICSelection_DirectTI、 TIM_ICSelection_IndirectTI 或 TIM_ICSelection_TRC

    TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_IndirectTI;


    TIM_PWMIConfig( TIM3, &TIM_ICInitStructure );


    NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;       //TIM1捕获比较中断

    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;//设置抢占优先级

    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;       //设置响应优先级

    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;          //使能通道

    NVIC_Init(&NVIC_InitStructure);


    TIM_ITConfig( TIM3, TIM_IT_CC1, ENABLE ); //使能TIM1捕获中断


    // 选择输入捕获的触发信号

    TIM_SelectInputTrigger(TIM3, TIM_TS_TI1FP1);


    // 选择从模式: 复位模式

    // PWM输入模式时,从模式必须工作在复位模式,当捕获开始时,计数器CNT会被复位

    TIM_SelectSlaveMode(TIM3, TIM_SlaveMode_Reset);

    TIM_SelectMasterSlaveMode(TIM3,TIM_MasterSlaveMode_Enable);

    TIM_Cmd( TIM3, ENABLE );  //定时器使能

}





void TIM3_IRQHandler(void)

{


    if( TIM_GetITStatus( TIM3, TIM_IT_CC1 ) != RESET )   //若捕获比较1发生中断

    {

        printf( "cycle:%d\r\n", (TIM_GetCapture1(TIM3)+1) );      //打印得到的捕获比较1寄存器值,其值加1表示周期

        TIM_SetCounter( TIM3, 0 );

    }

    TIM_ClearITPendingBit( TIM3, TIM_IT_CC1 ); //清除TIM1捕获比较1中断挂起位

}

版主你好 按照你的这份代码烧录TIM2正常捕获   把这个改成TIM3就不捕获了 管脚也替换了 帮忙看一下


您好,检查一下中断函数是否有加中断声明,参考下图方式

image.png


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