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。

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

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

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

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值