我把TIM2 作为计数器用,外部脉冲输入端接脉冲编码器(带编码器的马达)的输出,两个脚。初始化如下:
/**************************************************************************
函数功能:把TIM2初始化为编码器接口模式
入口参数:无
返回 值:无
**************************************************************************/
void Horizontal_Motor_Encoder_Init_TIM2(void)
{
RCC->APB1ENR|=1<<0; //TIM2时钟使能
RCC->APB2ENR|=1<<2; //使能PORTA时钟
GPIOA->CRL&=0XFFFFFF00;//PA0 PA1
GPIOA->CRL|=0X00000044;//浮空输入
/* 把定时器初始化为编码器模式 */
TIM2->DIER|=1<<0; //允许更新中断
TIM2->DIER|=1<<6; //允许触发中断
NVIC_Init(2,3,TIM2_IRQn,1);
/* Timer configuration in Encoder mode */
TIM2->PSC = 0x0;//预分频器
TIM2->ARR = ENCODER_TIM_PERIOD;//设定计数器自动重装值
TIM2->CR1 &=~(3<<8);// 选择时钟分频:不分频
TIM2->CR1 &=~(3<<5);// 选择计数模式:边沿对齐模式
TIM2->CCMR1 |= 1<<0; //CC1S='01' IC1FP1映射到TI1
TIM2->CCMR1 |= 1<<8; //CC2S='01' IC2FP2映射到TI2
TIM2->CCER &= ~(1<<1); //CC1P='0' IC1FP1不反相,IC1FP1=TI1
TIM2->CCER &= ~(1<<5); //CC2P='0' IC2FP2不反相,IC2FP2=TI2
TIM2->CCMR1 |= 3<<4; // IC1F='1000' 输入捕获1滤波器
TIM2->SMCR |= 3<<0; //SMS='011' 所有的输入均在上升沿和下降沿有效
TIM2->CNT = 0;
TIM2->CR1 |= 0x01; //CEN=1,使能定时器
}
中断函数如下:
void TIM2_IRQHandler(void)
{
if(TIM2->SR&0x0001)//溢出中断
TIM2->SR&=~(1<<0);//清除中断标志位
g_Horizontal_Circle_Counter ++ ;
}
当输出计算时,计数器的值一直在变化,但是g_Horizontal_Circle_Counter 就是只变化了一次 |