声明:大部分内容来源于野火的PDF文档
高级定时器TIM的时基单元
高级控制定时器时基单元包括四个寄存器,分别是计数器寄存器(CNT)、预分频器寄存器(PSC)、自动重载寄存器(ARR)和重复计数器寄存器(RCR)。其中重复计数器 RCR 是高级定时器独有,通用和基本定时器没有。前面三个寄存器都是 16 位有效, TIMx_RCR 寄存器是 8 位有效。
预分频
预分频器 PSC,有一个输入时钟 CK_PSC 和一个输出时钟 CK_CNT。输入时钟CK_PSC 就是上面时钟源的输出,输出 CK_CNT 则用来驱动计数器 CNT 计数。通过设置预分频器 PSC 的值可以得到不同的 CK_CNT,实际计算为: fCK_CNT等于fCK_PSC/(PSC[15:0]+1),可以实现 1 至 65536 分频。
计数器CNT
计数器 CNT
高级控制定时器的计数器有三种计数模式,分别为递增计数模式、递减计数模式和递增/递减(中心对齐)计数模式。
自动重载寄存器 ARR
自动重载寄存器 ARR 用来存放与计数器 CNT 比较的值,如果两个值相等,
对于高级定时器,就递减重复计数器,当重复计数器减为零时就产生更新或中断。如果没有使用到重复计数器时,就直接产生更新和中断。
对于基本定时器和通用定时器,也就产生更新和中断。
但要注意到图中自动重载寄存器下方中有阴影。这是自动重载寄存器的影子寄存器功能。
实际上,我们在把值装进自动重载寄存器TIMx_ARR 中之前,是把值放在影子寄存器中的,然后有影子寄存器再送到自动重载寄存器TIMx_ARR 中的。
那么怎么使用这个影子寄存器的功能呢?
举个例子,当我们在程序中想要修改自动重载寄存器 ARR值的时候,如果想要修改的值不立即生效,而是在当前事件更新之后才让影子寄存器把 TIMx_ARR 值赋给自动重载寄存器 ARR值,也就是才让它生效。则可以通过 将TIMx_CR1 寄存器的 ARPE 位置 1来实现,而如果将 ARPE 位置为 0,则修改的 TIMx_ARR 值立即生效。
在一般的程序设计中,我们大多在一开始就把TIMx_ARR 的值给定下来了,也很少修改他。所以一般也不设置这个功能。
也就是在配置HAL库的时候,会有这个选项。
第一个即使配置Counter Period的值也就是计数器 CNT 的值,这个后面还有个括号中(AutoReload Register …),其实也就是设置自动重载寄存器的值 ARR。
下面还有个auto-reload preload (自动重装载预装载),一般就直接Disable,我都装载好了,而且一般我也不轻易改变这个值,所以我也用不到auto-reload preload。