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

【求助】 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管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版