定时按10K的频率往串口送数但定时器中断不准

2019-07-14 17:19发布

我的目的是定时按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左右,不一定,也就是说刚进中断,计数器已经记了一些数了。不知道是不是这个问题导致的时间精度误差。

不过该现象我百思不得解决办法,请高手说下。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
4条回答
vewwerwr
2019-07-15 09:28
按照晶振的误差20个ppm的算的话,也不至于吧。
另外,我发现这个是一个累积误差,不是一下子差那么多。
我的想法是,难道以前51的定时都可以这么准。stm32 做不到吗?
同样的我用51单片机做的这个一样功能很准的10000秒差不了1秒的。

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

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


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

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

一周热门 更多>