一个关于STM32定时器CCR无法清零的话题



这里跟大家分享一个STM32应用开发过程中操作CCR寄存器遇到的小案例,是关于对STM32定时器中的捕获寄存器CCR进行清零的问题。


有人用STM32F3的定时器做输入捕获,在捕获的回调函数里先将捕捉到的CCR值放入缓冲区,然后打算将CCR寄存器清零。结果发现怎么也无法清零。


客户的相关测试代码如下【基于STM32cube库的代码】:

一个关于STM32定时器CCR无法清零的话题_第1张图片



上面代码的第【1】句将捕获到的CCR值放入CCR_CUR变量

第【2】句意图对TIM4_CCR1清零操作;

第【3】句意欲从TIM4_CCR1读取数据到dbug_data.

最后发现,即使经过ccr清零操作,再来读取CCR的值时发现还是清零操作之前的数据

 

从代码上看似乎并无什么问题。不妨打开芯片参考手册看看CCR寄存器的相关描述


一个关于STM32定时器CCR无法清零的话题_第2张图片


从上述定义上来看,CCR寄存器可读可写,这点写得清清楚楚。作为输入捕捉时CCR的值为最近一次捕捉到的计数器的值。咋看之下也没发现什么异常,难道库代码有问题


尝试将库函数调用直接改为对寄存器的操作,结果还是一样。那问题出在哪里呢?

尝试着再回头继续细看关于输入捕捉的章节,看能否找到蛛丝马迹,终于看到一段关键性的语句【红线标识】


一个关于STM32定时器CCR无法清零的话题_第3张图片


上面红线上的那句话彻底说明白了,当某定时器通道配置为输入捕获时,该通道的CCR寄存器变为只读,只能在发生捕获时硬件装载修改。到这里,问题也算有个了结。对于这个问题,如果手册看得不到位,就有点麻烦。


后来的后来,我重新了下载该芯片的参考手册,也关注了这个细节。发现新版本手册里对于该寄存器的描述已做了进一步的完善,含义更加明确了。关于作为输入捕捉时对寄存器的只读特性做了明确的描述,同时寄存器属性方格里增加了作为IC输入时的只读属性[/r]提示。


一个关于STM32定时器CCR无法清零的话题_第4张图片


总之,在碰到类似问题时,首先有针对性地对相关手册章节仔细研读下,问题或许可以很快迎刃而解。这里提醒特别注意使用最新版本的技术手册,不同版本手册的差异往往体现这些细节的地方。

你可能感兴趣的:(stm32学习笔记)