解决STM32使用HAL库时,RCR寄存器写入时机与参考手册不符的问题

最近接着在调电机,关于测电流需要准确确定在定时器上溢出或者下溢出的时候采样。

手册上写,RCR为奇数的情况下,在定时器启动前写入,就会在定时器上溢出的时候触发更新事件。

但是实际测试并非如此,我一开始以为是中文手册有问题,可能一开始写错了,但是中文版没有修改。于是在英文参考手册上找,也是找到相似的表述。我又在外网找了一下,想着如果是这么明显的问题,应该早就有人提出才对,但是也没有找到。

但是找到了我们国内自己对这个RCR的一个讨论的帖子:

https://bbs.21ic.com/icview-189946-1-1.html

其中就有几个哥们说到,他们也有RCR不能确定上下溢出的问题,于是采用在中断中判断方向位来判断上下溢。

其中有个哥们的话提醒了我,“即使 RCR=1, 是不能保证一定在计数器下溢时更新的. 也有可能是在每次上溢时更新. 完全看你初始化时的状态. 中间也有可能因其他的溢出条件(比如强制updata位)改变.”

那么,是不是在什么地方,有一个地方产生了更新事件,导致之后所有的更新事件发生时机都与手册相反了呢?

结果果真让我找到了。

在HAL库初始化定时器的代码中,有一个TIM_Base_SetConfig 函数,这个函数最后一句:


  /* Generate an update event to reload the Prescaler
     and the repetition counter (only for advanced timer) value immediately */
  TIMx->EGR = TIM_EGR_UG;

我的老天爷。就是你小子惹的祸。

问题找到了,就有两种解决办法,要嘛把这句话去掉,这样之后的更新事件发生还是和手册一样。吐槽一下,手册确实没写错,只是后来写HAL库的人自己加了这句,如果用寄存器的话,应该是没这个问题的。

也可以不把这句话去掉,那么之后的更新事件就和手册相反了。反就反了呗,找个地方写个注释就行了。

当然,也可以按照帖子中哥们的说法,自己手动判断一下上下溢出,但是由于我代码里没有其他地方会导致Update事件生成了,因此就懒得改了。

发表评论