STM32 定时器频率+ k, T5 A: u, F- n6 Q
. [& }) J" w& O i1 i% J+ w8 _
/ `4 L. `$ t. u+ f, x. t- Z: J7 g" ^ O
/ O' Q1 n8 ?" ~9 W
4 q6 b: U; g) @* a7 y- a& I+ Z9 M! K: z" q( P; x
定时时间 = 定时器频率 / 倍频 /装载周期
& M7 r H$ ~+ @& J+ E
/ Y8 z6 I2 C5 u( ?+ z6 B5 F
' x' V+ a+ R Z- htim1.Init.Prescaler = 72-1;; T& O% ^2 N: `4 x7 G
- htim1.Init.CounterMode = TIM_COUNTERMODE_UP;
$ E E, x! k4 _& C - htim1.Init.Period = 1*1000*1000;
5 i( G0 W, j4 ~) B. K* V
复制代码 * W: ^+ o' _1 J, A% e6 |& S8 a+ V0 Z, B* U
tim = 72x10^6 / (72-1)/ 110001000 = 1us
" I& @# v+ T9 B2 L1 q3 Z# ?! F2 W$ f3 b' n# e! m
% b' x# S( s- B+ {3 _2 [根据定时器时钟的频率,比如时钟的频率是72MHZ,可以理解为一秒钟STM32会自己数72M次,预分频系数就是将频率分割,比如分频系数是72,则该时钟的频率会变成72MHZ/72=1MHZ,但是在设置的时候要注意,数值应该是72-1。假定分频系数是72-1,那么频率变成1MHZ,也就意味着STM32在一秒钟会数1M次,即1us数一次。好了,接下来就是确定预装载值,比如需要定时1ms,由于1ms=1us*1000,那么预装载值就是1000-1;如此类推,在预分频系数确定的情况下,定时的时长就由预装载值确定了。至于要把值减一的原因,估计是计数是从0开始,所以要减一。
5 e# ]3 I: G$ V8 Z
5 M& o' B" O: U7 u, j6 ~, u ]' s例子
" a6 `/ K7 T( b5 Q! t0 m2 _- //对于71MHZ的频率,500ms中断一次,这两个参数设置如下:# n3 X* i% ^% W' k
- TIM_Prescaler=7199; //预分频值4 E. J( p0 R; Z, h
- TIM_Period=4999; //下一个更新事件装入活动的自动重装载寄存器周期的值
2 z* H4 k) x5 _3 H$ t# A. o - & P! Q1 {! ], H
- //分频7200,用72000000/7200=10000Hz; H2 W' p3 T; y
- //此时的周期就是1/10000=0.0001s
3 D3 O& o }9 S( ]& R - //500ms=0.0001s*5000次
$ t* ~0 b, D, q0 Q1 ]9 E9 @2 c - //5000-1=4999次
! ^! l0 o1 K, ~0 }/ V; x - //即通过4999次系统的运行,就是500ms+ z w# }/ O6 F7 x6 D, J7 D
复制代码 $ P9 x f7 J: ]$ Y7 A0 J6 X
公式
: x8 L1 Y- M( x对定时器周期公式的理解:
7 q! T1 F- C2 K: Q3 l- T=(arr+1)*(PSC+1)/Tck
0 @2 d4 `2 {. a; R+ }# M S# d$ @
复制代码 6 n$ ^; t8 A. z0 [& M/ ~& c6 M" A
其中TCK为时钟频率,PSC为时钟预分频系数,arr为自动重装载值。
2 b6 g. I. y0 x0 g- f=Tck/(psc+1)*(arr+1)
- X1 _. X4 ^* q4 ]1 x' s
复制代码
; j, }- v3 p, U/ ~- Z% ETck/(psc+1)即为时钟频率,1/f为机器周期,乘以(arr+1)即可得出定时器周期。
, h( m2 W1 _" R! E+ q$ \' F( U例子:TCK=72MHZ,psc=71.时钟周期=1us.(arr+1)值为多少,定时器周期就为多少毫秒。' N: U+ f, T$ d. J! R7 h/ m
————————————————
$ w0 f8 [5 u# U/ ]& C& N3 r) |版权声明:静思心远
' b3 S1 E3 X9 I/ l8 P0 w. O如有侵权请联系删除
7 { @" S* o5 y3 V3 T; a& q# J
! J( X& h& u+ ~' N6 W+ k
' }3 n$ ~& P' `, E9 x1 P, ^ |