STM32基本定时器

STM32基本定时器

1.时基单元

  • 计数寄存器 (TIMx_CNT)
    • 计数器从0累加计数到自动重装载数值(TIMx_ARR寄存器),然后重新从0开始计数并产生一个计数器溢出事件。
  • 预分频寄存器 (TIMx_PSC)
    • 它也有缓存,也是在更新事件产生时刷新缓存。
  • 自动重装载寄存器(TIMx_ARR)
    • 设置此值。计数器达到这个值,溢出。
    • 可以给此值设置缓存,这个缓存被称为影子寄存器。 当TIMx_CR1的ARPE位为1时,表示有缓存;否则没有。
    • 有缓存时:更新缓存的时机是 更新事件(计数器溢出或者TIMx_EGR寄存器的UG位为1)产生 时。所以缓存有时不是实时的值。

2.时序中的一些概念

  • CK_PSC : 预分频寄存器的时钟,也就是内部系统时钟,用来控制预分频寄存器的工作频率。

  • CNT_EN : 计数寄存器的使能,对应TIMx_CR1的CEN位,开启后计数器才能计数。

  • CK_CNT : 计数器的频率,也就是分频后的频率,一个频率计数寄存器加一。

  • 计数器寄存器: 每个频率加一。

  • 更新事件(UEV): 一个逻辑的概念,一般计数器溢出或者TIMx_EGR寄存器的UG位为1时产生。

    • 当发生一次更新事件时,所有寄存器会被更新并(根据URS位)设置更新标志(TIMx_SR寄存器的

      UIF位)。

    • 立即产生中断的问题原因是:预分频寄存器的缓存为没分频前的数,频率越高,计数越快,很快就加到了溢出,所以置位后很短时间就产生了一次中断。只有更新事件发生时,才会更新缓存。

    • 解决立即产生中断的问题时,我们可以在设置中断使能之前将UG设置为1,让缓存在中断打开前就更新,之后再将TIMx_SR的UIF位置0,告诉系统我们没有产生更新事件。另外,如果设置了TIMx_CR1寄存器中的URS(选择更新请求),设置UG位可以产生一次更新事件UEV,但不设置UIF标志(即没有中断或DMA请求)。

  • 预分频控制寄存器:也就是预分频寄存器,保存的值为分频的数,想7200分频,就存7199。

  • 预分频器缓冲器: 预分频寄存器的缓冲区,在更新事件产生时更新缓冲区的值。

  • 预分频器计数器: 一个内部时钟周期加一,也就是计算定时器时钟走到当前时走了几个内部时钟。

posted on 2024-01-18 19:57  持枢丶  阅读(61)  评论(0编辑  收藏  举报