-
基本定时器(TIM6-TIM7)
主要功能:作为通用定时器生成时基,驱动数模转换器
主要内容
-
计数器定时器(TIMx_CNT)(16位)
计数器从零开始计数,依此递增(只能向上计数),当达到自动重装载定时器值(TIMx_ARR)时,生成计数器上溢事件,并从零开始重新计数。
-
控制器,控制寄存器的复位,使能等,涉及到寄存器有CR1/2, DIER,EGR,SR。
时钟计数器的频率为 内部时钟频率除以分频器加一,即 (CK_INT / (PSC[15:0] + 1))
上图中,自动重装载定时器框有灰色背景,实际上他是有意义的。即代表自动重装载定时器含有影子寄存器,当启用影子寄存器后,可以起到一个数据缓冲的作用,即当在自动重装载定时器中输入值时,该值不会立即生效,而会在下一个周期生效。ARR寄存器是否启用缓冲取决于TIMx_CR1 中的ARPE(auto-reload preload enable),置一时表示进行缓冲。
-
预分频器(TIMx_PSC)(16位)
对时钟频率进行分配,分频系数介于1 - 65536 之间, 该寄存器也有缓冲,可以随时对其值进行更改,但更改的值在下一周期内生效。
-
自动重装载定时器(TIMx_ARR)
计数器从零开始计数,依此递增(只能向上计数),当达到自动重装载定时器值(TIMx_ARR)时,生成计数器上溢事件,并从零开始重新计数。
- 高级定时器(TIM1,TIM8)
他的时基单元比基本定时器多,依次为
- 计数器计数器 CNT
- 预分频器计数器 PSC
- 自动重装载寄存器 ARR
- 重复计时器寄存器 RCR
其中,预分频器计数器 PSC与自动重装载寄存器 ARR比较特殊,他们都可以实现缓冲输入,即在程序运行任何时间都可以改变PSC与ARR的值,但他们不会立刻生效,当发生更新事件时,他们的值才会生效。其中ARR是否缓冲可以由程序控制,具体是TIMx_CR1寄存器的ARPE(自动重载预装载使能位),当其为0时,表示不进行缓冲,寄存器的值直接生效,当其为1,寄存器的值在更新事件后生效。(其实,在stm32中,不仅有ARR,PSC等寄存器,还有与之对应的影子寄存器(ARR、PSC 和 CCRx都含有影子寄存器),程序是根据影子寄存器的值运行的,即程序数据传输如下 PSC,ARR -> 影子寄存器 ->计数器,而之前缓冲的原理就是,只有在发生更新事件时才可以将PSC,ARR 传输到影子寄存器,其他时间不能传输,而没有缓冲时,值可以直接传输到影子寄存器,即直接生效)如图。
更新事件,发生更新事件时,将更新所有寄存器且将更新标志(TIMx_SR 寄存器中的 UIF 位)置 1(取 决于 URS 位)。
更新事件来源:
- 由溢出更新,当计数器没有使用重复寄存器的值时,当计数器从0到自动重载值(ARR的内容)时,或从自动重载值到0时发生更新;当使用了重复寄存器时,当递增、递减导致溢出的次数达到重复寄存器的值加一时发生更新。
- 由软件更新,将EGR寄存器的UG为置1,可以产生更新事件。
- 从模式控制器生成更新事件。
防止产生更新事件方法:
- 更新禁止,将CR1寄存器的UDIS(update disable)置1可以禁止更新事件,各影子寄存器的值不会改变。
- 设置更新请求源,将CR1的URS位置为1即可使通过UG位更新以及通过从模式控制器更新的方法失效,只有溢出才可以产生更新事件。
更新事件的效果:
可以把数据从预装载寄存器拷贝到相应的影子寄存器(ARR、PSC 和 CCRx),即可使新数据生效。
将更新标志位(SR寄存器的UIF位)置1(取决于URS位)。
更新寄存器:
重复计数器:重载为RCR寄存器的值
自动重装载影子寄存器:重载为ARR的值
预分频器的缓冲区:重载为PSC的值。