#include "Encode.h" #include "task.h" #include "ctrl.h" #define ENCODER_PORT GPIOC //定义IO接口组 #define ENCODER_A GPIO_Pin_6 //定义IO接口 #define ENCODER_B GPIO_Pin_7 //定义IO接口 #define ENCODER_Z GPIO_Pin_8 //定义IO接口 #define ENCODER_EXTI_Z EXTI_Line8 //定义IO接口 #define Encode_TIM TIM3 volatile int bEncodeInitOK = DISABLE; int EncodeInitOK(void) { if(PC8_I==0) { bEncodeInitOK++; Encode_TIM->CNT=0; } return bEncodeInitOK; } void EncodeReInit(void) { bEncodeInitOK = DISABLE; } //接口初始化 void InitEncoder(void) { TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_ICInitTypeDef TIM_ICInitStruct; GPIO_InitTypeDef GPIO_InitStructure; //定义GPIO的初始化枚举结构 EXTI_InitTypeDef EXTI_InitStruct; NVIC_InitTypeDef NVIC_InitStructure; //初始化IO口时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC , ENABLE ); //初始化IO口 GPIO_InitStructure.GPIO_Pin = ENCODER_A | ENCODER_B|ENCODER_Z; //选择端口号 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //选择IO接口工作方式 //上拉电阻 GPIO_Init(ENCODER_PORT,&GPIO_InitStructure); //初始化中断 EXTI_StructInit(&EXTI_InitStruct); EXTI_InitStruct.EXTI_Line = ENCODER_EXTI_Z; EXTI_InitStruct.EXTI_Mode = EXTI_Mode_Interrupt; EXTI_InitStruct.EXTI_Trigger = EXTI_Trigger_Rising; EXTI_InitStruct.EXTI_LineCmd = ENABLE ; EXTI_Init( &EXTI_InitStruct); //选择中断信号源 GPIO_EXTILineConfig(GPIO_PortSourceGPIOC,GPIO_PinSource8); //打开中断管理器 NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); //重映射TIM3 GPIO_PinRemapConfig(GPIO_FullRemap_TIM3,ENABLE); //启动TIM3时钟 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE ); //Tim3初始化 TIM_TimeBaseStructInit(&TIM_TimeBaseStructure); TIM_TimeBaseStructure.TIM_Prescaler = 0x0; // 分频不分频 TIM_TimeBaseStructure.TIM_Period = 0x0FFFF; //重载初值 TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //选择时钟分频:不分频 TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上计数 TIM_TimeBaseInit(Encode_TIM, &TIM_TimeBaseStructure); /*编码器配置*/ TIM_EncoderInterfaceConfig(Encode_TIM, TIM_EncoderMode_TI12, TIM_ICPolarity_Rising, TIM_ICPolarity_Rising); TIM_ICStructInit(&TIM_ICInitStruct); //初始化为TI TIM_ICInit(Encode_TIM,&TIM_ICInitStruct); TIM_ICStructInit(&TIM_ICInitStruct); //把TIM_ICInitStruct 中的每一个参数按缺省值填入 TIM_ICInitStruct.TIM_Channel = TIM_Channel_2; TIM_ICInit(Encode_TIM, &TIM_ICInitStruct); //根TIM_ICInitStructure参数初始化定时器TIM4编码器模式 TIM_ClearFlag(Encode_TIM, TIM_FLAG_Update); //清除TIM的更新标志位 TIM_ITConfig(Encode_TIM, TIM_IT_Update, ENABLE); TIM_SetCounter(Encode_TIM,0x7FFF); TIM_Cmd(Encode_TIM, ENABLE); } unsigned int GetEncodeCnt(void) { int16_t cnt0 = TIM_GetCapture1(Encode_TIM); int16_t cnt1 = TIM_GetCapture2(Encode_TIM); int16_t cnt = cnt0+cnt1; if(cnt<0) cnt *=-1; return cnt; } void EXTI9_5_IRQHandler(void) { if(EXTI_GetITStatus(EXTI_Line8) != RESET) { EXTI_ClearFlag(EXTI_Line8); EXTI_ClearITPendingBit(EXTI_Line8); bEncodeInitOK = ENABLE; Encode_TIM->CNT=0; } }