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

【经验分享】STM32F1之定时器

[复制链接]
STMCU小助手 发布时间:2021-11-28 22:00
1.定时器简介与作用
, s; f6 O% B. B# C* Y- K, l0 c1 [5 K- A8 o) }4 I1 f
基本定时器,通用定时器,系统滴答定时器,窗口看门狗,独立看门狗以及RTC工作原理都大差不差,基本都是定时器。# V1 L. U- G7 P6 x8 c

/ F; k6 `+ ]9 F# Y& Q7 S  }) d5 u2.定时器的基本知识7 y1 J" S+ b" }; V& _
& v: k. ^8 l3 q) N+ H3 y5 k
STM32中一共有11个定时器,其中2个高级控制定时器,4个普通定时器和2个基本定时器,以及2个看门狗定时器和1个系统嘀嗒定时器。
: f! N0 U) ?' _: _( i9 o2 v% W1 D1 C; Q; H8 m1 h
TIM1和TIM8是能够产生3对PWM互补输出的高级登时其,常用于三相电机的驱动,时钟由APB2的输出产生;TIM2-TIM5是普通定时器;TIM6和TIM7是基本定时器,其时钟由APB1输出产生;2 h- t6 I' p/ R1 T

  [( V" D& @' M+ [5 x预备知识:2 y) `; V! `1 M, Y! d. _

/ U1 l- r/ r) L4 B- m  }① STM32通用定时器TIM2是16位自动重装载计数器。) E9 Q: G5 ~$ R; x
1 P7 }4 ~1 E7 f% i" W/ w
② 向上计数模式:从0开始计数,计到自动装载寄存器(TIMx_ARR)中的数值时,清0,依次循环。# t' q7 B  T% F9 Q6 u- S2 [
5 h6 L7 b1 [% L: t4 |
需要弄清楚的两个问题:
, T/ Y9 o, d1 d6 v8 V& f' N
, B, ^$ B% |6 m1. 计数器的计数频率是什么?
- @# n. p# {/ j& t& u( P+ v( p- L9 P7 k" {, c5 U! E
这个问题涉及到RCC时钟部分,如下图所示:" `9 j' ]4 G: ^9 {0 t
- V! s$ d, Z: Y: l& r7 F8 z
定时器的时钟不是直接来自APB1或APB2,而是来自于输入为APB1或APB2的一个倍频器。; P$ q. r. G/ I+ V

% O. u+ g* J. |9 Q; c3 G5 b- ?下面以定时器2~7的时钟说明这个倍频器的作用:当APB1的预分频系数为1时,这个倍频器不起作用,定时器的时钟频率等于APB1的频率;当APB1的预分频系数为其它数值(即预分频系数为2、4、8或16)时,这个倍频器起作用,定时器的时钟频率等于APB1的频率两倍。
3 d8 g& T' A/ N4 S
- u- B# r! [, t1 w4 {假定AHB=36MHz,因为APB1允许的最大频率为36MHz,所以APB1的预分频系数可以取任意数值;当预分频系数=1时,APB1=36MHz,TIM2~7的时钟频率=36MHz(倍频器不起作用);当预分频系数=2时,APB1=18MHz,在倍频器的作用下,TIM2~7的时钟频率=36MHz。
) v1 q* t  `) s* i2 ?& y5 U! D; x* z3 y  X
有人会问,既然需要TIM2~7的时钟频率=36MHz,为什么不直接取APB1的预分频系数=1?答案是:APB1不但要为TIM2~7提供时钟,而且还要为其它外设提供时钟;设置这个倍频器可以在保证其它外设使用较低时钟频率时,TIM2~7仍能得到较高的时钟频率。
( w/ r9 ?+ t* M3 c2 ~, \
2 B0 Q2 C! u3 S再举个例子:当AHB=72MHz时,APB1的预分频系数必须大于2,因为APB1的最大频率只能为36MHz。如果APB1的预分频系数=2,则因为这个倍频器,TIM2~7仍然能够得到72MHz的时钟频率。能够使用更高的时钟频率,无疑提高了定时器的分辨率,这也正是设计这个倍频器的初衷。# U! v. R" |4 @5 O1 |  p& ]/ G7 a

; m: `# Q6 M3 L9 M; H- b# p$ I定时器的计数频率有个公式:
2 x# k) F( h: z7 y' N1 f) X* ?* S6 n: I' h( e8 H8 {5 d- M
TIMx_CLK = CK_INT / (TIM_Prescaler + 1), a. {2 e3 v- G$ ~/ ?3 y, M
$ @: @; Y5 }2 o6 J) K/ g% w
其中:TIMx_CLK       定时器的计数频率
! ]- w+ p8 N+ @: O8 ~0 o# d  a0 L( d
/ n7 j2 K6 D- B7 c2 }      CK_INT         内部时钟源频率(APB1的倍频器送出时钟)# }8 i6 p8 L3 D( Q) _9 ~

5 v! t9 _' H* T9 O7 l6 X; [      TIM_Prescaler  用户设定的预分频系数,取值范围0~65535。
& Y' y  t+ K" Z3 B2 @- ]; ~4 `+ {1 J: ~7 f
例如:RCC中AHB=72MHZ、APB1=36MHZ、APB2=72MHZ,则CK_INT=72MKZ。; Z( B) q9 c  {; l+ n; n

) e; j8 U( }2 j6 E- K% Z0 p9 a2. 如何计算定时时间?
# A; m( Y- l! R4 Q  h! b8 p
. t! V- s4 q5 r! f上述公式中TIM_Prescaler涉及到寄存器TIMx_PSC
/ i, p4 _, S% l
4 N" H6 H' m4 s# n* P1 r4 {; V. H如果TIM_Prescaler设为36000,由上面公式可知:
. U2 D) i2 X: F! z
2 C2 `9 K/ j8 l定时器的计数频率 TIMx_CLK = 72MKZ / 36000 = 2000HZ,则定时器的计数周期=1/2000HZ=0.5ms., E' C/ s4 L# E' z' G

2 a2 S$ E! m+ Q% V如果要定时1秒,则需要计数2000次,这也是自动重装载的值。又涉及到TIMx_ARR9 P- d& ~& {5 y( r, [
6 }7 m7 J2 I7 j8 }
只要上述两个问题搞清楚了,剩下的就是设置相应寄存器的对应位了。
4 v1 e4 e, t9 q; c9 f6 {3 H
* r/ e' R. [, `6 X6 T& F3.定时器的使用方法
* H0 U* o1 K$ M/ y) S9 D0 h
3 y$ `* s& o7 C1)开启定时器的时钟,比如timer3,# j5 ]! v% O. m4 n5 t8 }
! X% `4 H' Y! n
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);
" E/ s! P, W4 M+ _2)定时器时钟初始化
. j5 r0 D0 P6 `* P! @5 a; X- E
) C. o( M1 v) z9 L- X8 ^& W8 q. Q6 f
  1. TIM_InitStgructer.TIM_Period=9999;//计数9999+1=10000次更新一次
    ) }' q2 _9 \& [/ }3 n+ |$ w) s" a
  2. TIM_InitStgructer.TIM_Prescaler=7199;//时钟分频,72MHz/(7199*2)
    # g, C- q& G4 z) s( d5 ~
  3. TIM_InitStgructer.TIM_CounterMode=TIM_CounterMode_Up;//上升计数,即从0开始记到9999+1=10000次时更新,从0再继续开始计数+ h9 P/ m* m8 h# Z& k' p  [- n  l
  4. TIM_InitStgructer.TIM_ClockDivision=TIM_CKD_DIV1;//无影响
    1 b( e& c0 \9 x' H, p
  5. TIM_TimeBaseInit(TIM3,&TIM_InitStgructer);
复制代码

% I' h& Z) ^* U3)清除中断标志
8 F+ j% z4 }+ P
  @# K. h; z3 i, xTIM_ClearFlag(TIM3, TIM_FLAG_Update);* t) v7 P6 j2 m, [; y3 z
4)允许更新中断
. Q) a! j' y( l6 e( \* x
: M2 W% ~0 v6 L& _8 V: O8 gTIM_ITConfig(TIM3,TIM_IT_Update,ENABLE);//允许更新中断/ u% [# Z# i: f% w/ A2 B2 I6 L0 j
5)设置中断优先级# r: m% _( z& i9 G$ b9 H
6)定时器使能
0 |; I$ N2 s: A5 V7 mTIM_Cmd(TIM3,ENABLE);' ]. W. n- T! W
7)编写中断处理函数并清除中断标志位
; H( w0 c3 K/ ^
  1. , k  D' b  x# ]6 s( Y0 h
  2. if(TIM_GetITStatus(TIM3,TIM_IT_Update)!=RESET)
    / j4 _, d# e: w6 C7 ?
  3. {
    * ?4 u) }# G/ ]- `& g5 h3 _
  4. TIM_ClearITPendingBit(TIM3,TIM_IT_Update);4 |. W+ g6 E3 @
  5. PrintfUsart1("timer update!\r\n");
    & c4 t, B, j7 E5 w+ ]/ ]3 d) c
  6. }
复制代码

* q' Q9 p. F. p) b9 X5 Q5 o1 E" B( }+ L+ X0 V& c. h: p! M
: v, K/ q0 u9 p' L) f. R" Y
收藏 评论0 发布时间:2021-11-28 22:00

举报

0个回答
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版