你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

单片机中各种周期与定时器的详解

[复制链接]
gaosmile 发布时间:2020-4-23 18:30
时钟周期:
! C& C1 }3 N3 M8 g7 ~- o; A4 @1 H
/ x  j$ a4 p) D. V4 v
: f% G/ D5 N0 L# G1 ~# t
时钟周期也叫振荡周期或晶振周期,即晶振的单位时间发出的脉冲数,一般有外部的振晶产生,比如12MHZ=12×10的6次方,即每秒发出12000000个脉冲信号,那么发出一个脉冲的时间就是时钟周期,也就是1/12微秒。通常也叫做系统时钟周期。是计算机中最基本的、最小的时间单位。
% c  Y  o% g7 |& Q' f# x; i3 h
) J+ \! v! ^- f# D( V

% A9 g2 @& d0 F6 \  x在8051单片机中把一个时钟周期定义为一个节拍(用P表示),二个节拍定义为一个状态周期(用S表示)。
/ p. a1 |: G( h2 ^9 X" |3 Z
8 Z, z) m7 e9 i机器周期:+ D, p; q6 y; j' s! T9 J, {. i8 S
! @5 `0 [5 J/ c* Y9 D
& }: Q0 X' N: U7 |8 y2 v; i, g% ]
在计算机中,为了便于管理,常把一条指令的执行过程划分为若干个阶段,每一阶段完成一项工作。例如,取指令、存储器读、存储器写等,这每一项工作称为一个基本操作。完成一个基本操作所需要的时间称为机器周期。一般情况下,一个机器周期由若干个S周期(状态周期)组成。8051系列单片机的一个机器周期同6个S周期(状态周期)组成。前面已说过一个时钟周期定义为一个节拍(用P表示),二个节拍定义为一个状态周期(用S表示),8051单片机的机器周期由6个状态周期组成,也就是说一个机器周期=6个状态周期=12个时钟周期。; X, o/ e  D. M4 j( c

4 h# P) m$ F. ~: Y' {
3 L) U" R/ O5 D" m
在标准的51单片机中,一般情况下,一个机器周期等于12个时钟周期,也就是机器周期=12*时钟周期,(上面讲到的原因)如果是12MHZ,那么机器周期=1微秒。单片机工作时,是一条一条地从RoM中取指令,然后一步一步地执行。单片机访问一次存储器的时间,称之为一个机器周期,这是一个时间基准。
2 S% F+ h& l2 X: M2 z: A* h2 |, O! g
( \; [% I4 b3 z' F
机器周期不仅对于指令执行有着重要的意义,而且机器周期也是单片机定时器和计数器的时间基准。例如一个单片机选择了12MHZ晶振,那么当定时器的数值加1时,实际经过的时间就是1us,这就是单片机的定时原理。
0 S# c. B- |! N: ]& O  c* Y5 z0 b, C* u% O6 b% `

- J7 d; S! x& s0 v) S8 Q+ f. w" s0 D但是在8051F310中,CIP-51 微控制器内核采用流水线结构,与标准的 8051 结构相比指令执行速度有很大的提高。在一个标准的 8051 中,除 MUL和 DIV以外所有指令都需要 12 或 24 个系统时钟周期,最大系统时钟频率为 12-24MHz。而对于 CIP-51 内核,70%的指令的执行时间为 1或2个系统时钟周期,只有 4 条指令的执行时间大于 4 个系统时钟周期。所以在计算定时器的值时要注意这里的变化。, |: n& a7 t/ `, v; }
) \! ?; ^6 ~3 E- L) L7 Q" h
指令周期:0 A' l4 _0 O0 x6 s
9 v1 _0 Z- N+ |$ e2 x4 @! s
8 y- l% u* U4 t
指令周期是执行一条指令所需要的时间,一般由若干个机器周期组成。指令不同,所需的机器周期数也不同。对于一些简单的的单字节指令,在取指令周期中,指令取出到指令寄存器后,立即译码执行,不再需要其它的机器周期。对于一些比较复杂的指令,例如转移指令、乘法指令,则需要两个或者两个以上的机器周期。! j  b2 s5 A7 T( p0 E% h
2 F8 g6 G7 P/ l0 a8 t! C, A1 j
系统时钟:7 K* Z# Y) A' G+ ?" `/ O

; _; l1 C( W% t$ Y- u% N

( l* O  i4 O8 `' B2 F系统时钟:系统时钟就是CPU指令运行的频率,这个才是CPU真正的频率。
4 ^% u+ Y: `% d1 z; H6 f* {. b; \- B  N) \

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

  y# [4 D5 y* u) G* e, s- i

' s( h5 b( o. Q: L& ^8 \* c一般来说,单片机只有一个时钟源.用了外部晶振,就不用内部RC,用了内部RC,就不用外部晶振.振荡器振荡,产生周期波.单片机在这样的周期波的作用一下有规律的一拍一拍的工作,波的频率越高,单片工作得就越快,波的频率越低,单片机工作得就越慢。
8 S! `) Y5 b' Q, O* ^
* [" s/ n( g& d. e2 k- F有了以上的概念以后,就可以正确的理解定时器的工作原理了,在8051F310单片机中,有3个定时器,如果定时器1工作在模式1下,如工作模式1下,是16位的计时器,最大数值是65535,当再加1时(=65536),就会发生溢出,产生中断,所以如果我们要它计1000个数, 那么定时初值就是65536-1000,结果就是64536,这个值送给TH、TL,因为是16进制的,所以高位是64536/256取商,低位是64536%6取余。4 n+ o. E7 y$ H: Q& T; J

9 z  `9 [1 o- v

1 d1 A: M# y- C% u再者,就是每一计数的时间是多久?一般我们取12M晶振时,一个周期刚好是1us,计数1000个就是1ms,这是因为标准的51单片机是12时钟周期的(STC有6时钟和1时钟方式)。那么,如果我们晶振是12M,就比较好算,如果是其它的,就用12去除好了。比如是6M的,那么就是12/6=2,每个计数是2us,那么你要定时1ms就只要计数500个即可以。; C8 D  h/ K7 j" M% |% F7 x
8 I; s+ N( s! n! L
9 _9 o  R  b/ p% R  j+ ]  w& Y% T2 e
定时器的初值跟定时器的工作方式,跟晶振频率都有关系。一个机器周期Tcy=晶振频率X12,计数次数N=定时时间t/机器周期Tcy,那么初值就X=65536-N,得出的数化成十六进制就行了。这里是用定时器O工作方式1做例子,如果是其它工作方式,就不能是65535了。工作方式0是8192,方式2,3是256。这里有一个公式:
6 g4 Z2 L& v. W  N% p! n. x: ?7 l# K+ o
2 P) c3 q: V/ ]1 q' s4 q0 @6 y: U
TH=(65536-time/(12/ft))/256
: e3 Y  Y3 A5 p# \5 y8 T, i# n' t7 @9 \  ^' I( [% h7 z

* D! M1 ~; M, v5 `9 U其中,time就是要延时的100ms(要取100000us),ft是晶振频率。这个式子又可以简化成
4 h7 G4 g4 j, o( p) ~7 j  N" R8 C6 F/ O1 Z8 }4 _0 l

  C+ {) ~. A( K" M" dTH=(65536-time*ft/12)/256
1 p9 Q( w" |* n/ N6 i; O) CTL=(65536-time*ft/12)%6
6 C! T" ?" _' Y6 u4 A7 [1 o8 G( V3 `/ e# G

  {5 [% F5 H- d2 ]6 V1 O' n在一本书上还看到了这样计算定时初值的:0 u0 b0 [5 ]+ d3 L$ O
; N, W3 s2 s2 l5 u

: W5 E  a; E  k: y+ G6 \TH0=-(50235/256); //重装100ms定时初值/ w+ ^- a- P5 A0 U" W8 _5 E0 ]5 Q0 b
TL0=-(50235%6); ///这里使用的6M晶体,/ W( G; f( W3 J) q% x9 f
# `. _/ H: X6 E6 M! n. x+ W
) D$ m' B' e% Z1 L4 n6 E3 e
这里是6M晶体,延时100ms,那么按上面讲的原理,6M是每个计数为2us,100ms定时就是计数50000个。5 Q4 P3 g- a8 ~8 z7 V0 h- j

4 [6 Z5 ~/ Q! R4 }; K/ k2 s

! c) U/ N2 Q0 a" i8 a那么,定时器初值要 65536-50000=15536,转成16进是3CB0。这就是要送给TH(=3C) 和TL(=B0)的值。. O0 T6 h2 D+ w8 V3 D5 V$ h, V1 H
9 F. n9 q" k; _. J/ L% L9 l

: t( S  p7 f( L- h" Q程序中写 TH0=-(50235/256);其实它是这样的TH0=0x100-(50235/256); 在51中,取负数,其结果就是它的值取反+1,也可以用0x100(十进制的256)去减,结果是多少呢?结果就是3C。. D2 J) |- L4 A# \5 F

+ {$ ]5 e- O6 A以STM32F103为例,进行解析% @* t6 ^. [' ^
( a: u$ ^6 D# ?
8 S. x- I" |( n6 G1 w
STM32的TIM一般有高级定时器TIM1,(TIM8只有在互联性产品有),普通定时器TIM2,TIM3,TIM4,(TIM5,TIM6,TIM7有点设备中没有);今天就只介绍普通定时器,因为高级定时器我还不会!每一个普通定时器都有4路通道!
" Q" _, T4 [0 j- r; I
- p" ?# \  |; i- H0 `" ^
微信图片_20200423182555.jpg
+ {2 K# ~  M& L6 L. G$ w
: Q6 f' @0 S4 Q9 U; n& g) J+ i) |1、先看看逻辑图
! B$ c  h+ I9 Z" }6 h& a
# H& T; v% j7 e8 [; e  r0 ~0 g# [4 e' b! c! P4 j! f5 i# N
我们今天先讨论讨论定时器的问题!我用红色笔标过的路线就是定时器的工作路线,时钟有内部时钟产生,到PSC哪里进行分频处理,然后CNT进行计数,上面还有一个自动重装载寄存器APP。
5 R. Q0 O  v3 |; _1 O
3 Y3 O* `7 D2 x& Q. n4 }  p
微信图片_20200423182607.png
; ^* }4 Z. e; s0 G/ G
这个是分频器的工作原理,我们可以看,分频器设定之前分频系数为1[1],后面的[2][3][4]分频系数为2,分频系数改变后,计数周期也跟着改变了;同时预分频设置生效时,他还会产生一个中断信号,这个中断信号不要管他,一个系统时钟周期后会自动消失,跟I2C的差不多!9 e: p1 z; r+ J8 C' Q5 V

) i% v: M4 o+ C# z9 c: R4 h
微信图片_20200423182610.png
; V$ l& c6 t  Y9 ^1 N. t6 c! b
这个是计数过程,上面说过了,计数跟分频后的周期有关;当计数达到装载的数值之后,系统会产生一个三个信号,其中溢出信号和更新事件一个时钟周期后会自动消失,而这时候触发了更新中断标志位UIF,我们可以用这个UPDATE来做定时器的中断标志信号!

4 \$ e7 X. G- `- ]0 [$ E
) T# h  X- u6 ]9 N  o1 s3 [TIM_ITConfig(TIM2, TIM_IT_UPDATE, ENABLE);* L* t' K, u) `. {; r+ V$ X

' q* \! }6 W7 T' {

) H2 {" b4 N" @% K2、stm32f103xx器件功能与配置+ E' A  F9 ~/ X2 M2 F: k* i) Y6 ?
   微信图片_20200423182615.jpg 1 J0 l  ?8 T8 ~
- Z/ I" l2 ]# x4 b' ]
. q! u  w, d+ m, \- N" `" W- y& E3 E
3、stm32f103zet6 定时器
' D& e! p+ L0 E3 p  m

+ [3 r- `5 r6 w& s, |+ Z7 x8 q4 u6 B. o( B
大容量的STM32F103XX增强型系列产品包含最多2个高级控制定时器、4个普通定时器和2个基本定时器,以及2个看门狗定时器和1个系统嘀嗒定时器。
: A- z# F5 i( Z4 F4 ?) \9 Y
下表比较了高级控制定时器、普通定时器和基本定时器的功能:
# v, g1 b2 G0 h' l% ]2 g* _" y9 p6 E" P

. ?! R7 V7 I! g# j4 k定时器功能比较& O+ V6 ?) J+ w6 c
0 }! c% a! n! t, @+ j: `* c. ^( t: o
微信图片_20200423182618.png
  ( j  h5 W: b9 _, R$ O

1)计数器三种计数模式

7 @7 l, g, [$ m+ ~

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


% o. v4 ?" q6 y% j$ X

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

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

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

3 h  f: ]# o" P' K& ?+ W; n

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

% S+ Z& e' ?4 I; U8 {8 ^! }8 x

(1)输入捕获

(2)输出比较

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

(4)单脉冲输出


# H' I" v( Y- C% \1 }0 F% c' a8 Z

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

3)通用定时器(TlMx)

. @) J4 E6 m, {0 Y- G3 E

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

) ^; ~5 I' \2 F3 x4 {

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

4)基本定时器-TlM6和TIM7

( O" ?. N% I+ |. T6 B

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

5)窗口看门狗

6 x, K8 b+ [7 T8 m; q1 |

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

6)系统时基定时器

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

" j; ~3 G2 z9 y. ^* S4 J9 n7 v

(1)24位的递减计数器

(2)自动重加载功能

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

(4)可编程时钟源

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

a:内部时钟(CK_INT)

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

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

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

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

' w% u% H# j0 O! N" |8 K) g% P* E7 y

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

. ~, q  w( {0 @% ]

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

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


% |; m; l2 [* ]- N. `

微信图片_20200423182621.png

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

4 i. C) N9 N. |- I
预分频的功能是使定时器在APB时钟的基础上再一次分频,使其独立的运行。就像上述代码中举例,预分频系数设定为36000-1,则表示该定时器的 时钟频率就变成了72MHz/36000 = 2KHz,而“计数溢出大小”可以理解为自动装载数值,表示每隔x个计数溢出一次,可以产生1次中断,当然这个频率是经过预分频后的频率。
; }6 C% O4 ]' h% l* ^6 m2 g
所以从上述的分析可知,定时器的定时时间计算为:

: w2 P4 N  j4 \
Tout = (TIM_Period+1)*(TIM_Prescaler+1)/72000000

5 L( p/ ?- j( t$ V' t" k$ L) M5 D
在本程序案例中:Tout= 2000*36000/72000000=1s
5 [1 X7 V1 q7 i8 h' q9 J: R
需要注意的是,公式中的72000000的使用,是因为该定时器采用的时钟源为72MHz,如果配置成别的时钟源,则相应公式也应该改变。

% Y9 l9 }, t. o  k
另外TIM_ClockDivision为时钟分割,这个简单的讲,就是定时器的数字滤波功能,设置成默认即可。
收藏 1 评论1 发布时间:2020-4-23 18:30

举报

1个回答
李康1202 回答时间:2020-4-24 09:56:50
顶一下

所属标签

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版