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

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

资料篇| STM32 之定时器解析(附代码)

[复制链接]
eefishing 发布时间:2020-2-28 13:50
STM32 系列芯片拥有最少 3 个、最多 8 个 16 位的定时器,这是定时器通过可编程预分频器驱动的 16 位自动装载计数器构成。

- L. b! x% c0 j& I
定时器的主要功能有如下几个大点:

7 d% g  r2 p7 S6 D) d3 o  `* D
% q. U$ G/ T# Z- _2 I$ G7 R& S
1.16 位向上、向下、向上 / 向下自动装载计数器。

# v, z$ O# K6 k! R5 ?" Q- K* S# D1 W
2.16 位可编程预分频器。

, h# u# D: d. ]7 ?4 f! z: j
3.4 个独立通道(输入捕获,输出比较,PWM 生成,单脉冲模式输出)。
) z! p* F- h) {7 d9 T) |9 j
4. 使用外部信号控制定时器和定时器互连的同步电路。
$ F& j, @0 Z$ y
5. 如下事件发生时产生中断 /DMA(更新,触发事件,输入捕获,输出比较等)。
1 w& P2 y: e8 r8 c% k5 X% W
tips:高级定时器 1 和 8 还具有死区时间可编程的互补输出。
3 L# H6 H: Q: I2 x4 n! ]6 @
在学习定时器的时候,许多的底层问题,我们可以参考相应的参考手册,这里主要介绍定时器固件库函数的使用。

. Q( j$ ?3 i& @
1.TIM_DeInit 函数的功能是将外设 TIMx 寄存器重设为值,其中 x 可以为 2,3,4。
! E3 I' q! ~  Z" D( K
TIM_DeInit(TIM2);
7 }) F/ B4 {0 i" a
2.TIM_TimeBaseInit 函数的功能是根据 TIM_TimeBaseInitStruct 中指定的参数初始化 TIMx 的时间基数单位,TIMx 可以为 1,2,3,4,5,8.
TIM_TimeBaseInitTypeDef 定义在 stm32f10x_tim.h 中。
) u1 Q) q9 P0 i! s* s, W* w
typedef struct
3 W- H$ m, H& [2 y/ w" F! |
{

  C. N4 G) G& X% B+ `5 ?; K
u16 TIM_Period;// 用于设置在下一更新时间装入活动的自动重载寄存器周期的值,取值在 0x0000 到 0xFFFF 之间
+ m) [, D# H0 ~3 q$ d
u16 TIM_Prescaler;// 用于设置用来作为 TIMx 时钟频率除数的预分频值,取值和上面一样。
5 g3 Y: W+ }/ P! n; f
u16 TIM_ClockDivision;用于设置时钟分割,可以为 TIM_CKD_DIV1/2/4

, N; X* `3 x$ Z
u16 TIM_CounterMode;// 用于选择计数器模式可以为 TIM_CounterMode_Up/Down/CenterAligenf1/2/3:向上 / 下,中央对其 1,2,3,。

4 C/ b2 I5 F0 L* C: _) X: R* [3 n
u16 TIM_RepetitionCounter;// 用于设置周期计数器值,

( x, |& ^  i$ n4 s
}TIM_TimeBaseInitTypeDef;

) R  ]* w4 v1 O' X2 \
例:配置定时器 2 向上技术模式,重载寄存器值为 0xFFFF,预分频值为 16.
, v" t. D6 D4 w6 h4 b
TIM_TimeBaseInitTypeDefTIM_TimeBaseStructure;
, h* C, p! n7 J/ x
TIM_TimeBaseStructure.TIM_Period = 0xFFFF;

: K" z( l1 i7 r! H5 t
TIM_TimeBaseStructure.TIM_Prescaler = 0xF;

! @5 Y6 X  \/ E+ y! k; I, I
TIM_TimeBaseStructure.TIM_ClockDevision = 0x00;
/ i7 G# L- K* @1 n
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
% |% L- K. }  Z- E
TIM_TimeBaseInit(TIM2,&TIM_TimeBaseStructure);

6 F! D& ?; W1 L9 G
3.TIM_OC1Init 函数的功能是根据 TIM_OC1InitStruct 中指定的参数初始化 TIMx 通道 1.TIM_OC1InitTypeDef 定义在 stm32f10x_TIM.h 中。

( M) T" H# P+ W& F9 t
typedef struct

* G/ H; d# \. ?% H9 B1 W
{
+ P$ n6 P) A# n% [- t" a9 u
u16 TIM_OCMode;// 用于选择定时器模式,TIM_OCMode_TIMling/Active/Inactive/Toggle/PWM1/PWM2.
: k0 x9 m6 u7 C' R: m- x
u16 TIM_OutputState;// 用于选择输出比较状态。TIM_OutputState_Disable/Enable;
6 }0 ?3 Z* _( W! u
u16 TIM_OouputNState;// 用于选择互补输出选择模式 .TIM_OutNState_Disable/Enable;

: G7 Q" z$ D# v6 o# H' Z
u16 TIM_Pulse;// 设置待装入捕获比较寄存器的脉冲值,取值在 0x0000 到 0xFFFF 之间。
0 R! u8 w) t+ {& }- Z( P! R
u16 TIM_OCPolarity;// 输出极性,TIM_OCPolarity_High/Low.
" U( l2 W2 ?  P% t6 O- y! a2 e$ W
u16 TIM_OCNPolarity;// 互补输出机型。TIM_OCNPority_High/Low.
9 N+ F1 D4 I$ S1 E; x+ m; _; m1 ]
u16 TIM_OCIdleState;// 选择空间状态下的非工作状态。TIM_OCIdleState_Set/Reset
7 D0 X* U* \  H: H+ O
u16 TIM_OCNIdleState;// 选择孔宪章台下的非工作状态。TIM_OCIdleState_Ste/Reset
( U* m* d. k; {
}TIM_OCInitTypedef;
2 C- h/ X% I1 l8 h0 K
例:配置 TIM1 第一通道位 PWM1 模式。

) F! r- @* \2 G- I" E1 y9 D
TIM_OCInitTypedef TIM_OCInitStructure;

7 C  q3 Q' j1 a9 p3 Y
TIM_OCInitStructure.TIM_OCMode = OCMode_PWM1;
6 z- U& h/ H& _: G2 E
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;

/ _5 U" g9 s7 m2 C$ g; i! p
TIM_OCInitStructure,TIM_OutputNState = TIM_OutputNState_Enable;

) U* `5 d5 @( [8 @4 t# h: F' g2 B2 ]
TIM_OCInitStructure.TIM_Pulse = 0x7FF;

5 O- f9 Y* k& h, p3 O8 ~7 n
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;
1 X( h: ~. t5 E* S' q- J8 A
TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_Low;

3 F- [. L3 H( ]3 h% v  F  G
TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Set;
, {1 X. C$ S0 b
TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCIdleState_Reset;

  o6 @$ o7 L4 Q( a- \% A3 V/ `
TIM_OC1Init(TIM1,&TIM_OCInitStructure);

+ N- N0 r2 b9 z% k$ ?$ x9 a
同 OC1 的配置,可以配置 OC2,OC3,OC4,所用到的参数都一样。函数为:TIM_OCxInit,x 可以去 2,3,4。
! X, H9 h" L% n) `3 T
7.TIM_ICInit 函数的功能是根据 TIM_ICInitStruct 中指定的参数初始化外设 TIMx,TIM_ICInitTypeDef 是定义在文件 stm32f10x_tim.h 中。

6 A: z1 p& ?5 }! A, G0 w8 a6 [7 V
typedef struct

& j/ Z  r! o  T7 S
{
; q! p1 v  X8 g
u16 TIM_Channel;// 用于选择通道;TIM_Channel_1/2/3/4.
8 h7 w. z2 J1 a7 f$ }5 c2 d
u16 TIM_ICPolarity;// 用于输出活动沿。TIM_ICPolarity_Rising/Falling.
& R( [) n  m/ O( o
u16 TIM_ICSelection;// 用于选择输入。TIM_ICSelection_DirectTI/IndirectIT/TRC
4 b2 ~: S  X0 F3 t9 a
u16 TIM_ICPrescaler;// 用于设置输入捕获预期分频器。TIM_ICPSC_DIV1/2/3/4.
3 f  K$ a. j8 H& U% e0 W, M
u16 TIM_ICFilter;// 用于选择输出比较滤波器,参数取值在 0x0 到 0xF 之间。

4 d; I) ?9 {4 R  x
}TIM_ICInitTypeDef;

+ i( b$ g8 [' ?% g) i. ]
例:定义定时器 3 通道 1 为捕获输入模式。
5 f7 g$ _: q+ _
TIM_ICInitTypeDef TIM_ICInitStructure;

4 [# a7 s, c- d0 r1 T& y
TIM_ICInitStructure.TIM_Channe = TIM_Channel_1;
$ B) o" ]6 M2 w7 q7 M! n0 ~/ r
TIM_ICInitStructure,TIM_ICPolarity = TIM_ICPolarity_Falling;
2 |6 }8 A  x- r: m; B% A( }
TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectIT;
& M7 Z; w4 k: i/ D/ |5 f
TIM_ICInitStructure.TIM_Prescaler = TIM_ICPSC_DIV2;

* V9 t6 Z( C4 l
TIM_ICInitStructure.TIM_ICFilter = 0x0;
- I0 ^; m: u0 ~8 G6 f" ?5 D
TIM_ICInit(TIM3,&TIM_ICInitStructure);
( Y/ P. Q& t4 {/ r0 `& I! q5 f" x
8.TIM_BDTRConfig 函数的功能是设置刹车特性,死区时间,锁电平,OSSI,OSSR 和 AOE(自动输出使能)。
. S) ?. ^9 z% L5 X" _! c
TIM_BDTRInitStruct structure 定义在文件 stm32f10x_tim.h 中。
' B  F/ |3 m( s5 o5 ^
typedef struct

/ I, l- g7 l6 ?6 A1 I0 [! d- K
{
  _4 r( ^2 Z4 D1 k
u16 TIM_OSSRState;// 用于设置在运行模式下的非工作状态选项。TIM_OSSRState_Enable/Disable
* Y' b3 M/ x5 x# |
u16 TIM_OSSIState;// 用于设置在运行状态下的肥工作状态选项。TIM_OSSIState_Enable/Disanle

  Q4 x' ^1 r+ O% F) F! s& w
u16 TIM_LOCKLevel;// 用于设置锁电平参数。TIM_LCOKLevel_OFF1/2/3.

# r2 G; n4 P) ~0 R/ m0 G0 }  T6 [" K
u16 TIM_DeadTime;// 用于指定输出打开和关闭状态之间的延时。

9 |0 B' W5 H4 ~' p* k6 I+ |# _8 y
u16 TIM_Break;// 使能或失能 TIM 刹车输入。TIM_Break_Enable/Disable.

/ v$ |8 E& n4 v5 H1 J: z' Q/ k0 @& O+ y
u16 TIM_BreakPolarity;// 用于设置 TIM 刹车输入引脚极性,TIM_BreakPolarity_Low/High
/ V1 a+ s2 N9 A, H, D
u16 TIM_AutomationOutput;// 用于使能或者失能自动输出功能。TIM_AutomationOutput_Enable/Disable。
* `, b4 S4 Z. i, E5 L$ U
}TIM_BDTRInitTypeDef;
4 D- _: p' {0 }2 w) Q
例:OSSROSSI 自动输出使能,刹车使能,配置死区,锁定电平。
/ B& @" e9 Y6 B( H' _
TIM_BDTRInitTypeDef TIM_BDTRInitStructure;

  W1 X, I6 p( h
TIM_BDTRInitStructure.TIM_OSSRState = TIM_OSSRState_Enable;
2 u( D9 Z* H4 \& a$ S, }7 z
TIM_BDTRInitStructure.TIM_OSSIState = TIM_OSSIState_Enable;
5 ?8 \+ u. G6 N2 u- \: j
TIM_BDTRInitStructure.TIM_LOCKLevel = TIM_LOCKLevel_1;

- h# K9 Z/ C; b; x2 T* G# q
TIM_BDTRInitStructure.TIM_Break = TIM_Break_Enable;

. Q( D. h" B; X  I- B
TIM_BDTRInitStructure.TIM_DeadTime = 0x05;
  j! x9 k! \" e2 n* }
TIM_BDTRInitStructureTIM_BreakPolarity = TIM_BreakPolarity_Hgih;
$ q0 }# F" ^9 |: R. J$ P
TIM_BDTRInitStructure.TIM_AutomationOutput = TIM_AutomationOputput_Enable;
; w7 \  {, U! v; a- y  p- h' V8 P& U
TIM_BDTRConfig(TIM1,&TIM_BDTRInitStructure);

  @4 N) L# s, `# ]3 X
9.TIM_Cmd 函数的功能是失能或者失能 TIMx;

; p) M8 [7 f; Y. l: F7 P5 S" |+ i
TIM_Cmd(TIM1,ENABLE);
% Y% d+ ~; ]6 w8 K% {6 Y" D
10.TIM_CtrlPWMOutput 函数的功能是失能或者使能 PWM 的主输出。
! z% A" v3 j5 r/ G8 R4 s" B
TIM_CtrlPWMOutput(TIM8,ENABLE);

* _* y9 [  M/ |+ ~2 c
11.TIM_ITConfig 函数的功能是失能或者使能 TIM 的主输出。其中输入参数 TIM_IT 可取 Update/CC1/2/3/4/COM/Trigger/BRK.
TIM_ITConfig(TIM5,TIM_IT_CC1);
0 R5 T  i- R3 P9 ?
12.TIM_SelectInputTrigger 函数的功能是选 TIMx 输入触发源。其中 TIM_InputTriggerSource 可取 ITR0/1/2/3/TI1F_ED/TI1FP1/2/ETRF.

( v" a2 `8 G& t( K
void TIM_SelectInputTrigger(TIM1,TIM_TS_ITR3);
# \, G6 Y# H7 ~1 V4 V8 d
13.TIM_EncoderInterfaceConfig 函数的功能是设置 TIMx 的编码界面,其中 TM_EncoderMode 可以为 TIM_EncoderMode_TI1/2/TI12
TIM_EncoderInterfaceConfig(TIM2,TIM_EncoderMode_TI1,TIM_ICPolarity_Rising,ICPolarity_Rising);
9 ~5 i! P4 ]5 T
14.TIM_ARRPreloadConfog 函数的功能是失能或者使能 TIMx 在 ARR 上的预装载寄存器
$ w# X9 M, L% m; U6 g+ E8 m
TIM_ARRPrelaodConfig(TIM2,ENABLE);

0 _9 q+ E$ j7 Z5 u. T. v
15.TIM_CCPreloadControl 函数的功能是设置或重置 TIM 捕获比较控制位。

% Z- _' F% k. F  t. J
TIM_CCPreloadControl(TIM1,ENABLE);

& P) ^$ {; k. W+ b( @" G* G
16TIM_OC1PrelaodConfig 函数的功能是失能或者使能 TIMx 在 CCR1 上的预装载寄存器。

) v  n2 i) U$ Q$ h4 U1 [
TIM_OC1PreloadConfig(TIM1,TIM_OCPreload_Enable);
5 f4 F! o* `& j
同样的道理可以得到通道 2/3/4 的额使能或者失能问题。
3 ]; o% l8 n1 }
20.TIM_SelectOutputTrigger 函数的功能是选择 TIMx 触发输出模式。其中参数 TIM_TRGSource 可取 Reset/Enable/Update/CO1/OC1/2/3/4ref

- n8 ~1 b+ K2 |! Q
TIM_SelectOutputTrigger(TIM2,TIM_TRGOSource_Update);

: ~( `* `/ d, x# [
21.TIM_SelectSlaveMode 函数的功能是选择 TIMx 从模式。其中参数 TIM_SlaveMode 可取 Reset/Gated/Trigger/Externall

4 e* C- D& l) Q+ _  B
TIM_SelectSlaveMode(TIM2,TIM_SlaveMode_Gated);

' d9 O- ]5 U- D1 k/ B3 e/ Q
22.TIM_SelectMasterSlaveMode 函数的功能是选择 TIMx 从模式,参数 TIM_MasterSlaveMode 用于选择主 / 从模式,可取 ENABLE/DISABLE.
+ W, B+ @) k+ f) c
TIM_SelectMasterSlaveMode(TIM2,TIM_MasterSlaveMode_ENABLE);

$ F5 {+ X% F) Z0 ~2 @1 @# C
23.TIM_SetCounter 函数的功能是选择 TIMx 从模式
' \5 N! B) b8 d. ?) o  U
u16 TIMCounter = 0xFFFF;
9 y& j7 G$ g" c' ]/ C# f6 V$ e3 X
TIM_SetCounter(TIM2,TIMCounter);

' r/ }, R; d9 S/ B7 A/ ]( ~
24.TIM_SetAutoreload 函数的功能是设置 TIMx 自动重装载寄存器值。参数 Counter 为自动重装载寄存器值。
: h/ p& F5 i- U2 i* b2 t
25.TIM_GetCounter 函数的功能是获取 TIMx 计数器的值。
7 j% m  M; z$ G6 S2 V' v0 H
u16 TIMCounter = TIM_GetCounter(TIM2);
, a7 c5 V. i; @& M! K
26.TIM_GetPrescaler 函数的功能是获取 TIMx 预分频值。
6 h" l5 S! ?! s4 i$ y' h/ l5 W
27.TIM_GetFlag 函数的功能是检查指定的 TIM 标志位设置与否。 标志位可以是 Update/CC1/2/3/4/Trigger/CC1/2/3/4OF.
$ o4 j0 N2 S/ p$ h, y
28.TIM_ClearFlag 函数的功能是检查指定的 TIM 标志位设置与否。
% [8 d+ m3 W7 K. J) D
29.TIM_GetITStatus 函数的功能是检查指定的 TIM 中断发生与否。

, U3 [! x7 A' H9 L
30.TIM_ClearITPendingBit 函数的功能是清除 TIMx 的中断处理位。

4 ?- O. z* c( k: E5 N
TIM_ClearITPendingBit(TIM2,TIM_IT_CC1);
收藏 评论0 发布时间:2020-2-28 13:50

举报

0个回答

所属标签

相似分享

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