CH32V307VCT6 使用TIM10的编码器模式无效

如题,由于项

目需求不得已使用高级定时器tim10但发现使用tim10无法获取编码器的值

这是初始化函数

void ENCODER_Init_TIM10(void) {
    TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure={0};
    TIM_ICInitTypeDef TIM_ICInitStructure={0};
    GPIO_InitTypeDef GPIO_InitStructure={0};
//    NVIC_InitTypeDef NVIC_InitStructure={0};
    RCC_APB1PeriphClockCmd(RCC_APB2Periph_TIM10 | RCC_APB2Periph_GPIOB, ENABLE); //使能定时器10,PB端口的时钟
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);   //使能AFIO复用功能模块时钟

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9;  //端口配置
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //浮空输入
    GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
    GPIO_Init(GPIOB, &GPIO_InitStructure);                      //根据设定参数初始化GPIOB

    TIM_TimeBaseStructInit(&TIM_TimeBaseStructure);
    TIM_TimeBaseStructure.TIM_Prescaler = 0x1; // 预分频器
//    TIM_TimeBaseStructure.TIM_Period = 2500-1; //设定计数器自动重装值
    TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //选择时钟分频:不分频
    TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上计数
    TIM_TimeBaseInit(TIM10, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct的参数初始化定时 器TIM10

    TIM_EncoderInterfaceConfig(TIM10, TIM_EncoderMode_TI1,
                TIM_ICPolarity_Rising, TIM_ICPolarity_Rising);  //使用编码器模式3

    TIM_ICStructInit(&TIM_ICInitStructure);  //把TIM_ICInitStruct 中的每一个参数按缺省值填入
    TIM_ICInitStructure.TIM_Channel = TIM_Channel_1;//|TIM_Channel_2
    TIM_ICInitStructure.TIM_ICFilter = 10;  //设置滤波器长度
    TIM_ICInit(TIM10, &TIM_ICInitStructure);

//    NVIC_InitStructure.NVIC_IRQChannel = TIM10_UP_IRQn;
//    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
//    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x01;
//    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x02;
//    NVIC_Init(&NVIC_InitStructure);

    //    TIM_ITConfig(TIM10, TIM_IT_CC1, ENABLE);
    TIM_ITConfig(TIM10, TIM_IT_Update, ENABLE);

    TIM_ClearFlag(TIM10, TIM_FLAG_Update);  //清除TIM的更新标志位
    TIM_SetCounter(TIM10, 0);
    TIM_Cmd(TIM10, ENABLE);
}

这是中断函数:

int circle_count=0;//全局变量-圈数
void TIM10_UP_IRQHandler(void)
{
    circle_count=1;
    if(TIM_GetITStatus(TIM10,TIM_IT_Update)==SET)
    {
        TIM_ClearITPendingBit(TIM10,TIM_IT_Update);
//        if((TIM10->CTLR1>>4 & 0x01)==0) //DIR==0
//            circle_count++;
//        else if((TIM10->CTLR1>>4 & 0x01)==1)//DIR==1
//            circle_count--;
    }

}

这是头文件:

#ifndef DRIVE_ENCODER_ENCODER_H_
#define DRIVE_ENCODER_ENCODER_H_

#include "ch32v30x.h"

extern int circle_count;

void ENCODER_Init(void);//初始化
void ENCODER_Init_TIM8(void);//初始化
void ENCODER_Init_TIM10(void);//初始化

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

#endif /* DRIVE_ENCODER_ENCODER_C_ */

这是主函数:

int volatile Encoder;
int main(void)
{
    Delay_Init();
   NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
   Led_Init();
   ENCODER_Init_TIM10();
   Encoder=1;

   while(1){
       GPIO_ResetBits(GPIOE, GPIO_Pin_4);
       GPIO_SetBits(GPIOE, GPIO_Pin_5);
       GPIO_ResetBits(GPIOE, GPIO_Pin_6);
       Encoder=TIM_GetCounter(TIM10);//当前角度
       TIM_SetCounter(TIM10, 0);
       Delay_Ms(500);
       GPIO_SetBits(GPIOE, GPIO_Pin_4);
       GPIO_ResetBits(GPIOE, GPIO_Pin_5);
       GPIO_SetBits(GPIOE, GPIO_Pin_6);
       Encoder=TIM_GetCounter(TIM10);//当前角度
       TIM_SetCounter(TIM10, 0);
       Delay_Ms(500);
   }

}

监听的是“Encoder”的值发现为0,检查后发现寄存器为0;

RCC_APB1PeriphClockCmd(RCC_APB2Periph_TIM10 | RCC_APB2Periph_GPIOB, ENABLE); //使能定时器10,PB端口的时钟

问题已找到,本人眼瘸“

RCC_APB1PeriphClockCmd

”用错了,望警戒


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