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

STM32F103关于定时器输入捕获的疑问

[复制链接]
sdfsdfsdfty 提问时间:2022-10-11 19:01 / 未解决
void TIM2_IRQHandler(void)
{
    if( TIM_GetITStatus( TIM2, TIM_IT_CC3 ) != RESET )
    {
         printf( "CH3_Val:%d\r\n",TIM_GetCapture3( TIM2 ));
        TIM_SetCounter( TIM2, 0 );
    }
    TIM_ClearITPendingBit( TIM2, TIM_IT_CC3 );
}
我用的是TIM2通道3的输入捕获功能,我发下把打印放在中断里面(正常值应该是1000),数值会100左右的偏差  905  904这个样子
    while(1)
        {
        if( TIM_GetITStatus( TIM2, TIM_IT_CC3 ) != RESET )
        {
            printf( "CH3_Val:%d\r\n",TIM_GetCapture3( TIM2 ));
        }
        };
将这个判断放在while中,获取的值就变成正常的1005-1006这样的在正常偏差范围内了;
想了解一下是为什么?我看了一下ST的例程也是把打印放在while中。
收藏 评论4 发布时间:2022-10-11 19:01

举报

4个回答
butterflyspring 回答时间:2022-10-12 09:52:56
楼主可以测试一下你打印的时间,你会发现还是花费不少。如果你的捕获信号比较快的时候,这时候在中断里执行的时间就就太久了,以至于延迟甚至错过了下一次的捕获信号的中断。
杨小杨 回答时间:2022-10-12 08:54:28
中断处理时间要越短越好,中断里面是不可以放Printf函数,放在中断里相当于定时器中断里又处理了串口发送任务,中断执行的要求是越短越好,并且中断运行特别快,放Printf使得中断时间拉长,会出现进不去中断现象,因为捕获速度特别快,所以中断处理越短越好,越不容易有问题。
xmshao 回答时间:2022-10-12 10:43:41
首先,不建议在中断里嵌入打印函数,往往很多时候我们对printf的实现过程并不太清楚,它跟当前中断会发生怎样的竞争都不可知。


另外,你认为当前捕捉值发生较大误差,感觉跟Printf有关的判断没有大问题。结合你有限的几行代码来看,我认为根本原因可能


是printf影响了中断的执行,进而影响TIM2的清零时间点。


你要知道,当发生捕捉后,在发生第二次捕捉前,捕捉值是不会变化的,一直在CCR寄存器里面。
sdfsdfsdfty 回答时间:2022-10-12 19:22:10
懂了,谢谢大佬们
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版