今天在配置完定时器以后,为了查看实际多久进一次中断,在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