我的目的是定时按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左右,不一定,也就是说刚进中断,计数器已经记了一些数了。不知道是不是这个问题导致的时间精度误差。
不过该现象我百思不得解决办法,请高手说下。
一周热门 更多>