我的目的是定时按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左右,不一定,也就是说刚进中断,计数器已经记了一些数了。不知道是不是这个问题导致的时间精度误差。 不过该现象我百思不得解决办法,请高手说下。 |
另外,我发现这个是一个累积误差,不是一下子差那么多。
我的想法是,难道以前51的定时都可以这么准。stm32 做不到吗?
同样的我用51单片机做的这个一样功能很准的10000秒差不了1秒的。
现在已经要奔溃了,难道没有解决办法。
而且有的时候,又会比较准。
我再定时中断里,强行把TIM_SetCounter(TIM1,0); 计数器再设为0
发现最后定时累积下来反而慢了。