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

【经验分享】STM32F1之定时器

[复制链接]
STMCU小助手 发布时间:2021-11-28 22:00
1.定时器简介与作用
# x" h; g0 q& [4 }8 F: s' D( q6 ?, d) M7 Y7 K0 \# ]
基本定时器,通用定时器,系统滴答定时器,窗口看门狗,独立看门狗以及RTC工作原理都大差不差,基本都是定时器。
, W( c6 F( B, q% ?2 D! o( L8 A% b( l! n
2.定时器的基本知识
- b0 T: f* X! \( b7 B* j3 r: w8 j2 \( R# A' E
STM32中一共有11个定时器,其中2个高级控制定时器,4个普通定时器和2个基本定时器,以及2个看门狗定时器和1个系统嘀嗒定时器。) s" E/ ^; c; k: V3 ?

' I, p: U- u8 d! p: ATIM1和TIM8是能够产生3对PWM互补输出的高级登时其,常用于三相电机的驱动,时钟由APB2的输出产生;TIM2-TIM5是普通定时器;TIM6和TIM7是基本定时器,其时钟由APB1输出产生;, s: p, [# D) x+ Y# {! K2 d
* h& R# X- C0 f3 A' ]
预备知识:' F6 ~$ T6 `. K# p+ H- ?- w
6 U6 ]8 Q0 N# d8 [  [
① STM32通用定时器TIM2是16位自动重装载计数器。
2 ~6 r' r* x& P0 u0 o
& t, d1 }2 R& [  `7 m2 n② 向上计数模式:从0开始计数,计到自动装载寄存器(TIMx_ARR)中的数值时,清0,依次循环。
: @' h; p$ s+ C0 [! y+ ^8 I! g) n( M& e& B2 Y5 J: s
需要弄清楚的两个问题:% T; @; a2 Q4 B: a6 N  X* W/ d# s

) C, R& g5 K0 G$ H1. 计数器的计数频率是什么?
2 Q/ e  c$ r# j( B" {1 g7 K, ?
% }- b- G3 Z7 s8 q: M7 V* Q这个问题涉及到RCC时钟部分,如下图所示:
8 A$ F; J' b8 F3 W2 b0 t0 [
4 ]6 Y& [5 a" R" D8 x  V: g定时器的时钟不是直接来自APB1或APB2,而是来自于输入为APB1或APB2的一个倍频器。; w, F" }) c) O0 D

# C) n- W1 n7 p# A2 k0 g. p下面以定时器2~7的时钟说明这个倍频器的作用:当APB1的预分频系数为1时,这个倍频器不起作用,定时器的时钟频率等于APB1的频率;当APB1的预分频系数为其它数值(即预分频系数为2、4、8或16)时,这个倍频器起作用,定时器的时钟频率等于APB1的频率两倍。 & E8 K1 a1 L" @6 B2 V2 _& ?% k

6 T5 m) f' L+ r: v2 e! \" c. X: t假定AHB=36MHz,因为APB1允许的最大频率为36MHz,所以APB1的预分频系数可以取任意数值;当预分频系数=1时,APB1=36MHz,TIM2~7的时钟频率=36MHz(倍频器不起作用);当预分频系数=2时,APB1=18MHz,在倍频器的作用下,TIM2~7的时钟频率=36MHz。
. K, u9 B& l: {% p5 X
; b9 H$ @& q0 u) Z( Z有人会问,既然需要TIM2~7的时钟频率=36MHz,为什么不直接取APB1的预分频系数=1?答案是:APB1不但要为TIM2~7提供时钟,而且还要为其它外设提供时钟;设置这个倍频器可以在保证其它外设使用较低时钟频率时,TIM2~7仍能得到较高的时钟频率。
7 y' R) `8 }& [  t8 q7 c8 T9 c7 c% x$ r
再举个例子:当AHB=72MHz时,APB1的预分频系数必须大于2,因为APB1的最大频率只能为36MHz。如果APB1的预分频系数=2,则因为这个倍频器,TIM2~7仍然能够得到72MHz的时钟频率。能够使用更高的时钟频率,无疑提高了定时器的分辨率,这也正是设计这个倍频器的初衷。
& U! k7 ~1 j, ~4 ^% q+ L
5 t: \6 u* O' Y9 L定时器的计数频率有个公式:
4 Z  S- o7 p% Y  G  [1 W
$ ~% }8 |- o# ^' ]: ]7 \1 wTIMx_CLK = CK_INT / (TIM_Prescaler + 1)9 `0 P$ k4 D0 H8 ^

9 a4 ^  c+ p, x% [$ @3 C- B) \其中:TIMx_CLK       定时器的计数频率& Y* p" w0 t. p: a  s. X1 q
. G; q6 ^9 R! w5 q4 M( O
      CK_INT         内部时钟源频率(APB1的倍频器送出时钟)
6 l% E: ?( A7 _7 b; p# X' J4 I0 Y3 W
      TIM_Prescaler  用户设定的预分频系数,取值范围0~65535。
. Z5 L$ u3 E. M1 W
, O* h$ A+ P9 G1 ?例如:RCC中AHB=72MHZ、APB1=36MHZ、APB2=72MHZ,则CK_INT=72MKZ。8 N3 o1 h% m% S) Y
4 L7 s( G5 }* T. U- c, i0 r
2. 如何计算定时时间?$ C3 E/ E  D& x% x

) I2 _1 Y$ r4 l3 X3 Y$ y上述公式中TIM_Prescaler涉及到寄存器TIMx_PSC
! f% r4 Y2 @4 T) |7 g, N0 I, k. s7 ?& F; g7 R8 P
如果TIM_Prescaler设为36000,由上面公式可知:$ Q" {7 P/ k8 @( o
' r0 o( x3 S1 G+ y
定时器的计数频率 TIMx_CLK = 72MKZ / 36000 = 2000HZ,则定时器的计数周期=1/2000HZ=0.5ms.
6 g% m9 G+ E$ n9 o6 f' ]1 R+ T' x" m9 b# D
如果要定时1秒,则需要计数2000次,这也是自动重装载的值。又涉及到TIMx_ARR& K, b4 h, g/ e1 v6 D. r6 ~- A. D
" Y6 P( B' f7 v6 `, s
只要上述两个问题搞清楚了,剩下的就是设置相应寄存器的对应位了。
3 r# t# b; l& n  v4 s. _* ?* B) w( ?' t- [3 M% ^$ r
3.定时器的使用方法
" C9 i. [! x, G, n/ M( Y2 f; L* P7 S) N* M: C
1)开启定时器的时钟,比如timer3,  a4 M/ D) b* k8 N

3 B7 i8 W$ F# E+ t: V7 |7 v+ x1 nRCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);
5 I2 w) t- Y2 u/ ~" ~2)定时器时钟初始化
3 \7 m+ s! J* R0 W$ S/ }* h/ h2 p2 I
  1. TIM_InitStgructer.TIM_Period=9999;//计数9999+1=10000次更新一次# f$ g7 `1 ]' |7 B. e$ W/ E
  2. TIM_InitStgructer.TIM_Prescaler=7199;//时钟分频,72MHz/(7199*2)
    ! h& H6 e5 z% d5 g" q9 B. a' C* }& }
  3. TIM_InitStgructer.TIM_CounterMode=TIM_CounterMode_Up;//上升计数,即从0开始记到9999+1=10000次时更新,从0再继续开始计数
    5 ]- N3 |! d2 h
  4. TIM_InitStgructer.TIM_ClockDivision=TIM_CKD_DIV1;//无影响% Z9 u( g$ l7 _7 l% y* F
  5. TIM_TimeBaseInit(TIM3,&TIM_InitStgructer);
复制代码

+ R& K  G, o; |3 R; u3 |$ ^3)清除中断标志
6 l- G! E) ~0 ]3 U
$ c* E6 g/ A% O+ `TIM_ClearFlag(TIM3, TIM_FLAG_Update);# `) v# g8 ?) v8 [% Y' `) L
4)允许更新中断( Z- ?5 J3 i' y$ r. j% J2 A
5 `! N" W& c/ J8 b* _; J
TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE);//允许更新中断
; Q, p4 f  Z# [! n  \( g. O5)设置中断优先级: ?- l& o0 O+ N6 ]0 Y  ~
6)定时器使能
, C2 j, n0 L3 s7 sTIM_Cmd(TIM3,ENABLE);, q0 P8 r, l. P8 W
7)编写中断处理函数并清除中断标志位
1 P1 T, q. S7 ]1 s+ S+ @

  1. * J- ]5 q0 X8 g7 [  U, P
  2. if(TIM_GetITStatus(TIM3,TIM_IT_Update)!=RESET)- M6 N* n) b1 @
  3. {
    5 ^5 ]( r( h3 {0 `& Y0 N
  4. TIM_ClearITPendingBit(TIM3,TIM_IT_Update);
    ' b. [6 `8 H2 S5 y
  5. PrintfUsart1("timer update!\r\n");! v, l5 z) F$ t7 v/ |" i
  6. }
复制代码
  I6 `% G7 c' W4 V. k$ O1 G

0 v; X/ c. F" Z; S; v6 A7 `# M! V5 V3 ]2 w
收藏 评论0 发布时间:2021-11-28 22:00

举报

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