F4编码器模式问题

2019-07-20 09:26发布

[mw_shl_code=applescript,true]void TIM8_ch1_ch2_encoder_init(void){
   
    //PC6,PC7,TIM8,TIM8_CH1,TIM8_CH2,中断初始化结构体定义
    GPIO_InitTypeDef GPIO_InitStruct;
    TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;   
    TIM_ICInitTypeDef TIM_ICInitStruct;
    NVIC_InitTypeDef NVIC_InitStruct;

    //GPIO,TIM8时钟初始化
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC , ENABLE);
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM8 , ENABLE);

    //PC7,8复用为TIM8模式
    GPIO_PinAFConfig(GPIOC , GPIO_PinSource6 | GPIO_PinSource7 , GPIO_AF_TIM8);

    //PC6,7模式初始化
    GPIO_InitStruct.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7;
    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF;
    GPIO_InitStruct.GPIO_OType = GPIO_OType_OD; //开漏输入
    GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_UP; //加上拉电阻
    GPIO_InitStruct.GPIO_Speed = GPIO_Speed_100MHz;
    GPIO_Init(GPIOC, &GPIO_InitStruct);

    //TIM8模式初始化
    TIM_TimeBaseStructInit(&TIM_TimeBaseInitStruct);
    TIM_TimeBaseInitStruct.TIM_Period = 0xFFFF; //定时计数器和ARR比较寄存器都是16位的寄存器
    TIM_TimeBaseInitStruct.TIM_Prescaler = 0;
    TIM_TimeBaseInitStruct.TIM_ClockDivision = TIM_CKD_DIV1;
    TIM_TimeBaseInitStruct.TIM_CounterMode = TIM_CounterMode_Up;
    //TIM_TimeBaseInitStruct.TIM_RepetitionCounter = 0;
    TIM_TimeBaseInit(TIM8 , &TIM_TimeBaseInitStruct);

    //TIM8更新中断初始化
    NVIC_InitStruct.NVIC_IRQChannel = TIM8_UP_TIM13_IRQn;
    NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
    NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 1;
    NVIC_InitStruct.NVIC_IRQChannelSubPriority = 1;
    NVIC_Init(&NVIC_InitStruct);
   
    //TIM8编码器模式设置
    TIM_EncoderInterfaceConfig(TIM8 , TIM_EncoderMode_TI12 , TIM_ICPolarity_BothEdge
                                , TIM_ICPolarity_BothEdge);

    //TIM8输入通道初始化
    TIM_ICStructInit(&TIM_ICInitStruct);
    //  TIM_ICInitStruct.TIM_Channel
    //  TIM_ICInitStruct.TIM_ICFilter   
    //  TIM_ICInitStruct.TIM_ICPolarity = TIM_ICPolarity_BothEdge;
    //  TIM_ICInitStruct.TIM_ICPrescaler =
    //  TIM_ICInitStruct.TIM_ICSelection = TIM_ICSelection_DirectTI;
    TIM_ICInitStruct.TIM_ICFilter = 10;
    TIM_ICInit(TIM8 , &TIM_ICInitStruct);

    //TIM8更新中断标志清零
    TIM_ClearFlag(TIM8 , TIM_FLAG_Update);
   
    //TIM8更新中断使能
    TIM_ITConfig(TIM8 , TIM_IT_Update , ENABLE);

    //TIM8计数器复位
    TIM8->CNT = 0;

    //开启TIM8
    TIM_Cmd(TIM8 , ENABLE);
   
}


//编码器中断函数
void TIM8_UP_TIM13_IRQHandler(void){


    if(TIM_GetITStatus(TIM8 , TIM_IT_Update)==SET)
      //  TIM8->CNT = 0;
      
   
    TIM_ClearITPendingBit(TIM8 , TIM_IT_Update);

}

[/mw_shl_code]
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。