关于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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值