[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]
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
我是设置的AB模式,没有用Z,硬件上加了上拉还是丢步
一周热门 更多>