在使用定时器的输入捕获进行频率测量时发现用TIM_Cmd()函数关闭定时器后,输入捕获中断还是会被触发,这就很奇怪了,输入捕获是定时器的一种模式,关闭定时器不就意味着输入捕获捕获也被关闭了吗?可是实际并非如此,输入捕获中断正常触发,但是捕获值都为0,那就只有一种可能了——TIM_Cmd()只能关闭计数器,并不能关闭中断。于是我马上查看TIM_Cmd()函数的定义
发现TIM_Cmd()函数内部实现是配置CR1寄存器的CEN位,查看参考手册发现该位为计数器使能位
通过这个问题,我发现自己还是对STM32不是特别熟,很多时候自己觉得懂了,其实也只是知道如何使用,更深入的原理和一些细节自己还是没有掌握或注意到,这就给后续使用埋下了隐患。说到底还是一个细心的问题,编程遇到后面越需要细心,这里的细心有指芯片使用上的细心,也有逻辑上的细心,一个系统运行正常并不意味着没有问题,只能说明发生问题的条件没有出现,程序是人写的就会或多或少存在逻辑上的漏洞,尤其是在存在中断的系统可能会出现竞争,一个程序从某个局部来分析没有问题,但放到整个系统上去分析就可能会出现逻辑漏洞了。所以,我们在写程序时一定要保持严谨的逻辑思维,尽可能注意到细节和漏洞,多思考、多推演。