关于stm32或GD32定时器自动重装载值加一减一的问题

今天在配置完定时器以后,为了查看实际多久进一次中断,在keil中设置断点来查看了下,结果发现与配置的200ms中断一次差了5个ms
之后把自动重载值减去1,发现误差减小到了50us,整整两个数量级的误差!

之后又使用小灯程序试了下实际效果,确实是1S闪烁
附上定时器配置代码如下:

void my_timer_init(void)
{
    timer_parameter_struct timer_init_struct;

    rcu_periph_clock_enable(RCU_TIMER2);
    // TIMER2
    timer_deinit(TIMER2);
    timer_init_struct.prescaler = 41999; // 84000000/(41999+1)=2000Hz
    timer_init_struct.alignedmode = TIMER_COUNTER_EDGE;
	timer_init_struct.counterdirection = TIMER_COUNTER_UP; // 向上计数
	//设置向上计数溢出值
    timer_init_struct.period = 99;                     // 100*0.5=50ms
    timer_init_struct.clockdivision = TIMER_CKDIV_DIV4;
    //
    timer_init_struct.repetitioncounter = 0;
	
    timer_init(TIMER2, &timer_init_struct);
	
		timer_counter_value_config(TIMER2,0);//当前计数值设为0

		
		timer_interrupt_flag_clear(TIMER2,TIMER_INT_FLAG_UP);
		//Enable the interrupt of timer2 ,set interrupt flag as UP
		timer_interrupt_enable(TIMER2,TIMER_INT_UP);
		//config nvic 
		nvic_irq_enable(TIMER2_IRQn,0,2);
    timer_enable(TIMER2);
}

总结:配置定时器时,预分频值和period值都要减1,可以确保计时时间准确

添加补充
2019.10.26
具体的计数原理和配置讲解可以参考下面这篇博主的文章,讲的十分清楚,他使用的是寄存器操作
https://blog.csdn.net/ybhuangfugui/article/details/51534803

猜你喜欢

转载自blog.csdn.net/ericanxuanxuan/article/details/102747918