【求助】 STM32F1的8路脉冲计数器
使用STM32的计数器功能,实现8路的脉冲计数,我在程序中使用了,两个计数器
TIM2和TIM3,配置代码如下:
void TIM2_Configuration(void)
{
TIM_ICInitTypeDef TIM_ICInitStructure;
TIM_DeInit(TIM2);
/* Enable capture*/
TIM_CH1_ICInitStructure.TIM_Channel = TIM_Channel_1;
TIM_CH1_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;
TIM_CH1_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;
TIM_CH1_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;
TIM_CH1_ICInitStructure.TIM_ICFilter = 0;
TIM_ICInit(TIM2, &TIM_ICInitStructure);
TIM_ICInitStructure.TIM_Channel = TIM_Channel_2;
TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Falling;
TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;
TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;
TIM_ICInitStructure.TIM_ICFilter = 0;
TIM_ICInit(TIM2, &TIM_ICInitStructure);
TIM_ICInitStructure.TIM_Channel = TIM_Channel_3;
TIM_ICInit(TIM2, &TIM_ICInitStructure);
TIM_ICInitStructure.TIM_Channel = TIM_Channel_4;
TIM_ICInit(TIM2, &TIM_ICInitStructure);
/* Enable TIM2 */
TIM_Cmd(TIM2, ENABLE);
/* Enable CC1-4 interrupt */
TIM_ITConfig(TIM2, TIM_IT_CC1 | TIM_IT_CC2 | TIM_IT_CC3 | TIM_IT_CC4, ENABLE);
/* Clear CC1 Flag*/
TIM_ClearFlag(TIM2, TIM_FLAG_CC1 | TIM_FLAG_CC2 | TIM_FLAG_CC3 | TIM_FLAG_CC4 );
}
void TIM3_Configuration(void)
{
TIM_ICInitTypeDef TIM_ICInitStructure;
TIM_DeInit(TIM3);
/* Enable capture*/
TIM_CH1_ICInitStructure.TIM_Channel = TIM_Channel_1;
TIM_CH1_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;
TIM_CH1_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;
TIM_CH1_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;
TIM_CH1_ICInitStructure.TIM_ICFilter = 0;
TIM_ICInit(TIM3, &TIM_ICInitStructure);
TIM_ICInitStructure.TIM_Channel = TIM_Channel_2;
TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Falling;
TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;
TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;
TIM_ICInitStructure.TIM_ICFilter = 0;
TIM_ICInit(TIM3, &TIM_ICInitStructure);
TIM_ICInitStructure.TIM_Channel = TIM_Channel_3;
TIM_ICInit(TIM3, &TIM_ICInitStructure);
TIM_ICInitStructure.TIM_Channel = TIM_Channel_4;
TIM_ICInit(TIM3, &TIM_ICInitStructure);
/* Enable TIM2 */
TIM_Cmd(TIM3, ENABLE);
/* Enable CC1-4 interrupt */
TIM_ITConfig(TIM3, TIM_IT_CC1 | TIM_IT_CC2 | TIM_IT_CC3 | TIM_IT_CC4, ENABLE);
/* Clear CC1 Flag*/
TIM_ClearFlag(TIM3, TIM_FLAG_CC1 | TIM_FLAG_CC2 | TIM_FLAG_CC3 | TIM_FLAG_CC4 );
}
中断函数如下:
void TIM2_IRQHandler(void)
{
if(TIM2 ->SR & TIM_IT_CC1 )
{
TIM2 ->SR &= (~TIM_IT_CC1 );
if(pulseState1 == 0)
{
TIM_CH1_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Falling;
// Any time we get a rising edge on CH1, we reset the counter. All channels are
// phase aligned, so they all use this as a reference.
TIM_SetCounter(TIM2, 0);
}
else
{
TIM_CH1_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;
// Pull the value on the falling edge.
ccr = TIM_GetCapture1(TIM2 );
}
pulseState1 = !pulseState1;
// Reverse polarity.
TIM_ICInit(TIM2, &TIM_CH1_ICInitStructure);
}
if(TIM2 ->SR & TIM_IT_CC2 )
{
TIM2 ->SR &= (~TIM_IT_CC2 );
ccr = TIM_GetCapture2(TIM2 );
}
if(TIM2 ->SR & TIM_IT_CC3 )
{
TIM2 ->SR &= (~TIM_IT_CC3 );
ccr = TIM_GetCapture3(TIM2 );
}
if(TIM2 ->SR & TIM_IT_CC4 )
{
TIM2 ->SR &= (~TIM_IT_CC4 );
ccr = TIM_GetCapture4(TIM2 );
}
}
void TIM3_IRQHandler(void)
{
if(TIM3 ->SR & TIM_IT_CC1)
{
TIM3 ->SR &= (~TIM_IT_CC1);
if(pulseState2 == 0)
{
TIM_CH1_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Falling;
// Any time we get a rising edge on CH1, we reset the counter. All channels are
// phase aligned, so they all use this as a reference.
TIM_SetCounter(TIM3, 0);
}
else
{
TIM_CH1_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;
// Pull the value on the falling edge.
ccr = TIM_GetCapture1(TIM3);
}
pulseState2 = !pulseState2;
// Reverse polarity.
TIM_ICInit(TIM3, &TIM_CH1_ICInitStructure);
}
if(TIM3 ->SR & TIM_IT_CC2)
{
TIM3 ->SR &= (~TIM_IT_CC2 );
ccr = TIM_GetCapture2(TIM3);
}
if(TIM3 ->SR & TIM_IT_CC3 )
{
TIM3 ->SR &= (~TIM_IT_CC3 );
ccr = TIM_GetCapture3(TIM3);
}
if(TIM3 ->SR & TIM_IT_CC4 )
{
TIM3 ->SR &= (~TIM_IT_CC4 );
ccr = TIM_GetCapture4(TIM3);
}
}
但是由于计数器优先级的问题,它的计数不是很完美,因为配置TIM2优先级高于TIM3,则8路脉冲同时到来的时候,只有TIM2计数,而TIM3没有计数。
请问各位大侠,有没有解决的办法???
求助!!!
RE:【求助】 STM32F1的8路脉冲计数器
在TIM2 中添加TIM3 判断的部分回复:【求助】 STM32F1的8路脉冲计数器
回复第 2 楼 于2013-12-14 11:54:19发表:在TIM2 中添加TIM3 判断的部分
请问怎么添加呢?能否详细一些,本人是新手。
RE:【求助】 STM32F1的8路脉冲计数器
有没有人指导一下呢???小弟不胜感激!!! 请问一下你的这个问题解决了吗?我现在也遇到了相似的问题?可不可以请教一下啊?
页:
[1]