定时器,使用TIM3定时器,定时5s 重复3次,累计15s 但是仿真每次仅有4.5s 一共12s左右,定时器的误差这么大,还是我参数算错了呢??求解答

2019-07-25 17:59发布

定时器,使用TIM3定时器,定时5s 重复3次,累计15s 但是仿真每次仅有4.5s 一共12s左右,定时器的误差这么大,还是我参数算错了呢??求解答
main函数
main () { RCC_Configuration();  //配置系统时钟 NVIC_Configuration(); //系统中断管理   LED_Init();   //LED端口初始化 Timerx_Init(50000);//10Khz的计数频率,(计数到5000为500ms)已修改后,计数为nms 即500ms
 while (1)   {      ;   } //通用定时器中断初始化 //这里时钟选择为APB1的2倍,而APB1为36M //arr:自动重装值。 //psc:时钟预分频数 //这里使用的是定时器3!
//static u8  count=0;//定时计数数   void Timerx_Init(u16 arr ) {     TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure; NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //时钟使能
TIM_TimeBaseStructure.TIM_Period = (arr*10); //设置在下一个更新事件装入活动的自动重装载寄存器周期的值 计数到5000为500ms TIM_TimeBaseStructure.TIM_Prescaler =(7200-1); //设置用来作为TIMx时钟频率除数的预分频值  10Khz的计数频率   TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_tim TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式 TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位   TIM_ITConfig(  //使能或者失能指定的TIM中断 TIM3, //TIM2 TIM_IT_Update  |  //TIM 中断源 TIM_IT_Trigger,   //TIM 触发中断源  ENABLE  //使能 ); NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;  //TIM3中断 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;  //先占优先级0级 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;  //从优先级3级 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能 NVIC_Init(&NVIC_InitStructure);  //根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器
TIM_Cmd(TIM3, ENABLE);  //使能TIMx外设   }
void TIM3_IRQHandler(void)   //TIM3中断 { if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET) //检查指定的TIM中断发生与否:TIM 中断源  { TIM_ClearITPendingBit(TIM3, TIM_IT_Update  );  //清除TIMx的中断待处理位:TIM 中断源  count++; if(count==3) { count=0; LED1=!LED1; } } }
一开始,用每次定时一秒的时候,误差没有这样大的,是不是参数要自己设定调整的呢??要准确定时,还是用sys系统定时器会精确点呢??
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。