在计算机中,为了便于管理,常把一条指令的执行过程划分为若干个阶段,每一阶段完成一项工作。例如,取指令、存储器读、存储器写等,这每一项工作称为一个基本操作。

 

时钟周期:

时钟周期也叫振荡周期或晶振周期,即晶振的单位时间发出的脉冲数,一般有外部的振晶产生,比如 12MHZ=12×10 的 6 次方,即每秒发出 12000000 个脉冲信号,那么发出一个脉冲的时间就是时钟周期,也就是 1/12 微秒。通常也叫做系统时钟周期。是计算机中最基本的、最小的时间单位。

 

在 8051 单片机中把一个时钟周期定义为一个节拍(用 P 表示),二个节拍定义为一个状态周期(用 S 表示)。

 

机器周期:

在计算机中,为了便于管理,常把一条指令的执行过程划分为若干个阶段,每一阶段完成一项工作。例如,取指令、存储器读、存储器写等,这每一项工作称为一个基本操作。完成一个基本操作所需要的时间称为机器周期。一般情况下,一个机器周期由若干个 S 周期(状态周期)组成。8051 系列单片机的一个机器周期同 6 个 S 周期(状态周期)组成。前面已说过一个时钟周期定义为一个节拍(用 P 表示),二个节拍定义为一个状态周期(用 S 表示),8051 单片机的机器周期由 6 个状态周期组成,也就是说一个机器周期=6 个状态周期=12 个时钟周期。

 

在标准的 51 单片机中,一般情况下,一个机器周期等于 12 个时钟周期,也就是机器周期=12*时钟周期,(上面讲到的原因)如果是 12MHZ,那么机器周期=1 微秒。单片机工作时,是一条一条地从 RoM 中取指令,然后一步一步地执行。单片机访问一次存储器的时间,称之为一个机器周期,这是一个时间基准。

 

机器周期不仅对于指令执行有着重要的意义,而且机器周期也是单片机定时器和计数器的时间基准。例如一个单片机选择了 12MHZ 晶振,那么当定时器的数值加 1 时,实际经过的时间就是 1us,这就是单片机的定时原理。

 

但是在 8051F310 中,CIP-51 微控制器内核采用流水线结构,与标准的 8051 结构相比指令执行速度有很大的提高。在一个标准的 8051 中,除 MUL 和 DIV 以外所有指令都需要 12 或 24 个系统时钟周期,最大系统时钟频率为 12-24MHz。而对于 CIP-51 内核,70%的指令的执行时间为 1 或 2 个系统时钟周期,只有 4 条指令的执行时间大于 4 个系统时钟周期。 所以在计算定时器的值时要注意这里的变化。

 

指令周期:

指令周期是执行一条指令所需要的时间,一般由若干个机器周期组成。指令不同,所需的机器周期数也不同。对于一些简单的的单字节指令,在取指令周期中,指令取出到指令寄存器后,立即译码执行,不再需要其它的机器周期。对于一些比较复杂的指令,例如转移指令、乘法指令,则需要两个或者两个以上的机器周期。

 

系统时钟:

系统时钟:系统时钟就是 CPU 指令运行的频率,这个才是 CPU 真正的频率。

 

单片机内部所有工作,都是基于由晶振产生的同一个触发信号源,由这个信号来同步协调工作步骤,我们把这个信号称为系统时钟,系统时钟一般由晶振产生,但在单片机内部系统时钟不一定等于晶振频率,有可能小于晶振频率,也有可能大于晶振频率,具体是多少由单片机内部结构决定,正常情况和晶振频率会存在一个整数倍关系。系统时种是整个单片机工作节奏的基准,它每振荡一次,单片机就被触发执行一次操作。

 

一般来说,单片机只有一个时钟源 . 用了外部晶振,就不用内部 RC,用了内部 RC,就不用外部晶振 . 振荡器振荡,产生周期波 . 单片机在这样的周期波的作用一下有规律的一拍一拍的工作,波的频率越高,单片工作得就越快,波的频率越低,单片机工作得就越慢。

 

有了以上的概念以后,就可以正确的理解定时器的工作原理了,在 8051F310 单片机中,有 3 个定时器,如果定时器 1 工作在模式 1 下,如工作模式 1 下,是 16 位的计时器,最大数值是 65535,当再加 1 时(=65536),就会发生溢出,产生中断,所以如果我们要它计 1000 个数, 那么定时初值就是 65536-1000,结果就是 64536,这个值送给 TH、TL,因为是 16 进制的,所以高位是 64536/256 取商,低位是 64536%6 取余。

 

再者,就是每一计数的时间是多久?一般我们取 12M 晶振时,一个周期刚好是 1us,计数 1000 个就是 1ms,这是因为标准的 51 单片机是 12 时钟周期的(STC 有 6 时钟和 1 时钟方式)。那么,如果我们晶振是 12M,就比较好算,如果是其它的,就用 12 去除好了。比如是 6M 的,那么就是 12/6=2,每个计数是 2us,那么你要定时 1ms 就只要计数 500 个即可以。

 

定时器的初值跟定时器的工作方式,跟晶振频率都有关系。一个机器周期 Tcy=晶振频率 X12,计数次数 N=定时时间 t/ 机器周期 Tcy,那么初值就 X=65536-N,得出的数化成十六进制就行了。这里是用定时器 O 工作方式 1 做例子,如果是其它工作方式,就不能是 65535 了。工作方式 0 是 8192,方式 2,3 是 256。这里有一个公式:

TH=(65536-time/(12/ft))/256

其中,time 就是要延时的 100ms(要取 100000us),ft 是晶振频率。这个式子又可以简化成

TH=(65536-time*ft/12)/256

TL=(65536-time*ft/12)%6

在一本书上还看到了这样计算定时初值的:

TH0=-(50235/256); // 重装 100ms 定时初值

TL0=-(50235%6); /// 这里使用的 6M 晶体,

这里是 6M 晶体,延时 100ms,那么按上面讲的原理,6M 是每个计数为 2us,100ms 定时就是计数 50000 个。

 

那么,定时器初值要 65536-50000=15536,转成 16 进是 3CB0。这就是要送给 TH(=3C) 和 TL(=B0)的值。

 

程序中写 TH0=-(50235/256);其实它是这样的 TH0=0x100-(50235/256); 在 51 中,取负数,其结果就是它的值取反+1,也可以用 0x100(十进制的 256)去减,结果是多少呢?结果就是 3C。

 

以 STM32F103 为例,进行解析

STM32 的 TIM 一般有高级定时器 TIM1,(TIM8 只有在互联性产品有),普通定时器 TIM2,TIM3,TIM4,(TIM5,TIM6,TIM7 有点设备中没有);今天就只介绍普通定时器,因为高级定时器我还不会!每一个普通定时器都有 4 路通道!

 

 

我们先看看这个逻辑图吧!我们今天先讨论讨论定时器的问题!我用红色笔标过的路线就是定时器的工作路线,时钟有内部时钟产生,到 PSC 哪里进行分频处理,然后 CNT 进行计数,上面还有一个自动重装载寄存器 APP。

 

 

这个是分频器的工作原理,我们可以看,分频器设定之前分频系数为 1[1],后面的[2][3][4]分频系数为 2,分频系数改变后,计数周期也跟着改变了;同时预分频设置生效时,他还会产生一个中断信号,这个中断信号不要管他,一个系统时钟周期后会自动消失,跟 I2C 的差不多!

 

 

这个是计数过程,上面说过了,计数跟分频后的周期有关;当计数达到装载的数值之后,系统会产生一个三个信号,其中溢出信号和更新事件一个时钟周期后会自动消失,而这时候触发了更新中断标志位 UIF,我们可以用这个 UPDATE 来做定时器的中断标志信号!

 

TIM_ITConfig(TIM2, TIM_IT_UPDATE, ENABLE);

 

stm32f103xx 器件功能与配置

 

 

3、stm32f103zet6 定时器

大容量的 STM32F103XX 增强型系列产品包含最多 2 个高级控制定时器、4 个普通定时器和 2 个基本定时器,以及 2 个看门狗定时器和 1 个系统嘀嗒定时器。

 

下表比较了高级控制定时器、普通定时器和基本定时器的功能:

 

定时器功能比较

 

 

1)计数器三种计数模式

向上计数模式:从 0 开始,计到 arr 预设值,产生溢出事件,返回重新计时

向下计数模式:从 arr 预设值开始,计到 0,产生溢出事件,返回重新计时

中央对齐模式:从 0 开始向上计数,计到 arr 产生溢出事件,然后向下计数,计数到 1 以后,又产生溢出,然后再从 0 开始向上计数。(此种技术方法也可叫向上 / 向下计数)

 

2)高级控制定时器(TIM1 和 TIM8)

两个高级控制定时器(TIM1 和 TIM8)可以被看成是分配到 6 个通的三三相 PWM 发生器,它具有带死区插入的互补 PWM 输出,还可以被当成完整的通用定时器。四个独立的通道可以用于:

(1)输入捕获

(2)输出比较

(3)产生 PWM(边缘或中心对齐模式)

(4)单脉冲输出

 

配置为 16 位标准定时器时,它与 TIMX 定时器具有相同的功能。配置为 16 位 PWM 发生器时,它具有全调制能力(0~100%)。在调试模式下,计数器可以被冻结,同时 PWM 输出被禁止,从而切断由这些输出所控制的开关。很多功能都与标准的 TIM 定时器相同,内部结构也相同,因此高级控制定时器可以通过定时器链接功能与 TIM 定时器协同操作,提供步或事件链接功能。

 

3)通用定时器(TlMx)

STM32F103XC、STM32F103XD 和 STM32F103XE 增强型系列产品中,内置了多达 4 个可同步运行的标准定时器(TIM2、TIM3、TIM4 和 TIM5)。每个定时器都有一个 16 位的自动加载递加 / 递减计数器、一个 16 位的预分频器和 4 个独立的通道,每个通道都可用于输入捕获、输出比较、PWM 和单脉冲模式输出,在最大的封装配置中可提供最多 16 个输入捕获、输出比较或 PWM 通道。它们还能通过定时器链接功能与高级控制定时器共同工作,提供同步或事件链接功能。在调试模式下,计数器可以被冻结。任一标准定时器都能用于产生:PWM 输出。每个定时器都有独立的 DMA 请求机制。

 

这些定时器还能够处理增量编码器的信号,也能处理 1 至 3 个霍尔传感器的数字输出。

 

4)基本定时器 -TlM6 和 TIM7

这 2 个定时器主要是用于产生:DAC 触发信号,也可当成通用的 16 位时基计数器。独立看门 狗独立的看门狗是基于一个 12 位的递减计数器和一个 8 位的预分频器,它由一个内部独立的 40kHz 的 RC 振荡器提供时钟; 因为这个 RC 振荡器独立于主时钟,所以它可运行于停机和待机模式。它可以被当成看门狗用于在发生问题时复位整个系统,或作为一个自由定时器为应用程序提供超时管理。通过选项字节可以配置成是软件或硬件启动看门狗。在调试模式下,计数器可以被冻结。

 

5)窗口看门狗

窗口看门狗内有一个 7 位的递减计数器,并可以设置成自由运行。它可以被当成看门狗用于在发生问题时复位整个系统。它由主时钟驱动,具有早期预警中断功能; 在调试模式下,计数器可以被冻结。

 

6)系统时基定时器

这个定时器是专用于实时操作系统,也可当成一个标准的递减计数器。它具有下述特性:

(1)24 位的递减计数器

(2)自动重加载功能

(3)当计数器为 0 时能产生一个可屏蔽系统中断

(4)可编程时钟源

 

7)通用定时器的时钟来源;

a:内部时钟(CK_INT)

b:外部时钟模式 1:外部输入脚(TIx)

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

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

 

8)通用定时期内部时钟的产生:

从截图可以看到通用定时器(TIM2-7)的时钟不是直接来自 APB1,而是通过 APB1 的预分频器以后才到达定时器模块。

 

当 APB1 的预分频器系数为 1 时,这个倍频器就不起作用了,定时器的时钟频率等于 APB1 的频率;

 

当 APB1 的预分频系数为其它数值(即预分频系数为 2、4、8 或 16)时,这个倍频器起作用,定时器的时钟频率等于 APB1 时钟频率的两倍。

 

 

这里要分析一下几个概念,也是理解定时器的功能的核心概念,通用定时器有些类似于操作系统的定时器节拍,可以在定时器采用的时钟源的基础上再进行分频,然后再设定溢出大小,进而实现定时的功能,当然自动重载功能更不再话下。

 

预分频的功能是使定时器在 APB 时钟的基础上再一次分频,使其独立的运行。就像上述代码中举例,预分频系数设定为 36000-1,则表示该定时器的 时钟频率就变成了 72MHz/36000 = 2KHz,而“计数溢出大小”可以理解为自动装载数值,表示每隔 x 个计数溢出一次,可以产生 1 次中断,当然这个频率是经过预分频后的频率。

 

所以从上述的分析可知,定时器的定时时间计算为:

Tout = (TIM_Period+1)*(TIM_Prescaler+1)/72000000

在本程序案例中:Tout= 2000*36000/72000000=1s

 

需要注意的是,公式中的 72000000 的使用,是因为该定时器采用的时钟源为 72MHz,如果配置成别的时钟源,则相应公式也应该改变。

 

另外 TIM_ClockDivision 为时钟分割,这个简单的讲,就是定时器的数字滤波功能,设置成默认即可。