1.定义
8 O( a/ S9 E: ?* y) t D9 s$ i7 i8 A& L& n ]( ~1 o8 D
设置等待时间,到达等待时间之后执行指定的硬件操作。: [" N, V R. z: J
% v& F) C: S' a: G1 N8 h9 f8 p2 U定时器最基本的功能就是定时,比如说定时发送串口数据,定时采集AD数据,也可以产生PWM方波等,定时器产生PWM控制电机状态是工业控制的普通。, B9 f9 E. b8 w
* _# Z% Q! v& Z- t6 k5 d3 s
2、STM32F4xx系列的芯片:2个高级控制定时器(TIM1和TIM8)、10个通用定时器(10TIM2-TIM5,TIM9-TIM14)、2个基本定时器(TIM6和TIM7)、2个看门狗定时器
+ Q% h2 @$ _0 O5 \6 c& D$ s! D9 f8 J$ e
具体可参考中文参考手册了解其特性及原理
% w% U, S# N+ H; g) O, u4 J% }' d6 {6 L6 p/ h8 f+ ~3 O
$ T; c! @# I& W! k
: U B! E& `% y. t2 s% n/ p' H! E* k
3、定时器计数模式:2 x4 k U% s" T8 n9 O; f1 P% a3 Y
0 v- ?+ H: K/ o N9 K5 Z0 F
通用定时器可以向上计数、向下计数、向上向下双向计数模式。
0 s' ~4 E$ |8 \6 V. E9 P/ N# F
( O7 v: v ^% J3 b①向上计数模式:计数器从0计数到自动加载值(TIMx_ARR),然后重新从0开始计数并且产生一个计数器溢出事件。
9 s2 \" U6 o5 H+ U8 Y% O
! h/ ~6 a0 b9 s②向下计数模式:计数器从自动装入的值(TIMx_ARR)开始向下计数到0,然后从自动装入的值重新开始,并产生一个计数器向下溢出事件。
1 g, i' q% [4 o6 a- B3 ?8 Z. }) U9 [" X
③中央对齐模式(向上/向下计数):计数器从0开始计数到自动装入的值-1,产生一个计数器溢出事件,然后向下计数到1并且产生一个计数器溢出事件;然后再从0开始重新计数。 j/ W: p& f0 C8 J. B4 }% l) Y2 |: m
/ h. }' q6 Z9 ]4 T# `" B如图:
. V0 k, d- s! o! A5 j% Y5 m
1 {: Z# E0 n4 k" P
) J5 z3 U1 B$ X- f) l: k
3 M- @; c, t+ _4、通用定时器工作原理:
( a0 b' |$ i0 M! l$ h# o# D3 O: ?: y! e) S2 h0 Z! U4 X/ u. I
● 计数器寄存器 (TIMx_CNT)
2 s/ C& u& w' O9 f. K% A: ]8 L' l, X( N. K$ r
● 预分频器寄存器 (TIMx_PSC)2 F& G5 @4 i) l$ X1 b) S8 c
+ _1 o, \& F. i2 {$ R
● 自动重载寄存器 (TIMx_ARR); P2 D3 U- K5 X# J( d! O
% }. h; q/ y9 m/ s$ { C2 h4 i; R假如是向上增长模式,计数器(CNT)从0加到自动重载值(ARR),预分频器(PSC)减一次。
' f @, F3 N5 y& T; [- L! G \0 @; B6 ?: {. O3 E, H
时间计算方式:
% o( K7 ] ^4 R" Y
7 N6 @8 n5 Q/ I" S; q( y. Q2 K假设频率为:42M*2 == 84M == 84000000 == 1s //42根据定时器时钟数可知 并且一般都是*2
* Z* d2 D. g7 m, \9 ^
# V- `' k4 T! x9 Z% D n' |4 `定时器定时1s产生中断:& H. M p5 ^; D% F0 Q+ O4 N
# ?. J. N" L- `% }: A iARR = 84000; // 1ms$ j, `" y; X% C
3 u% y$ A# p* S/ n$ K- T6 {
PSC = 1000; // 1000*1ms == 1s+ R9 |9 M! L/ ]( [( k# w& x. M; K
+ ]! l% N" ^; n* R6 g' e. f8 R- z
) y" l+ V% P, H如图:可知基本定时器的时钟是42M,那么对应*2就是84M=84000000=1S(ARR*PSC)
- [! n* H0 Q1 ?2 |: P) C
; q3 x5 b) a; n0 v3 f 高级的既是84*2=96M=96000000=1S
/ R( T+ K' ~ g4 ^6 _
+ N1 U- E, }7 A: Y
: D5 L" R$ V- }) T1 Q" I" S3 ?( r7 }) O' O1 b9 W7 G2 o
5、定时器中断实现步骤 5 X" Q4 I! ^* `- d* W
% o. f( h1 g6 T: j9 Z$ K! l
- //5.1、能定时器时钟。
2 V3 _$ W' v) {+ ~( z* n% P - RCC_APB1PeriphClockCmd();
* y9 H, E, V6 n P7 e" S( M
: E+ F+ k D& E3 n m) v) J$ E* e! n9 q- //5.2、初始化定时器,配置ARR,PSC。(申明结构体)
3 Z- L- G4 w6 N7 k& G2 i - TIM_TimeBaseInit();! {4 x) _; e$ O1 O8 i
6 i+ n: F4 c! N0 V8 X- typedef struct/ O8 t0 L }' q# ]4 j
- {
0 k+ I& e% |1 H+ R5 { - uint16_t TIM_Prescaler;, s4 q% Q, z4 s% R) {
- uint16_t TIM_CounterMode;# W/ L% r% Q* S) i8 Q3 d
- uint16_t TIM_Period;
% S" R4 x/ s/ `! w - uint16_t TIM_ClockDivision;
; I6 @7 _3 I( H - uint8_t TIM_RepetitionCounter;9 q( f$ S# }, W( G5 N% c* e% p/ Q4 l
- } TIM_TimeBaseInitTypeDef;
: A" t+ Z. n/ Y' o& C a6 v( O - 8 O; j9 W, L! l; x; c
8 F& l( M, f O0 [
( a$ B: ?, y. n3 s5 ~- //5.3、启定时器中断,配置NVIC(申明结构体)
8 A; \* G. Z% s - NVIC_Init();
2 A2 q/ w, g% H; B" A1 Q
. T9 W1 X1 y% P8 W( u. O2 K; [$ H- 进行NVIC中断配置
6 r# e- C+ T/ O! i - 3 |! l- h$ U7 w) @9 g/ m$ x+ V
- NVIC_InitStructure.NVIC_IRQChannel=TIM3_IRQn; //定时器 3 中断
/ Y* C' z$ ^! u& E - NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0x01; //抢占优先级 1% e8 k& v' R4 `# v! C9 p
- NVIC_InitStructure.NVIC_IRQChannelSubPriority=0x03; //响应优先级 3- j: @7 s- q E
- NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
: ]3 j2 ~, J7 i( j; y - NVIC_Init(&NVIC_InitStructure);// ④初始化 NVIC
; [" C7 D, f! f. ?1 M - TIM_Cmd(TIM3,ENABLE); //⑤使能定时器 3
( c. Y- Z, l. I8 X
" e" x2 w' x! x" Z* x- //5.4、设置 TIM3_DIER 允许更新中断
9 S! [: C8 z, T0 O" T8 b( H - TIM_ITConfig();/ y* x. a. q/ e3 F, S- B7 m
4 o" n1 V1 q+ t' Z& W: ^( P) }- //5.5、使能定时器。
3 R! m( M2 G2 ?7 q/ B - TIM_Cmd();5 u5 G9 y5 t: n$ [
( |7 H; M7 T9 |6 P" I- //5.6、编写中断服务函数。" s C# ~/ t" d
- TIMx_IRQHandler();
5 j" c2 O- J ]1 J - 8 S" F( f" l, S2 O
- //定时器 3 中断服务函数, Q; c6 R" _( S: k! ^4 x+ i
- void TIM3_IRQHandler(void); y& ^# ]/ d. r3 @ L _" x
- {
5 D, X4 X9 Z0 U& g4 Z/ |! @4 L# o - if(TIM_GetITStatus(TIM3,TIM_IT_Update)==SET) //溢出中断
! W) W$ E; I4 A - {
+ H# O6 \% S% \8 v - /*处理的程序段*/
* ~1 B4 y7 h" F# S - }
7 Q' B. D" K5 @4 W/ Q- `6 L - + Z) b/ g! ^, n7 ]0 C3 `$ A% k
- TIM_ClearITPendingBit(TIM3,TIM_IT_Update); //清除中断标志位6 G Y+ ^' |* a( x( ]: _
- }
复制代码- TIM3_Int_Init(5000-1,8400-1); //定时器时钟84M,分频系数8400,所以84M/8400=10Khz的计数频率,计数5000次为500ms
% ]1 u& }4 a' B( o- o$ W
* |/ _. @0 h0 m: m( o( U. M& C, n- void TIM3_Int_Init(u16 arr,u16 psc)
" `, s% i5 T* y1 V7 m g" K - {
7 j: ^, H0 V, H/ x. f: a; z - TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
9 k c& i3 H1 K# @) H. O' n& W - NVIC_InitTypeDef NVIC_InitStructure;
( J) F- G7 |" i( A* Y- U -
7 ]( i3 L8 \/ B4 W; G _ - RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE); ///使能TIM3时钟6 ~ | r# e9 M; ?
- 3 j0 v; {" w7 ^5 N; n: y" e$ L% }
- TIM_TimeBaseInitStructure.TIM_Period = arr; //自动重装载值
2 f( @6 a' f. T& F. S, q - TIM_TimeBaseInitStructure.TIM_Prescaler=psc; //定时器分频' C6 g" m8 l, o/ ~$ m, X
- TIM_TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up; //向上计数模式
: r# p% ^6 h+ p - TIM_TimeBaseInitStructure.TIM_ClockDivision=TIM_CKD_DIV1; 4 L( v! T# p6 v( G/ s/ }1 _
-
+ x! r! f g7 E7 d - TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitStructure);//初始化TIM3
" V) F& j, X' t2 I( Y - / I, D3 t. ?; |1 E
- TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE); //允许定时器3更新中断- j3 l) L) M- N7 R1 U
- TIM_Cmd(TIM3,ENABLE); //使能定时器3
$ e h9 d4 s, B0 u; Z7 r* J( u9 a& p -
4 B) e- s6 P& w6 q; _8 | - NVIC_InitStructure.NVIC_IRQChannel=TIM3_IRQn; //定时器3中断. b$ c7 J" o3 U3 k; Z/ A: O
- NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0x01; //抢占优先级1
6 y8 \7 z. M$ T/ V; m, g! K - NVIC_InitStructure.NVIC_IRQChannelSubPriority=0x03; //子优先级32 }6 E, @- G9 Z9 v( N+ J
- NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;: \/ ]2 b7 a2 F& d; q# h1 ^6 Q9 V
- NVIC_Init(&NVIC_InitStructure);5 t( ]4 b% t; P8 Y
-
' v7 ]* g$ t0 U5 {2 \) S. p - }# h; O1 h, t6 v# S0 v
0 J8 [& e2 W8 d! H2 B% d- //定时器3中断服务函数
& f' R% i. I( K# H - void TIM3_IRQHandler(void)2 p/ V5 X9 S; Z! v3 t6 q
- {# O7 L% U3 }- h0 z' ?
- if(TIM_GetITStatus(TIM3,TIM_IT_Update)==SET) //溢出中断! p2 f; I1 P( u: l5 l8 S$ k
- {6 f/ c* L- k- K) G, N% n1 ?! }
- LED1=!LED1;//DS1翻转
& r9 O% L3 q* m' z# `& g - }
2 D" Y: o4 w/ u9 u - TIM_ClearITPendingBit(TIM3,TIM_IT_Update); //清除中断标志位
' C0 e, ^8 \- b - }
复制代码
0 F2 }% z$ P* u9 [/ s% J% V1 |- m1 q8 X+ r. O4 j/ `' x0 w3 X
' x, k. h' ?$ x, J3 r' ^3 S
$ \* q3 u A" _, {5 E2 { |