while(!懂){ read datasheet;}
1、文档上讲,stm32最多有11个定时器。但并非都可以用作所有用途的。
2、从系统框架图下看,名为TIMx的有八个,其中TIM1和TIM8挂在APB2总线上,而TIM2-TIM7则挂在APB1总线上。
其中TIM1&TIM8称为高级控制定时器(advanced control timer).他们所在的APB2总线也比APB1总线要好。APB2可以工作在72MHz下,而APB1{zd0}是36MHz。
3、高级控制定时器包含一个16位的自动重装载计数器。这个计数器由可编程的预分频器驱动。
也就是说:
定时器时钟——>预分频器—->计数器
4、计数器相关的还有一个“自动重装寄存器”,与自动重装寄存器相关的还有一个预装载寄存器。这三个寄存器其实是存同一个值的,只不过是时间不同而己。根据我对手册(stm32 reference manual)的理解,自动重装寄存器就是预装载寄存器的影子寄存器(手册上提到预装载寄存器有影子寄存器,但没有明说是什么,或者说我没看见),他们三个的关系这样的。
当某些事情A发生 计数器计数一次完成
一个计数值—>预装载寄存器————————>自动装载寄存器—————————>计数器。
这里,当某些事情A发生,手册上对A的描述包括但不xx于:
a.在TIM1_CR1 寄存器中的自动装载预装载使能位(ARPE)的值为1时,A=永远。
b.如果非a,则A=更新事件(update event)更新事件发生。
———–更新事件=计数器溢出或TIMx_CR1寄存器的UDIS==0.
所以定时器讲到这里所形成的结构为:
预装载寄存器
(重装载寄存器)
CK_CNT ? ? |
定时器时钟—–>分频器——–>计数器————->
上述结构中CK_CNT为分频器输出时钟信号的名字。
控制分频器分频倍数的是TIMx_PSC寄存器。
5、如何工作?
通过计数的自动装载,然后自动计数,就可以如实现一个周期性的计数。然后呢?然后计数器满时发生中断,这样就可以完成一个定时器的功能了。
然而通常我们还有其它的需求,比如说PWM控制电机。而现在所讲到的高级控制定时器也确实就是因为它能实现很多功能才“高级”的。
想实现PWM怎么办呢?计数器的循环计数己经可以实现周期了,下来要做的就是定义占空比。由此我们就要了解“通道(channel)”的概念。
一个定时器是简单的用法只能支持一个PWM,但是如果换一种做法,实际上可以支持多个,其前提是各路PWM周期相同而占空比不同。而定时器的“通道”概念实际就实现了这一想法。TIM1&TIM8各有四个通道。每个通道都一样的。
在计数器的同一层面上有四个”捕获/比较寄存器”(Capture/Compare Register),也就是每个通道一个。我们单讲一个通道。我们可以在这个寄存器放一个值,计数器从0开始计数,PWM输出为0,当计数器与这个寄存器里的数相同之后,PWM输出1.这样我就设置好了占空比了,就可以产生PWM了。
每个通道的“捕获/比较寄存器”里放入不同的占空比值,就可以产生四路PWM了。到这里我们对定时器的功作方式就有了一个大致的了解,虽然我们并没有讲其他的工作模式,但相比而言,有区别,但流程相同。