STM32 定时器学习

时间:2020-12-27 23:21:52

一、高级定时器

          小容量产品指flash在16K-32K字节之间

       中容量产品指flash在64-128K字节之间

       高容量产品指flash在56-512K字节之间

       互联型产品指F105xx和F107xx系列。

       小容量、中容量和互联型的有1个高级定时器TIM1,大容量产品有两个高级定时器TIM1和TIM8。

  1、TIM1和TIM8简介

       高级定时器有一个16位的自动装载计数器组成,有一个可编程的预分频器驱动。功能包括输入捕获、输出比较、PWM、嵌入死区时间的互补PWM。

       使用定时器预分频器和RCC时钟控制预分频器,可以实现脉冲宽度和波形周期从几微妙到几个之间调节。

高级定时器和通用定时器是完全独立的,不共享任何资源。可以同步操作。

  2、TIM1和TIM8特性

       ① 16位的向上、向下、向上/向下自动装载计数器。

       ② 可编程预分频器,分频系数1 — 65535

       ③ 4个独立通道 (输入捕获、输出比较、PWM生成、单脉冲模式输出)

       ④ 死区时间可编程的互补输出

       ⑤ 使用外部信号控制器和定时器互联的同步电路

        允许在指定数目的计数器周期之后更新定时器的重复计数器。

        中断/DMA 

        支持正交编码器和霍尔传感器电路

  3、时基单元

       定时器主要部分是一个16位计数器(CNT)和自动装载寄存器(ARR)、预分频器(PSC)、重复次数寄存器(RCR),这些寄存器可由软件读写。

自动装载寄存器是预先装载的,写和读自动装载寄存器将访问的是预装载寄存器,根据控制寄存器的自动装载预装载的使能位,预装载寄存器的值被立即或每次更新事件时传送到影子寄存器。当控制寄存器UDIS为0且定时器达到溢出时产生更新事件。

   预分频器将计数时钟按1-65535分频,在运行时也可以被改变,在下一次更新事件发生时生效。

   3、计数器模式

向上计数:

        计数器从0开始计数到自动装载寄存器值,然后从开始计数并产生一个溢出事件。

  如果使用了重复计数功能,向上计数达到设置的重复计数次数时(TIMX_RCR)产生更新事件,否则每次计数器溢出产生更新事件。

在TIMX_EGR寄存器设置UG位也可以产生更新事件。

        设置控制器寄存器的UDIS位,可以禁止更新事件。

向下计数:

从自动装载计数器开始递减计数,递减到0产生更新事件。

    4、时钟选择

         计数时钟源:  

        内部时钟

外部时钟模式1:外部输入引脚

外部时钟模式2:外部触发输入ETR

内部触发输入:使用一个定时器作为另一个定时器的预分频器。





二、 通用定时器

通用定时器是一个可编程16位的自动装载计数器。

通用TIx(TIM2 TIM3 TIM4 TIM5)定时器功能包括:

16位的向上、向下、向上/向下计数器

16位的可编程预分频器

4个独立通道(输入捕获、输出比较、PWM生产、单脉冲输出)

使用外部信号控制定时器和定时器互联的同步电路

事件发生时产生中断/DMA (更新:溢出,触发事件,输入捕获,输出比较)

支持增量编码器和霍尔传感器

1、时基单元

16位的计数器(CNT)及自动装载寄存器(ARR)、预分频器寄存器(PSC).


三、基本的定时器TIM6、TIM7

各包含一个16位自动装载计数器,有各自的预分频器驱动。可以作为通用定时器提供时间基准,特别的可以为数模转换器提供时钟。


三、编程注意

  1、输出比较模式

今天使用高级定时器1模式3输出38KHz的占空比50%方波驱动一个发光管,发现了一个问题:

我设置间隔一段时间一束,脉冲结束的时候管子应该是关闭的,结果是有时候管子是关闭的有时候管子是打开的。

后来想了一下明白了:脉冲结束的时候我会失能定时器,定时器的计数器可能比比较寄存器的值大也可能比比较寄存器的值

小,这样结束的时候管子可能是高电平也可能是低电平,后来在结束之前先把定时器的计数器清空,再失能,这样就可以了。

高级定时器要输出需要TIM_CtrlPWMOutputs(TIM3,ENABLE); 添加这样一句话,强制脉冲输出。