文号
t68709
阅读
3330
回复
1
收藏
1
发现STM8S定时器硬件bug一处
2014/12/22
IP:广东
型号: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;
}
1
笔记
{{note.content}}
{{n.user.username}}
{{fromNow(n.toc)}} {{n.status === noteStatus.disabled ? "已屏蔽" : ""}} {{n.status === noteStatus.unknown ? "正在审核" : ""}} {{n.status === noteStatus.deleted ? '已删除' : ''}}
  • 编辑
  • 删除
  • {{n.status === 'disabled' ? "解除屏蔽" : "屏蔽" }}
我也是有底线的