我们知道在STM32 MCU片内的常规定时器【基本定时器、通用定时器、高级定时器】里面,有个ARR寄存器,它负责配置定时器的计数时钟个数,进而决定每个计数周期的时长。【下图是计数器三种计数方式及溢出点的示意图,绿色圆圈表示溢出位置。】
对于基本定时器和通用定时器,每次溢出时都可以产生更新事件,该事件可以用来触发中断、触发DMA请求、触发其它外设【ADC/DAC等】或与其它定时器级联等。显然,这个更新事件发生频率跟ARR值直接相关,对于单向【边沿对齐】计数模式,更新事件发生频率跟计数频率一致,对于双向【中心对齐】计数模式,更新事件发生的频率是计数频率的2倍。如果希望更新事件发生的频率快点或慢点,只需相应调整计数时钟及分频值和ARR值即可。然而在高级定时器里,又引入了另外一个寄存器RCR,它针对计数器的溢出动作进行计数,每发生RCR+1次溢出就可以产生更新事件。它不再要求更新事件于每个计数周期都发生,让更新事件发生点更具灵活性。如果单从影响更新事件发生频率这个角度来看,它的引入似乎多余。我们调整ARR及时钟分频不照样可以达到目的吗?为何还要来个RCR呢?
的确,单从计数定时这个角度来看,引入这个对溢出次数进行统计的寄存器意义并不大,正因为如此,也就不难理解基本定时器和通用定时器就没有这个RCR寄存器及相关部件。
不过,