宏定义参数
/*选择需要哪个定时器配置*/
#define Timer TIM3
/*选择需要哪个引脚*/
#define Pin1 GPIO_Pin_6
#define Pin2 GPIO_Pin_7
/*选择需要哪个GPIO端口--- GPIOA 或 GPIOB */
#define GPIO GPIOA
//1.开启APB1外设中的TIM时钟
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
//2.GPIO配置
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //上拉输入模式
GPIO_InitStructure.GPIO_Pin = Pin1 | Pin2;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIO, &GPIO_InitStructure);
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1; //时钟分频选择1分频
TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up; //选择向上计数
/*
时基单元里每个关键寄存器的参数(以下3个参数)
计数器溢出频率 --- CK_CNT_OV = CK_PSC / (PSC + 1) / (ARR + 1)
!!!!!! 预分频器和计数器都有1个数的偏差,所以这里要再减个1 !!!!!!
!!!!!! 且PSC和ARR的取值范围在0~65535之间 !!!!!!
*/
TIM_TimeBaseInitStructure.TIM_Period = 65536 - 1; //ARR自动重装器的值
TIM_TimeBaseInitStructure.TIM_Prescaler = 1 - 1; //PSC预分频
TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0; //重复计数器的值(高级定时器才需要)
TIM_TimeBaseInit(Timer, &TIM_TimeBaseInitStructure);
对GPIO配置时需要确定对应的TIM定时器以及通道1和通道2的引脚号
上面代码对应以下功能的配置
/*
对编码器接口进行配置
1. Timer --- 选择对应的TIM定时器
2. TIM_EncoderMode_TI12 --- 选择TI1和TI2都计数
3. TIM_ICPolarity_Rising --- 通道1选择上升沿即不反相(下降沿即反相--相当于加个非门)
3. TIM_ICPolarity_Rising --- 通道2选择上升沿即不反相(下降沿即反相--相当于加个非门)
*/
TIM_EncoderInterfaceConfig(Timer, TIM_EncoderMode_TI12, TIM_ICPolarity_Rising, TIM_ICPolarity_Rising);
上面代码对应图中的功能进行配置
/*启动定时器*/
TIM_Cmd(Timer, ENABLE);