你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【求助】 STM32F1的8路脉冲计数器

[复制链接]
yygkqzh 提问时间:2013-12-13 23:48 /
 
使用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[0] = 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[1] = TIM_GetCapture2(TIM2 );
        }
        if(TIM2 ->SR & TIM_IT_CC3 ) 
        {
                TIM2 ->SR &= (~TIM_IT_CC3 );
                ccr[2] = TIM_GetCapture3(TIM2 );
        }
        if(TIM2 ->SR & TIM_IT_CC4 ) 
        {
                TIM2 ->SR &= (~TIM_IT_CC4 );
                ccr[3] = 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[4] = 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[5] = TIM_GetCapture2(TIM3);
        }
        if(TIM3 ->SR & TIM_IT_CC3 ) 
        {
                TIM3 ->SR &= (~TIM_IT_CC3 );
                ccr[6] = TIM_GetCapture3(TIM3);
        }
        if(TIM3 ->SR & TIM_IT_CC4 ) 
        {
                TIM3 ->SR &= (~TIM_IT_CC4 );
                ccr[7] = TIM_GetCapture4(TIM3);
        }
}

 
但是由于计数器优先级的问题,它的计数不是很完美,因为配置TIM2优先级高于TIM3,则8路脉冲同时到来的时候,只有TIM2计数,而TIM3没有计数。
 
请问各位大侠,有没有解决的办法???
 
求助!!!
 
收藏 评论4 发布时间:2013-12-13 23:48

举报

4个回答
有缘于你 回答时间:2013-12-14 11:54:19

RE:【求助】 STM32F1的8路脉冲计数器

在TIM2 中添加TIM3 判断的部分
yygkqzh 回答时间:2013-12-15 11:24:37

回复:【求助】 STM32F1的8路脉冲计数器

回复第 2 楼 于2013-12-14 11:54:19发表:
在TIM2 中添加TIM3 判断的部分  
 
 
 
请问怎么添加呢?能否详细一些,本人是新手。
yygkqzh 回答时间:2013-12-18 23:38:25

RE:【求助】 STM32F1的8路脉冲计数器

有没有人指导一下呢???
小弟不胜感激!!!
哈维利亚 回答时间:2015-3-26 22:29:31
请问一下你的这个问题解决了吗?我现在也遇到了相似的问题?可不可以请教一下啊?
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
13245底部标题123相同标题
12底部标题123相同标题
33333底部标题123相同序号
3435底部标题-无链接
关注我们
st-img 微信公众号
st-img 手机版