论坛元老
 
- 积分
- 3436
- 金钱
- 3436
- 注册时间
- 2017-1-13
- 在线时间
- 274 小时
|
50金钱
请帮忙看看以下程序有什么问题,调试程序发现一个比较奇怪的问题,参考原子定时器输入捕捉程序,改为PA2输入,Tim2 channel3,上升沿触发,方式,可始终收不到上升沿触发中断if(TIM_GetITStatus(TIM2, TIM_IT_CC3) != RESET),可以收到if(TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET)中断;请帮忙诊断一下,谢谢!程序如下:
TIM_ICInitTypeDef TIM2_ICInitStructure;
void TIM2_CH3_Cap_Init(u32 arr,u16 psc)
{
GPIO_InitTypeDef GPIO_InitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; //GPIOA2
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN;
GPIO_Init(GPIOA,&GPIO_InitStructure);
GPIO_PinAFConfig(GPIOA,GPIO_PinSource2,GPIO_AF_TIM2); //PA2
TIM_TimeBaseStructure.TIM_Prescaler=psc;
TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;
TIM_TimeBaseStructure.TIM_Period=arr;
TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;
TIM_TimeBaseInit(TIM2,&TIM_TimeBaseStructure);
TIM2_ICInitStructure.TIM_Channel = TIM_Channel_3; //CC1S=03
TIM2_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;
TIM2_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;
TIM2_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;
TIM2_ICInitStructure.TIM_ICFilter = 0x00;
TIM_ICInit(TIM2, &TIM2_ICInitStructure);
//TIM_ITConfig(TIM2,TIM_IT_Update|TIM_IT_CC1,ENABLE);
TIM_ITConfig(TIM2,TIM_IT_Update|TIM_IT_CC3,ENABLE);
NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2;
NVIC_InitStructure.NVIC_IRQChannelSubPriority =0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
TIM_Cmd(TIM2,ENABLE );
}
u8 TIM2CH3_CAPTURE_STA=0;
u32 TIM2CH3_CAPTURE_VAL;
void TIM2_IRQHandler(void)
{
if((TIM2CH3_CAPTURE_STA&0X80)==0)
{
if(TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET)
{
//if(TIM2CH3_CAPTURE_STA&0X40)
{
if((TIM2CH3_CAPTURE_STA&0X3F)==0X3F)
{
TIM2CH3_CAPTURE_STA|=0X80;
TIM2CH3_CAPTURE_VAL=0X1F40;
}else TIM2CH3_CAPTURE_STA++;
}
}
if(TIM_GetITStatus(TIM2, TIM_IT_CC3) != RESET)
{
if(TIM2CH3_CAPTURE_STA&0X40)
{
TIM2CH3_CAPTURE_STA|=0X80;
TIM2CH3_CAPTURE_VAL=TIM_GetCapture1(TIM2);
TIM_OC3PolarityConfig(TIM2,TIM_ICPolarity_Rising);
}else
{
TIM2CH3_CAPTURE_STA=0;
TIM2CH3_CAPTURE_VAL=0;
TIM2CH3_CAPTURE_STA|=0X40;
TIM_Cmd(TIM2,DISABLE );
TIM_SetCounter(TIM2,0);
TIM_OC3PolarityConfig(TIM2,TIM_ICPolarity_Falling);
TIM_Cmd(TIM2,ENABLE );
}
}
}
TIM_ClearITPendingBit(TIM2, TIM_IT_CC3|TIM_IT_Update);
}
|
|