Добрый день. Проблема похожа чем то: прерывания работают но не все, в частности использую TIM1, TIM2, TIM3, прерывания от TIM1 c фиксированной частотой по переполнению, TIM2 - захват 1 и переполнение, TIM3 - сравнение 1 и переполнение. не работают переполнения во всех. Вот так настраиваю:
CODE
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;
TIM_ICInitTypeDef TIM_ICInitStruct;
TIM_OCInitTypeDef TIM_OCInitStruct;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2 | RCC_APB1Periph_TIM3, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);
TIM_TimeBaseInitStruct.TIM_Prescaler=3664; //
TIM_TimeBaseInitStruct.TIM_CounterMode=TIM_CounterMode_Up; //
TIM_TimeBaseInitStruct.TIM_Period=0xFFFF;
TIM_TimeBaseInitStruct.TIM_ClockDivision=TIM_CKD_DIV1; //
TIM_TimeBaseInit(TIM1, &TIM_TimeBaseInitStruct);
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitStruct);
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseInitStruct);
//TIM_PrescalerConfig(TIM2, 900, TIM_PSCReloadMode_Update); //
//TIM_SetAutoreload(TIM3,0xFFFF);//
//TIM_SetCompare1(TIM3, 0x0045); //
TIM_ICInitStruct.TIM_Channel=TIM_Channel_1;
TIM_ICInitStruct.TIM_ICPolarity=TIM_ICPolarity_Rising;
TIM_ICInitStruct.TIM_ICSelection=TIM_ICSelection_DirectTI;
TIM_ICInitStruct.TIM_ICPrescaler=TIM_ICPSC_DIV1;
TIM_ICInitStruct.TIM_ICFilter=0;
TIM_ICInit(TIM2, &TIM_ICInitStruct);
TIM_OCInitStruct.TIM_OCMode=TIM_OCMode_Timing;
TIM_OCInitStruct.TIM_OutputState=TIM_OutputState_Enable;
TIM_OCInitStruct.TIM_OutputNState = TIM_OutputNState_Disable;
TIM_OCInitStruct.TIM_Pulse=0x00FF; //
TIM_OCInitStruct.TIM_OCPolarity=TIM_OCPolarity_Low;
TIM_OCInitStruct.TIM_OCIdleState = TIM_OCIdleState_Reset;
TIM_OCInitStruct.TIM_OCNIdleState = TIM_OCNIdleState_Reset;
TIM_OC1Init(TIM3, &TIM_OCInitStruct);
//TIM_SelectOCxM(TIM3);
TIM_UpdateDisableConfig(TIM1,ENABLE);
TIM_UpdateDisableConfig(TIM2,ENABLE);
TIM_UpdateDisableConfig(TIM3,ENABLE);
TIM_Cmd(TIM1,ENABLE);
TIM_Cmd(TIM2,ENABLE);
TIM_Cmd(TIM3,ENABLE);
TIM_ITConfig(TIM1,TIM_IT_Update, ENABLE); //
TIM_ITConfig(TIM2, TIM_IT_Update | TIM_IT_CC1, ENABLE);//
TIM_ITConfig(TIM3, TIM_IT_Update | TIM_IT_CC1,ENABLE); //
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0); //
NVIC_InitStructure.NVIC_IRQChannel = TIM1_UP_TIM16_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x00;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x02;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x00;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x01;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x00;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x00;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
Вот так обработчик прерываний:
CODE
void TIM3_IRQHandler(void)
{
if(TIM_GetITStatus(TIM3,TIM_IT_CC1)!=RESET)
{
TIM_ClearITPendingBit(TIM3, TIM_IT_CC1);
/*какой то код*/
}
if(TIM_GetITStatus(TIM3,TIM_IT_Update)!=RESET)
{
TIM_ClearITPendingBit(TIM3, TIM_IT_Update);
/*какой то код*/
}
TIM3->SR=0;
}
void TIM1_UP_TIM16_IRQHandler(void)
{
if(TIM_GetITStatus(TIM1,TIM_IT_Update)!=RESET)
{
TIM_ClearITPendingBit(TIM1, TIM_IT_Update);
/*какой то код*/
}
TIM1->SR=0;
}
void TIM2_IRQHandler(void)
{
/*** Ôóíêöèÿ ïðåðûâàíèÿ ïî çàõâàòó ñ ÄÏÐ ***/
if(TIM_GetITStatus(TIM2,TIM_IT_CC1)!=RESET)
{
TIM_ClearITPendingBit(TIM2, TIM_IT_CC1);
/*какойто код*/
}
if(TIM_GetITStatus(TIM2,TIM_IT_Update)!=RESET)
{
TIM_ClearITPendingBit(TIM2, TIM_IT_Update);
freq=0;
}
TIM2->SR=0;
}