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

【经验分享】STM32F1之定时器

[复制链接]
STMCU小助手 发布时间:2021-11-28 22:00
1.定时器简介与作用
3 R/ h/ X0 j2 c9 h
5 ~3 a/ [: d$ Z6 D基本定时器,通用定时器,系统滴答定时器,窗口看门狗,独立看门狗以及RTC工作原理都大差不差,基本都是定时器。+ `* g3 R% j5 G$ C

5 N. I+ x$ O- F$ Y2.定时器的基本知识
# n* H( f& r" u- R8 r2 P# e$ z0 a4 c  j; s7 i
STM32中一共有11个定时器,其中2个高级控制定时器,4个普通定时器和2个基本定时器,以及2个看门狗定时器和1个系统嘀嗒定时器。" I3 j* l2 i9 B/ X+ x
) `; Z( t1 B* }+ Q( r
TIM1和TIM8是能够产生3对PWM互补输出的高级登时其,常用于三相电机的驱动,时钟由APB2的输出产生;TIM2-TIM5是普通定时器;TIM6和TIM7是基本定时器,其时钟由APB1输出产生;" D. q. o2 G' X5 {

7 v2 X; g$ d: ?( @' o预备知识:& ^6 m7 l  `# H% G: O
- r; H5 H0 i6 R1 s- |: I
① STM32通用定时器TIM2是16位自动重装载计数器。
  J0 l9 P. S/ C  z7 S
! C6 o( Y8 C' v& z! J, ^- a② 向上计数模式:从0开始计数,计到自动装载寄存器(TIMx_ARR)中的数值时,清0,依次循环。
* f0 V. P4 c7 L1 v. ]- ]% Q1 X
: N2 f- X( G4 E需要弄清楚的两个问题:
  g% \8 a9 F) ~7 r" u0 L! f
) H  _5 u$ y4 x5 R5 W# Q' L1. 计数器的计数频率是什么?6 v; a% P# @/ w5 A" p
) k# R" N& J) G) u' p
这个问题涉及到RCC时钟部分,如下图所示:% l8 ~9 W% K" ?5 V
, X9 k7 v$ I9 ~
定时器的时钟不是直接来自APB1或APB2,而是来自于输入为APB1或APB2的一个倍频器。
. h5 Q) I/ ?% Q% L" i1 C$ ^
4 |- }- B4 z+ I3 T; ]" q下面以定时器2~7的时钟说明这个倍频器的作用:当APB1的预分频系数为1时,这个倍频器不起作用,定时器的时钟频率等于APB1的频率;当APB1的预分频系数为其它数值(即预分频系数为2、4、8或16)时,这个倍频器起作用,定时器的时钟频率等于APB1的频率两倍。
" l/ u6 ?* @* q. i  K  K4 {
4 B% o+ p: D9 Q  G假定AHB=36MHz,因为APB1允许的最大频率为36MHz,所以APB1的预分频系数可以取任意数值;当预分频系数=1时,APB1=36MHz,TIM2~7的时钟频率=36MHz(倍频器不起作用);当预分频系数=2时,APB1=18MHz,在倍频器的作用下,TIM2~7的时钟频率=36MHz。
2 Q& I, c) i/ H9 y2 _; V( e
: {  @) W6 c% m3 L" r有人会问,既然需要TIM2~7的时钟频率=36MHz,为什么不直接取APB1的预分频系数=1?答案是:APB1不但要为TIM2~7提供时钟,而且还要为其它外设提供时钟;设置这个倍频器可以在保证其它外设使用较低时钟频率时,TIM2~7仍能得到较高的时钟频率。
7 G  s2 t$ Y9 R/ s
4 ]3 A2 i0 _7 u/ y+ P7 Y  ?, _再举个例子:当AHB=72MHz时,APB1的预分频系数必须大于2,因为APB1的最大频率只能为36MHz。如果APB1的预分频系数=2,则因为这个倍频器,TIM2~7仍然能够得到72MHz的时钟频率。能够使用更高的时钟频率,无疑提高了定时器的分辨率,这也正是设计这个倍频器的初衷。
* O( p1 f0 G1 C* E7 x& Q1 ?& q! l+ H2 H% R* X0 E' h, H
定时器的计数频率有个公式:
. Y9 E7 i& R' x' b  p  {
& i: f& q- W- s: J  jTIMx_CLK = CK_INT / (TIM_Prescaler + 1)) b$ W' U; u. ?$ n- ]
0 J, ^) ^( X9 K# ~4 r! D! T: f! `
其中:TIMx_CLK       定时器的计数频率# f7 v- f- s9 [5 ^: l

6 p" B: _5 f4 E      CK_INT         内部时钟源频率(APB1的倍频器送出时钟)
' \8 s+ }+ b/ Y- F1 p& R- _
% ?. `6 e; g1 L7 C4 j) C. S& d      TIM_Prescaler  用户设定的预分频系数,取值范围0~65535。
$ ^( x% ~! w5 S1 ]/ t. v  }4 r* s; S: j0 H0 Q. K- x5 a
例如:RCC中AHB=72MHZ、APB1=36MHZ、APB2=72MHZ,则CK_INT=72MKZ。
2 v( V0 Q$ I- Y- ^4 G) p2 @  I8 A( x, z6 {& F# |7 U4 z) m
2. 如何计算定时时间?
$ C+ i5 |$ G2 T5 j! }
9 Y8 d! V  x" V) W* m" i/ K上述公式中TIM_Prescaler涉及到寄存器TIMx_PSC
( {, a( a/ B; k$ o2 N
5 [. k& Z! m2 K如果TIM_Prescaler设为36000,由上面公式可知:% |  l2 I* m( [" E& e

9 F% ~0 r0 q: X定时器的计数频率 TIMx_CLK = 72MKZ / 36000 = 2000HZ,则定时器的计数周期=1/2000HZ=0.5ms.
) P' A! A! A! c; Y2 @( I0 f: M& C  P% N3 Q' A
如果要定时1秒,则需要计数2000次,这也是自动重装载的值。又涉及到TIMx_ARR+ B4 g" p7 o9 X% k9 E

4 C* ~$ o6 q; _" v$ b1 D只要上述两个问题搞清楚了,剩下的就是设置相应寄存器的对应位了。
2 U! r. K- }! O! s5 Y  {4 F( R$ t9 p' E1 Z  u
3.定时器的使用方法
2 |, r, f/ q! C8 j) o
1 I/ i, |& B7 ~. q& U3 ~. |  j1)开启定时器的时钟,比如timer3,
" x0 I5 l4 v1 l, h5 X
# R' m5 ?) o- z7 y  I2 y; r& yRCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);
: q( D3 M7 g2 P) m/ E, o2)定时器时钟初始化
4 q% q8 T0 y" ~
8 O- h& x! X. \9 X/ ]* S
  1. TIM_InitStgructer.TIM_Period=9999;//计数9999+1=10000次更新一次
    , g& ~2 F& W* k
  2. TIM_InitStgructer.TIM_Prescaler=7199;//时钟分频,72MHz/(7199*2)
    # W7 O# h3 Z  h9 e
  3. TIM_InitStgructer.TIM_CounterMode=TIM_CounterMode_Up;//上升计数,即从0开始记到9999+1=10000次时更新,从0再继续开始计数
    % ?) @+ w6 a# A
  4. TIM_InitStgructer.TIM_ClockDivision=TIM_CKD_DIV1;//无影响( z) @9 e) |* {4 S6 m# A( B
  5. TIM_TimeBaseInit(TIM3,&TIM_InitStgructer);
复制代码
5 T  ]# t, e3 ~6 h
3)清除中断标志
; ?5 Z# I: U0 j% Z4 W2 G" S7 C# W8 _
TIM_ClearFlag(TIM3, TIM_FLAG_Update);
/ W! P4 p: n7 V4)允许更新中断& k. d0 ~" Q: F  l/ M

- o/ q7 [# @' ^2 J- y) dTIM_ITConfig(TIM3,TIM_IT_Update,ENABLE);//允许更新中断$ v. P0 W2 ?3 O3 M" Y( _
5)设置中断优先级
$ \; M/ R- X) [! U6)定时器使能5 I+ N& r0 Q$ Y3 Z) k* Q  O
TIM_Cmd(TIM3,ENABLE);/ T7 ?9 f9 L, N4 N/ }
7)编写中断处理函数并清除中断标志位
0 n( _0 X2 L$ l" D: _( i! |5 s
  1. ' X4 A4 ^( w9 p* G2 J
  2. if(TIM_GetITStatus(TIM3,TIM_IT_Update)!=RESET)% m" Y+ ]& T5 G) Q" j+ e, k! ]8 d1 M
  3. {; i$ W1 V9 \9 l% t* S/ I9 B
  4. TIM_ClearITPendingBit(TIM3,TIM_IT_Update);: w1 W1 a/ M* n1 M+ G6 d
  5. PrintfUsart1("timer update!\r\n");
    : e0 r: H% m. [  {
  6. }
复制代码
( z& ]1 ~. ~6 {6 w. z% f0 P
7 X# V0 e# B" b' p4 M7 e# O) z

' c/ G, w5 G% R- P
收藏 评论0 发布时间:2021-11-28 22:00

举报

0个回答
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版