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

关于定时器中断,不准的问题。

[复制链接]
lyhtal 提问时间:2015-4-23 15:04 /
我的目的是定时按10K的频率往串口送数,计算这边根据的到的数的个数来计时。
发现定时器快了。也就是说定时器中断触发的频率不止10K,运行大概200来秒可能超出一秒。
部分代码如下:

void TIM1_Int_Init(u16 arr,u16 psc)
{
  TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
        NVIC_InitTypeDef NVIC_InitStructure;

        RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE); //ʱÖÓʹÄÜ

        TIM_TimeBaseStructure.TIM_Period = 7199; //ÉèÖÃÔÚÏÂÒ»¸ö¸üÐÂʼþ×°Èë»î¶¯µÄ×Ô¶¯ÖØ×°ÔؼĴæÆ÷ÖÜÆÚµÄÖµ       
        TIM_TimeBaseStructure.TIM_Prescaler =0; //ÉèÖÃÓÃÀ´×÷ΪTIMxʱÖÓÆµÂʳýÊýµÄÔ¤·ÖƵֵ
        TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //ÉèÖÃʱÖÓ·Ö¸î:TDTS = Tck_tim
        TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIMÏòÉϼÆÊýģʽ
        TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure); //¸ù¾ÝÖ¸¶¨µÄ²ÎÊý³õʼ»¯TIMxµÄʱ¼ä»ùÊýµ¥Î»

        TIM_ITConfig(TIM1,TIM_IT_Update,ENABLE );
        TIM_Cmd(TIM1, ENABLE);
        TIM_ClearFlag(TIM1,TIM_FLAG_Update );

        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
        NVIC_InitStructure.NVIC_IRQChannel = TIM1_UP_IRQn;  //TIM3ÖжÏ
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;  //ÏÈÕ¼ÓÅÏȼ¶0¼¶
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;  //´ÓÓÅÏȼ¶3¼¶
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQͨµÀ±»Ê¹ÄÜ
        NVIC_Init(&NVIC_InitStructure);  //³õʼ»¯NVIC¼Ä´æÆ÷

}

void TIM1_UP_IRQHandler(void)   //TIM21ÖжÏ
{
        //m_counter1=TIM_GetCounter(TIM1);
        if(TIM_GetITStatus(TIM1, TIM_IT_Update) != RESET ) /*??TIM3????????*/
        {
                        TIM_ClearITPendingBit(TIM1, TIM_IT_Update  );  //Çå³ýTIMx¸üÐÂÖжϱêÖ¾

                       USART1->DR=0x55;
                        while((USART1->SR&0X40)==0);
        }
}

经过我仔细分析,问题可能在于晶振误差,但是我后来通过示波器观测,排除了。

最后解决办法很奇怪。不知道是为什么。
在中断开始的地方加//m_counter1=TIM_GetCounter(TIM1);
发现值为0x001F左右,不一定,也就是说刚进中断,计数器已经记了一些数了。不知道是不是这个问题导致的时间精度误差。

不过该现象我百思不得解决办法,请高手说下。



收藏 评论5 发布时间:2015-4-23 15:04

举报

5个回答
回答时间:2015-4-23 15:17:11
把输出改为IO口反转,示波器测试波形。
stary666 回答时间:2015-4-23 15:18:41
优先级设成最高
wambob 回答时间:2015-4-23 17:51:19
内部时钟本来就不是精准的
拼命三郎 回答时间:2015-4-23 18:05:21
dd.jpg
lyhtal 回答时间:2015-4-23 18:21:51
按照晶振的误差20个ppm的算的话,也不至于吧。
另外,我发现这个是一个累积误差,不是一下子差那么多。
我的想法是,难道以前51的定时都可以这么准。stm32 做不到吗?
同样的我用51单片机做的这个一样功能很准的10000秒差不了1秒的。

现在已经要奔溃了,难道没有解决办法。

而且有的时候,又会比较准。


我再定时中断里,强行把TIM_SetCounter(TIM1,0); 计数器再设为0

发现最后定时累积下来反而慢了。

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版