void TIM2_Init(u16 arr,u16 psc)
{
GPIO_InitTypeDef GPIO_InitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeInitStructure;
TIM_ICInitTypeDef TIM_ICInitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);
//GPIOA0初始化
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_1;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPD;//下拉输入
GPIO_Init(GPIOA,&GPIO_InitStructure);
GPIO_ResetBits(GPIOA,GPIO_Pin_1);//PA0上电为低电平
//TIM2初始化
TIM_TimeInitStructure.TIM_Prescaler=psc;
TIM_TimeInitStructure.TIM_CounterMode=TIM_CounterMode_Up;
TIM_TimeInitStructure.TIM_Period=arr;
TIM_TimeInitStructure.TIM_ClockDivision=TIM_CKD_DIV1;
TIM_TimeBaseInit(TIM2,&TIM_TimeInitStructure);
//TIM设置 TIM2 的输入比较参数,开启捕获TIM2
TIM_ICInitStructure.TIM_Channel=TIM_Channel_2; //选择输入端IC2映射到TI2
TIM_ICInitStructure.TIM_ICPolarity=TIM_ICPolarity_Rising; //上升沿捕获
TIM_ICInitStructure.TIM_ICSelection=0x0100;//IC2映射到TI2
TIM_ICInitStructure.TIM_ICPrescaler=TIM_ICPSC_DIV1;//不分频
TIM_ICInitStructure.TIM_ICFilter=0x0;
TIM_ICInit(TIM2,&TIM_ICInitStructure);
TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE); //TIM_IT_Update=0x0001 允许更新中断 TIM3中断源的使能
TIM_ITConfig(TIM2,TIM_IT_CC2,ENABLE);
//TIM_ITConfig(TIM2,TIM_DMA_Update,ENABLE);
TIM_ARRPreloadConfig(TIM2,ENABLE);//APRE=1;每一次更新事件(UEV)时,才把预装在寄存器的内容传送到影子寄存器
TIM_Cmd(TIM2,ENABLE);//使能定时器开始计数
//中断配置
NVIC_InitStructure.NVIC_IRQChannel=TIM2_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority=3;
NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
void TIM2_IRQHandler(void)
{
if(TIM2CH1_CAPTURE_SAT&0x80==0)//还没有捕获成功
{
if(TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET)
{
if(TIM2CH1_CAPTURE_SAT&0x40)
{
if((TIM2CH1_CAPTURE_SAT&0x3f)==0x3f)
{
TIM2CH1_CAPTURE_SAT|=0x80;
TIM2CH1_CAPTURE_VAL=0xffff;
}
else
TIM2CH1_CAPTURE_SAT++;
}
}
if(TIM_GetITStatus(TIM2, TIM_IT_CC2) != RESET)
{
if(TIM2CH1_CAPTURE_SAT&0x40)
{
TIM2CH1_CAPTURE_SAT|=0x80;
TIM2CH1_CAPTURE_VAL=TIM_GetCapture2(TIM2);
TIM_OC1PolarityConfig(TIM2,TIM_ICPolarity_Rising);
GPIO_ResetBits(GPIOD,GPIO_Pin_2);
}
else
{
TIM2CH1_CAPTURE_VAL=0;
TIM2CH1_CAPTURE_SAT=0;
TIM_SetCounter(TIM2,0);
TIM2CH1_CAPTURE_SAT|=0x40;
TIM_OC1PolarityConfig(TIM2,TIM_ICPolarity_Falling);
GPIO_ResetBits(GPIOA,GPIO_Pin_8);
}
}
}
TIM_ClearITPendingBit(TIM2, TIM_IT_Update|TIM_IT_CC2);
}
怎么ministm32捕获不行呢,不知道程序那地方有问题,中断就是进不去
|