stm32定时器tim10、11、13、14一起使用出现问题
大家有没有用过stm32f405的tim10、11、13、14,我用这几路的ch1来测量四路PWM,结果出现问题,只有tim13能正常测量,其他的都无法进入中断附上代码:
static void PPM_Configure_TIME10_11_13_14(void)
{
uint16_t PrescalerValue_APB1 = 0;
uint16_t PrescalerValue_APB2 = 0;
TIM_ICInitTypeDefTIM_ICInitStructure;
TIM_TimeBaseInitTypeDefTIM_TimeBaseStructure;
/* CLK = 168000000/(PrescalerValue+1) = 1000000hz = 1us */
PrescalerValue_APB1 = (uint16_t) ((SystemCoreClock / PPM_FREQ) / 2) - 1;
PrescalerValue_APB2 = (uint16_t) (SystemCoreClock / PPM_FREQ) - 1;
/************************* TIM 10 *************************/
RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM10, ENABLE);
/* Time base configuration */
TIM_TimeBaseStructure.TIM_Period = PPM_PEIOD_DUTY;
TIM_TimeBaseStructure.TIM_Prescaler = PrescalerValue_APB2;
TIM_TimeBaseStructure.TIM_ClockDivision = 0;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM10, &TIM_TimeBaseStructure);
/* TIM_Channel_1 */
TIM_ICInitStructure.TIM_Channel = TIM_Channel_1;
TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_BothEdge;
TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;
TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;
TIM_ICInitStructure.TIM_ICFilter = 0x0;
TIM_ICInit(TIM10, &TIM_ICInitStructure);
/************************* TIM 11 *************************/
RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM11, ENABLE);
/* Time base configuration */
TIM_TimeBaseStructure.TIM_Period = PPM_PEIOD_DUTY;
TIM_TimeBaseStructure.TIM_Prescaler = PrescalerValue_APB2;
TIM_TimeBaseStructure.TIM_ClockDivision = 0;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM11, &TIM_TimeBaseStructure);
/* TIM_Channel_1 */
TIM_ICInitStructure.TIM_Channel = TIM_Channel_1;
TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_BothEdge;
TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;
TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;
TIM_ICInitStructure.TIM_ICFilter = 0x0;
TIM_ICInit(TIM11, &TIM_ICInitStructure);
/************************* TIM 13 *************************/
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM13, ENABLE);
/* Time base configuration */
TIM_TimeBaseStructure.TIM_Period = PPM_PEIOD_DUTY;
TIM_TimeBaseStructure.TIM_Prescaler = PrescalerValue_APB1;
TIM_TimeBaseStructure.TIM_ClockDivision = 0;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM13, &TIM_TimeBaseStructure);
/* TIM_Channel_1 */
TIM_ICInitStructure.TIM_Channel = TIM_Channel_1;
TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_BothEdge;
TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;
TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;
TIM_ICInitStructure.TIM_ICFilter = 0x0;
TIM_ICInit(TIM13, &TIM_ICInitStructure);
/************************* TIM 14 *************************/
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM14, ENABLE);
/* Time base configuration */
TIM_TimeBaseStructure.TIM_Period = PPM_PEIOD_DUTY;
TIM_TimeBaseStructure.TIM_Prescaler = PrescalerValue_APB1;
TIM_TimeBaseStructure.TIM_ClockDivision = 0;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM14, &TIM_TimeBaseStructure);
/* TIM_Channel_1 */
TIM_ICInitStructure.TIM_Channel = TIM_Channel_1;
TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_BothEdge;
TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;
TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;
TIM_ICInitStructure.TIM_ICFilter = 0x0;
TIM_ICInit(TIM14, &TIM_ICInitStructure);
/************************* TIM enable counter *************************/
TIM_Cmd(TIM10, ENABLE);
TIM_Cmd(TIM11, ENABLE);
TIM_Cmd(TIM13, ENABLE);
TIM_Cmd(TIM14, ENABLE);
/************************* Enable the CCx Interrupt Request *************************/
TIM_ITConfig(TIM10, TIM_IT_CC1, ENABLE); //PPM_CH1
TIM_ITConfig(TIM11, TIM_IT_CC1, ENABLE); //PPM_CH2
TIM_ITConfig(TIM13, TIM_IT_CC1, ENABLE); //PPM_CH6
TIM_ITConfig(TIM14, TIM_IT_CC1, ENABLE); //PPM_CH5
}
static void PPM_Configure_NVIC_TIMER(void)
{
NVIC_InitTypeDef NVIC_InitStructure;
/* NVIC_PriorityGroup */
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4); //0~f
NVIC_InitStructure.NVIC_IRQChannel = TIM5_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
NVIC_InitStructure.NVIC_IRQChannel = TIM1_UP_TIM10_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
NVIC_InitStructure.NVIC_IRQChannel = TIM1_TRG_COM_TIM11_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
NVIC_InitStructure.NVIC_IRQChannel = TIM8_UP_TIM13_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
NVIC_InitStructure.NVIC_IRQChannel = TIM8_TRG_COM_TIM14_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
/*
*********************************************************************************************************
* PPM_IRQHandler_CH1
*
* Description : PPM CH1
*
* Arguments:
*
* Returns : none
*
* Notes : none
*
*********************************************************************************************************
*/
extern void PPM_IRQHandler_CH1(void)
{
if(TIM10->SR & TIM_IT_CC1)
{
TIM10->SR &= ~TIM_FLAG_CC1;
TIM10->SR &= ~TIM_FLAG_CC1OF;
if(GPIOB->IDR & GPIO_Pin_8) /*PPMCH1if PB.8 is highRising*/
timer10_ccr1 = TIM10->CCR1;
else
{
if((TIM10->CCR1) < timer10_ccr1)
PPM_Channel_Table = PPM_PEIOD_DUTY - timer10_ccr1 + TIM10->CCR1;
else
PPM_Channel_Table = TIM10->CCR1 - timer10_ccr1;
}
}
}
/*
*********************************************************************************************************
* PPM_IRQHandler_CH2
*
* Description : PPM CH2
*
* Arguments:
*
* Returns : none
*
* Notes : none
*
*********************************************************************************************************
*/
extern void PPM_IRQHandler_CH2(void)
{
if(TIM11->SR & TIM_IT_CC1)
{
TIM11->SR &= ~TIM_FLAG_CC1;
TIM11->SR &= ~TIM_FLAG_CC1OF;
if(GPIOB->IDR & GPIO_Pin_9) /*PPMCH2if PB.9 is highRising*/
timer11_ccr1 = TIM11->CCR1;
else
{
if((TIM11->CCR1) < timer11_ccr1)
PPM_Channel_Table = PPM_PEIOD_DUTY - timer11_ccr1 + TIM11->CCR1;
else
PPM_Channel_Table = TIM11->CCR1 - timer11_ccr1;
}
}
}
/*
*********************************************************************************************************
* PPM_IRQHandler_CH5
*
* Description : PPM CH5
*
* Arguments:
*
* Returns : none
*
* Notes : none
*
*********************************************************************************************************
*/
extern void PPM_IRQHandler_CH5(void)
{
if(TIM14->SR & TIM_IT_CC1)
{
TIM14->SR &= ~TIM_FLAG_CC1;
TIM14->SR &= ~TIM_FLAG_CC1OF;
if(GPIOA->IDR & GPIO_Pin_7) /*PPMCH5if PA.7 is highRising*/
timer14_ccr1 = TIM14->CCR1;
else
{
if((TIM14->CCR1) < timer14_ccr1)
PPM_Channel_Table = PPM_PEIOD_DUTY - timer14_ccr1 + TIM14->CCR1;
else
PPM_Channel_Table = TIM14->CCR1 - timer14_ccr1;
}
}
}
/*
*********************************************************************************************************
* PPM_IRQHandler_CH6
*
* Description : PPM CH6
*
* Arguments:
*
* Returns : none
*
* Notes : none
*
*********************************************************************************************************
*/
extern void PPM_IRQHandler_CH6(void)
{
if(TIM13->SR & TIM_IT_CC1)
{
TIM13->SR &= ~TIM_FLAG_CC1;
TIM13->SR &= ~TIM_FLAG_CC1OF;
if(GPIOA->IDR & GPIO_Pin_6) /*PPMCH6if PA.6 is highRising*/
timer13_ccr1 = TIM13->CCR1;
else
{
if((TIM13->CCR1) < timer13_ccr1)
PPM_Channel_Table = PPM_PEIOD_DUTY - timer13_ccr1 + TIM13->CCR1;
else
PPM_Channel_Table = TIM13->CCR1 - timer13_ccr1;
}
}
} 代码比较长,麻烦各位朋友帮忙看看:) 把NVIC的优先级错开呢?现在是同时在产生中断,楼主可以考虑先只开一个中断,确认中断正常工作,然后再根据不同的优先顺序来设置优先级。
页:
[1]