1.功能及原理
基本定时器TIM6和TIM7各包含一个16位自动装载计数器,由各自的可编程预分频器驱动。它们可以作为通用定时器提供时间基准,特别地可以为数模转换器(DAC)提供时钟。实际上,它们在芯片内部直接连接到DAC并通过触发输出直接驱动DAC。这2个定时器是互相独立的,不共享任何资源。
由图可知其时钟源仅能来源于PCLK1,当PCLK1预分频系数为1时 TIMCLK =PCLK1,否则TIMCLK =2*PCLK1。计数器的驱动时钟= TIMCLK/PSC。
基本定时器的计数器为累加计数器,计数器值(CNT)从0开始累加到自动装载值(ARR)时会产生一个溢出事件,每次溢出事件会产生更新事件,使能中断后会产生相应中断。
比较特别的一点是关于运行时修改ARR和PSC的值。这个需要理解影子寄存器,ARR和PSC都有两个寄存器,一个保存我们写入的值,影子寄存器实际上是正在运行时的值。
ARR的影子寄存器由_CR1中的ARPE位控制是否使能。ARPE为0时预装载值立即传输到影子寄存器中,CNT计数到新的预装载值时就产生溢出事件;ARPE为0时预装载值会在一个更新事件之后才会传输到影子寄存器中,CNT计数到原预装载值后才更新影子寄存器,下次计数时才会按新的预装载值进行计数。
PSC的影子寄存器只会在一个更新事件之后才会传输到影子寄存器中。
关于更新事件还有两个点:
_CR1中URS位可以选择UEV事件的请求源,为0:如果使能了中断或DMA,以下任一事件可以产生一个更新中断或DMA请求:计数器溢出、设置UG位、 通过从模式控制器产生的更新(其实这个好像没有)。为1时,如果使能了中断或DMA,只有计数器溢出可以产生更新中断或DMA请求。
UDIS位禁止更新,为0时更新事件使能,为1时不产生更新事件(UEV),影子寄存器保持它的内容(ARR、 PSC)。但是如果设置了UG位则计数器和预分频器将被重新初始化。
单脉冲模式 :在_CR1中OPM选择,为1时,在发生下次更新事件时,计数器停止计数(清除CEN位)。
2.寄存器
TIMx_CR1:除了前面介绍了ARPE、OPM、URS、UDIS,就只有CEN,就是使能定时器。
TIMx_CR2:设置主模式选择MMS,由于时钟仅可来源于PCLK1,所以个人觉得它不能工作在从模式下。但可以在主模式下工作。
000: 复位 – 使用TIMx_EGR寄存器的UG位作为触发输出(TRGO)。
001: 使能 –> 计数器使能信号CNT_EN被用作为触发输出(TRGO)。
010:更新 – 更新事件被用作为触发输出(TRGO)。
TIMx_DIER:只用2个位,分别是使能DMA和使能中断。
TIMx_SR:只用1个位,标识更新中断。
TIMx_EGR:只用1个位,UG:产生更新事件,置1时,重新初始化定时器的计数器并产生对寄存器的更新。注意:预分频器也被清除(但预分频系数不变)。
TIMx_CNT、TIMx_PSC、TIMx_ARR:分别是计数值、分频系数、预装载值。
3.使用方法
基本使用方法:
①TIMx时钟使能。
②设置 TIMx_ARR 和 TIMx_PSC 的值。
③设置 TIMx_DIER 允许更新中断。
④允许 TIMx 工作,开始计数。
⑤TIMx 中断分组设置。
⑥编写中断服务函数,在处理完中断之后应,该向 TIMx_SR 的最低位写 0,来清除该中断标志。