STM32H7 Timer再探密

       上个博客有提到,由于HAL库默认的初始化配置,所以完成初始化后会触发一次进入Timer中断。通过控制URS位可以确保初始化后不会立刻进入Timer中断,这对对于大多数情况来说已经完全足够。

       但是如果还需要更精细的对Timer的控制,我们会发现即使配置了URS位,让Timer不立刻进入中断,如果不立刻使能Timer,则第一次进入Timer中断的时间会是不确定的。简单点说,如果不是经过HAL库初始化后立刻使用Timer,第一次进入Timer的时间会出问题。这里出现两个问题:

       1)为什么初始化完成后不立刻使用Timer,那初始化有什么意义?

       2)为什么会出现不立刻使用Timer就会导致第一次进入Timer的时间出问题?

 

       关于第一个问题,我的回答是和项目的需求有关。本身HAL库初始化是需要时间的,如果我们需要通过Timer去控制某些快速的动作(us量级),而且需要靠某些信号到达(例如中断)才可以执行,那么初始化本身的时间就不一定可以忽略不记了。这时候就可能需要提前初始化,然后在使用的时候直接使能就可以用了。

       关于第二个问题,为什么会出问题?其实数据手册已经有说明,主要是因为STM32的CR寄存器有一个CEN位,该位控制Timer计数器的计时。HAL库初始化时,默认会将该位初始化为1。所以即使禁止Timer中断,计数器也会计数。根据我的测试和理解,如果Timer定时1ms,那么Timer第一次进入中断的时间会再0到1ms之间,并不会出现计数器超过1ms,然后出现翻转的问题。因为虽然不进入中断,但是定时值已经配置好,到1ms就会清0。

STM32H7 Timer再探密

STM32H7 Timer再探密

总的来说,要解决上述问题有两个方法:

1)初始化时将CEN位置0,则不会触发计数。

2)在使能Timer前,先把计数器清空一下