型号:STM8S003
bug重现:定时器TIM1或者TIM2,设置prescaler为任意允许值,period设为较大值。编写一段程序:首先通过setcounter函数将计数器(CNTR)清零,然后不断通过getcounter函数轮询计数器寄存器,当计数器大于某个设定值(如10000)的时候,再次setcounter将计数器清零。假设prescaler设为16,主频为16M,则计数器的值每1微秒递增1。故当计时器值大于10000时,可知已经过10毫秒。实际测试发现,循环调用这段程序,每次延时不到1毫秒。且修改prescaler,延时完全没有变化。
原因定位:通过测试,发现调用setcounter函数设置计数器值,会导致prescaler寄存器清零。
临时解决办法:在每次调用setcounter之后,重新设置prescaler。
void setcntr()
{
TIM1_SetCounter(0);
TIM1->PSCRH = 0;
TIM1->PSCRL = 15;
TIM1->EGR =TIM1_PSCRELOADMODE_IMMEDIATE;
}