请选择 进入手机版 | 继续访问电脑版

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

【经验分享】STM32F1之定时器

[复制链接]
STMCU小助手 发布时间:2021-11-28 22:00
1.定时器简介与作用: j! k: V$ [5 ~( o' v7 P/ X

, C- i, o+ o6 G3 r基本定时器,通用定时器,系统滴答定时器,窗口看门狗,独立看门狗以及RTC工作原理都大差不差,基本都是定时器。1 n% P% k3 W0 F$ A: `8 Y5 x7 p7 V0 T
7 p7 t0 K( e5 j' _3 [
2.定时器的基本知识
# q; e' @# [: {! i; \& ~
" ^9 I& g  I8 \' USTM32中一共有11个定时器,其中2个高级控制定时器,4个普通定时器和2个基本定时器,以及2个看门狗定时器和1个系统嘀嗒定时器。2 y& h2 l; P5 \+ M  l
* r) P( C9 [6 v; v
TIM1和TIM8是能够产生3对PWM互补输出的高级登时其,常用于三相电机的驱动,时钟由APB2的输出产生;TIM2-TIM5是普通定时器;TIM6和TIM7是基本定时器,其时钟由APB1输出产生;# m% }5 X9 A; m/ u3 F. p
# E9 h1 @) x8 k; L9 G% z2 }) k' |& u
预备知识:
! N. R- x6 C6 k) {3 |# o. Y8 z/ ?
1 H  r1 _2 }  f① STM32通用定时器TIM2是16位自动重装载计数器。
6 Q% C7 S7 M% ^2 \, v7 N' ~& J' R; U* Q/ o" S, b+ {
② 向上计数模式:从0开始计数,计到自动装载寄存器(TIMx_ARR)中的数值时,清0,依次循环。. n' d: a& M( O
; S8 M6 A1 F/ ]# m$ ]
需要弄清楚的两个问题:
! @$ q) L' q0 l; V
. o4 K% `- O( a& I; [" p/ V( D1. 计数器的计数频率是什么?* m) \# T) {9 o8 N7 V7 M
4 i: m" }2 Q4 g
这个问题涉及到RCC时钟部分,如下图所示:6 f6 v7 X) n% J  h& L9 _8 O  W- r
% ^) i: U) h/ z) {1 L
定时器的时钟不是直接来自APB1或APB2,而是来自于输入为APB1或APB2的一个倍频器。
5 ^5 B4 r; J) u, G7 Q! {2 i$ }9 D* w$ ~8 t
下面以定时器2~7的时钟说明这个倍频器的作用:当APB1的预分频系数为1时,这个倍频器不起作用,定时器的时钟频率等于APB1的频率;当APB1的预分频系数为其它数值(即预分频系数为2、4、8或16)时,这个倍频器起作用,定时器的时钟频率等于APB1的频率两倍。 % S/ N( {2 d& I
: Z' x2 U, p, K
假定AHB=36MHz,因为APB1允许的最大频率为36MHz,所以APB1的预分频系数可以取任意数值;当预分频系数=1时,APB1=36MHz,TIM2~7的时钟频率=36MHz(倍频器不起作用);当预分频系数=2时,APB1=18MHz,在倍频器的作用下,TIM2~7的时钟频率=36MHz。2 ?/ k0 g; u+ Z" V0 r3 `+ ]0 N
8 j$ H( J, h' W. q4 |8 r/ k
有人会问,既然需要TIM2~7的时钟频率=36MHz,为什么不直接取APB1的预分频系数=1?答案是:APB1不但要为TIM2~7提供时钟,而且还要为其它外设提供时钟;设置这个倍频器可以在保证其它外设使用较低时钟频率时,TIM2~7仍能得到较高的时钟频率。
# S4 @: X& a5 F; Y7 }! v3 A# @0 p" ^! a! c6 Q1 g. {1 ?7 B2 w& S
再举个例子:当AHB=72MHz时,APB1的预分频系数必须大于2,因为APB1的最大频率只能为36MHz。如果APB1的预分频系数=2,则因为这个倍频器,TIM2~7仍然能够得到72MHz的时钟频率。能够使用更高的时钟频率,无疑提高了定时器的分辨率,这也正是设计这个倍频器的初衷。; k: l6 t0 E3 d' [% t9 e3 Y  q

( |' Y9 y  H; M# `6 `5 T# X( }5 f定时器的计数频率有个公式:
/ b2 i8 c4 G- ^% l; e- _: X+ ?- N# [) @
TIMx_CLK = CK_INT / (TIM_Prescaler + 1)3 ^/ b$ J2 K; x* _3 d: B( g( }
( n; d+ `0 z  S0 u* O9 E0 B
其中:TIMx_CLK       定时器的计数频率
2 O+ I- Z1 C8 c. n" p9 o4 ]) K
* d5 C" M- B6 _2 ^/ _% N; R1 x      CK_INT         内部时钟源频率(APB1的倍频器送出时钟)2 r% Y* G* m. ?4 f
0 c8 M4 w& v! s! N
      TIM_Prescaler  用户设定的预分频系数,取值范围0~65535。( d, w) {4 U+ r6 r9 Y, E

$ q: k2 G: v3 k- ]* \7 B例如:RCC中AHB=72MHZ、APB1=36MHZ、APB2=72MHZ,则CK_INT=72MKZ。
  x8 P& P& u/ T; P8 Y. g
6 J9 Q8 d3 u, `0 x6 J7 k2. 如何计算定时时间?
6 Y' s7 p" j9 b0 }
6 c9 B0 k4 Z9 X0 q& K# H7 {上述公式中TIM_Prescaler涉及到寄存器TIMx_PSC
# E% `% w; u/ ?- ?' P1 w
) l7 Y$ Z$ [. D1 M5 }如果TIM_Prescaler设为36000,由上面公式可知:
3 I$ F$ B; m2 M. J) Y7 I
& d% ~! K3 f/ e: l定时器的计数频率 TIMx_CLK = 72MKZ / 36000 = 2000HZ,则定时器的计数周期=1/2000HZ=0.5ms.9 U- F9 y0 A3 A1 X
9 Y5 ?+ m& t) b2 L& w
如果要定时1秒,则需要计数2000次,这也是自动重装载的值。又涉及到TIMx_ARR7 N4 M, J5 r2 \- g  J

! u* B+ m. h3 j1 V, ~8 i- F只要上述两个问题搞清楚了,剩下的就是设置相应寄存器的对应位了。
* k8 o, Y1 A5 q4 V4 c' A; x7 m' D# R: J% i" }
3.定时器的使用方法
: a3 v- G: S; n9 c; `7 ^! w. g" O# S, c1 q8 h8 x0 _
1)开启定时器的时钟,比如timer3,0 N" D3 k6 n# s2 O( g- f( |+ H7 J

% V0 v6 t+ I$ w3 lRCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);
- B! Z- y' {  b& m2)定时器时钟初始化
* @$ t8 }. F0 q# c7 k2 f- P. o' e! v3 y3 ~
  1. TIM_InitStgructer.TIM_Period=9999;//计数9999+1=10000次更新一次
    / A+ T, S- Y. [7 _  \9 y1 {1 t
  2. TIM_InitStgructer.TIM_Prescaler=7199;//时钟分频,72MHz/(7199*2)
    , x2 K' q" Y5 x
  3. TIM_InitStgructer.TIM_CounterMode=TIM_CounterMode_Up;//上升计数,即从0开始记到9999+1=10000次时更新,从0再继续开始计数6 S/ G  x( v# W0 i$ \; a
  4. TIM_InitStgructer.TIM_ClockDivision=TIM_CKD_DIV1;//无影响& X7 h* p7 h. Y4 r1 u( Z- P4 S8 r
  5. TIM_TimeBaseInit(TIM3,&TIM_InitStgructer);
复制代码

8 r: V4 v7 @3 a0 K/ @3)清除中断标志6 p6 H& H. ~3 j+ i- o5 L

0 x1 e9 ]4 `2 ]9 R  L5 o- ^; lTIM_ClearFlag(TIM3, TIM_FLAG_Update);
. K" y! O9 l- F$ @& q4)允许更新中断) v8 N" l/ Y3 m; _' C1 ~6 W
- {% d& H2 p0 [7 _
TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE);//允许更新中断
6 h6 q: t. T1 P3 t& K% C; D+ H5)设置中断优先级# b6 Y) y6 S: \* O6 m0 o" g  P
6)定时器使能
: F& j2 W% x# yTIM_Cmd(TIM3,ENABLE);. j' i" F; x/ M5 A, |$ y* J
7)编写中断处理函数并清除中断标志位
. q! y5 y" Z8 [4 g1 t% N+ A

  1. ' G6 ^( B% ?5 Q
  2. if(TIM_GetITStatus(TIM3,TIM_IT_Update)!=RESET)0 A, O( l7 O  P7 f
  3. {5 K8 Z0 Q( Z" W. F$ K/ Z
  4. TIM_ClearITPendingBit(TIM3,TIM_IT_Update);
    ; t7 x0 x# q6 i6 [+ K
  5. PrintfUsart1("timer update!\r\n");2 n5 @6 C9 s. v4 @0 q
  6. }
复制代码

& b  L8 Y/ Q% C7 @( G5 A) T: m  W$ ]3 j6 u; p5 I" x
4 h: v% e8 P3 _: J+ a6 c
收藏 评论0 发布时间:2021-11-28 22:00

举报

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