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

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

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

8 ~6 b% a) a: ?9 _) L
定时器的主要功能有如下几个大点:
7 g$ N/ M3 ?; s7 W) \! y
6 O; E, X, M, E! i
1.16 位向上、向下、向上 / 向下自动装载计数器。

4 U& r* c9 S! q8 q6 F+ A7 q
2.16 位可编程预分频器。
% X% H6 k. O/ r
3.4 个独立通道(输入捕获,输出比较,PWM 生成,单脉冲模式输出)。
& W1 r8 ?' Q6 {4 r3 W: a
4. 使用外部信号控制定时器和定时器互连的同步电路。
5 K; ?+ ~2 k) \; ?( s4 [
5. 如下事件发生时产生中断 /DMA(更新,触发事件,输入捕获,输出比较等)。
6 |* g5 u4 t. |1 m' O2 {
tips:高级定时器 1 和 8 还具有死区时间可编程的互补输出。

/ j" K) {8 g/ Z5 H
在学习定时器的时候,许多的底层问题,我们可以参考相应的参考手册,这里主要介绍定时器固件库函数的使用。
, U* a, t8 ^0 B' b: ~  g# T
1.TIM_DeInit 函数的功能是将外设 TIMx 寄存器重设为值,其中 x 可以为 2,3,4。

. ~; N) j+ \# M  H* [- f
TIM_DeInit(TIM2);
2 W* a0 u6 m6 ?& W' f
2.TIM_TimeBaseInit 函数的功能是根据 TIM_TimeBaseInitStruct 中指定的参数初始化 TIMx 的时间基数单位,TIMx 可以为 1,2,3,4,5,8.
TIM_TimeBaseInitTypeDef 定义在 stm32f10x_tim.h 中。

: x7 {) q7 p7 Q" R' h
typedef struct
5 ~8 D' t. }+ C+ U) N$ R
{

/ n& L1 ]% u7 `- {
u16 TIM_Period;// 用于设置在下一更新时间装入活动的自动重载寄存器周期的值,取值在 0x0000 到 0xFFFF 之间

) r3 D) [% L/ d" v5 p$ Y4 m. [
u16 TIM_Prescaler;// 用于设置用来作为 TIMx 时钟频率除数的预分频值,取值和上面一样。
; j4 E3 r, u7 C% v( l" }
u16 TIM_ClockDivision;用于设置时钟分割,可以为 TIM_CKD_DIV1/2/4
2 C! P/ [5 i* P
u16 TIM_CounterMode;// 用于选择计数器模式可以为 TIM_CounterMode_Up/Down/CenterAligenf1/2/3:向上 / 下,中央对其 1,2,3,。

# q; g6 a  X& t! o; U' c
u16 TIM_RepetitionCounter;// 用于设置周期计数器值,

1 ^) X. K8 Y& }) `) ~" I
}TIM_TimeBaseInitTypeDef;
% V" T" c' m& M0 O" D4 D; f3 g( j' r
例:配置定时器 2 向上技术模式,重载寄存器值为 0xFFFF,预分频值为 16.

( S$ \2 p! w. i/ j1 q: ~1 {- {
TIM_TimeBaseInitTypeDefTIM_TimeBaseStructure;

$ B$ ?( }  w5 \0 O
TIM_TimeBaseStructure.TIM_Period = 0xFFFF;

% D8 o8 o! I- d8 [
TIM_TimeBaseStructure.TIM_Prescaler = 0xF;
8 S1 H3 G. E9 D3 G* j+ {
TIM_TimeBaseStructure.TIM_ClockDevision = 0x00;

% c; J' ?. U7 t2 e3 [, S
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
4 y' C- e) G+ H1 d  `# M
TIM_TimeBaseInit(TIM2,&TIM_TimeBaseStructure);

. P8 ]6 D& {0 P2 c4 K
3.TIM_OC1Init 函数的功能是根据 TIM_OC1InitStruct 中指定的参数初始化 TIMx 通道 1.TIM_OC1InitTypeDef 定义在 stm32f10x_TIM.h 中。
3 Z7 }: @/ O+ x  {0 Z
typedef struct
6 F" b, b  m$ K* l
{
' b! Q$ e' b) I
u16 TIM_OCMode;// 用于选择定时器模式,TIM_OCMode_TIMling/Active/Inactive/Toggle/PWM1/PWM2.
) |5 W" M& Q# d7 E2 G6 }5 L2 K
u16 TIM_OutputState;// 用于选择输出比较状态。TIM_OutputState_Disable/Enable;

# l0 x$ e8 U2 X  c3 d
u16 TIM_OouputNState;// 用于选择互补输出选择模式 .TIM_OutNState_Disable/Enable;

' ~, ^( X9 \! p4 a2 |
u16 TIM_Pulse;// 设置待装入捕获比较寄存器的脉冲值,取值在 0x0000 到 0xFFFF 之间。
7 V. u- C, C) k
u16 TIM_OCPolarity;// 输出极性,TIM_OCPolarity_High/Low.
( X- M6 p6 _5 r: a
u16 TIM_OCNPolarity;// 互补输出机型。TIM_OCNPority_High/Low.

4 l9 w! L. L" P- S3 A9 ^
u16 TIM_OCIdleState;// 选择空间状态下的非工作状态。TIM_OCIdleState_Set/Reset

1 w: O+ }9 A( y2 V  t
u16 TIM_OCNIdleState;// 选择孔宪章台下的非工作状态。TIM_OCIdleState_Ste/Reset

- w& x% l; {4 a
}TIM_OCInitTypedef;

  y1 R: x  M# C; S: W& K
例:配置 TIM1 第一通道位 PWM1 模式。
( D' L+ {, y+ _" ]9 g
TIM_OCInitTypedef TIM_OCInitStructure;
5 G7 V1 `" X2 B: z: H. U
TIM_OCInitStructure.TIM_OCMode = OCMode_PWM1;

+ q% h7 z% {; @( M
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
7 T: R/ ^$ F( r+ H
TIM_OCInitStructure,TIM_OutputNState = TIM_OutputNState_Enable;
& D  M  M( \4 O( a# _% J! j
TIM_OCInitStructure.TIM_Pulse = 0x7FF;
% q1 K: ^+ u3 W7 }  P" j$ C
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;

% Q: B1 |6 u0 L1 t# q: x, l
TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_Low;
6 t+ w& `4 I, V- r7 Z8 v3 l
TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Set;

# y1 m: v* u) c% d5 J, u  a
TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCIdleState_Reset;
9 z; D( p. I9 w2 Q
TIM_OC1Init(TIM1,&TIM_OCInitStructure);
( \* u' O4 o0 O# S/ F6 |$ w0 m9 z
同 OC1 的配置,可以配置 OC2,OC3,OC4,所用到的参数都一样。函数为:TIM_OCxInit,x 可以去 2,3,4。
# t- x6 Q# O( ?6 `" F
7.TIM_ICInit 函数的功能是根据 TIM_ICInitStruct 中指定的参数初始化外设 TIMx,TIM_ICInitTypeDef 是定义在文件 stm32f10x_tim.h 中。

, n( M, ?) x: e( h" }- r1 M
typedef struct
: y; h9 {. P/ O7 h) s
{

9 S. ~. c9 U8 T6 a8 `
u16 TIM_Channel;// 用于选择通道;TIM_Channel_1/2/3/4.

* v$ I! \( j+ P
u16 TIM_ICPolarity;// 用于输出活动沿。TIM_ICPolarity_Rising/Falling.

3 u  w: y. P7 Y) g3 x. n7 }0 R% K" W
u16 TIM_ICSelection;// 用于选择输入。TIM_ICSelection_DirectTI/IndirectIT/TRC

) O( V* |( B' {( h- O0 @- l, }+ v
u16 TIM_ICPrescaler;// 用于设置输入捕获预期分频器。TIM_ICPSC_DIV1/2/3/4.
$ B# l% Z& L" b
u16 TIM_ICFilter;// 用于选择输出比较滤波器,参数取值在 0x0 到 0xF 之间。

! x- _7 O0 `% N( Y, z, {) i
}TIM_ICInitTypeDef;

& F; `6 ~" }0 q: Y! g8 ~
例:定义定时器 3 通道 1 为捕获输入模式。
7 C5 [; _, R# D* e* O  u
TIM_ICInitTypeDef TIM_ICInitStructure;
1 p1 u* t& ~$ a- k4 n1 _: t3 e
TIM_ICInitStructure.TIM_Channe = TIM_Channel_1;
7 k0 |+ ?4 O/ `" H1 t2 `5 [8 D9 r  N
TIM_ICInitStructure,TIM_ICPolarity = TIM_ICPolarity_Falling;

+ o4 h& q6 e' f6 C2 p; R
TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectIT;

7 z+ O9 t* p5 ~' ?' i
TIM_ICInitStructure.TIM_Prescaler = TIM_ICPSC_DIV2;

$ n: ^( V& H- J" q
TIM_ICInitStructure.TIM_ICFilter = 0x0;
+ M( I1 m( D1 q; }
TIM_ICInit(TIM3,&TIM_ICInitStructure);

, E1 D7 B3 t) a- }+ m- L/ F
8.TIM_BDTRConfig 函数的功能是设置刹车特性,死区时间,锁电平,OSSI,OSSR 和 AOE(自动输出使能)。

3 t6 Y+ P& N0 a: x9 y* J9 G
TIM_BDTRInitStruct structure 定义在文件 stm32f10x_tim.h 中。

9 @9 F" k  {5 k4 j
typedef struct

0 S  n5 k. T. b7 p0 y
{

  Y; B# V& m7 W
u16 TIM_OSSRState;// 用于设置在运行模式下的非工作状态选项。TIM_OSSRState_Enable/Disable

2 b8 c9 o% K. Y; d* |; u3 i3 G. \
u16 TIM_OSSIState;// 用于设置在运行状态下的肥工作状态选项。TIM_OSSIState_Enable/Disanle
4 C+ E" t5 K, i* g& x
u16 TIM_LOCKLevel;// 用于设置锁电平参数。TIM_LCOKLevel_OFF1/2/3.

  u2 {$ {( c4 h0 u! ^
u16 TIM_DeadTime;// 用于指定输出打开和关闭状态之间的延时。
0 g$ K. M6 K* y( B1 U3 T) l# x
u16 TIM_Break;// 使能或失能 TIM 刹车输入。TIM_Break_Enable/Disable.
% t4 ^/ h3 U9 A* a
u16 TIM_BreakPolarity;// 用于设置 TIM 刹车输入引脚极性,TIM_BreakPolarity_Low/High

  @, M: e8 {1 U# r' P: E
u16 TIM_AutomationOutput;// 用于使能或者失能自动输出功能。TIM_AutomationOutput_Enable/Disable。

5 H6 C) g: N1 v% w6 [+ o  Y) U, `
}TIM_BDTRInitTypeDef;
, G8 h3 |) E. @/ V9 h5 U
例:OSSROSSI 自动输出使能,刹车使能,配置死区,锁定电平。

2 u4 e1 O1 E, X6 x1 @" k
TIM_BDTRInitTypeDef TIM_BDTRInitStructure;
, C6 R( M1 D: e5 M+ _/ ^6 W
TIM_BDTRInitStructure.TIM_OSSRState = TIM_OSSRState_Enable;

- X, G$ M  o: n; }; k! g! U3 @* T1 X
TIM_BDTRInitStructure.TIM_OSSIState = TIM_OSSIState_Enable;
5 h3 [* N# B# ~$ M- _1 ]
TIM_BDTRInitStructure.TIM_LOCKLevel = TIM_LOCKLevel_1;
4 H  x; p) {# L3 |. H
TIM_BDTRInitStructure.TIM_Break = TIM_Break_Enable;
- [  M7 C5 d5 h, s8 U& J
TIM_BDTRInitStructure.TIM_DeadTime = 0x05;

! @0 L3 Z5 R+ z6 g  q
TIM_BDTRInitStructureTIM_BreakPolarity = TIM_BreakPolarity_Hgih;

0 J/ x- h5 f  p: V# x0 j; C
TIM_BDTRInitStructure.TIM_AutomationOutput = TIM_AutomationOputput_Enable;

. `" v* k+ \0 w+ ]. A
TIM_BDTRConfig(TIM1,&TIM_BDTRInitStructure);
- n5 ?4 S6 B% P) i* t4 D
9.TIM_Cmd 函数的功能是失能或者失能 TIMx;

" t  X4 n% r3 |( E' S
TIM_Cmd(TIM1,ENABLE);
- c" r6 S" ^9 D9 L1 j2 u* Z! Z
10.TIM_CtrlPWMOutput 函数的功能是失能或者使能 PWM 的主输出。

; o6 v. a2 E5 z9 H; E! a
TIM_CtrlPWMOutput(TIM8,ENABLE);
$ k, s+ W5 ?; }! t
11.TIM_ITConfig 函数的功能是失能或者使能 TIM 的主输出。其中输入参数 TIM_IT 可取 Update/CC1/2/3/4/COM/Trigger/BRK.
TIM_ITConfig(TIM5,TIM_IT_CC1);

$ p4 N0 s" u$ u3 f, X7 O
12.TIM_SelectInputTrigger 函数的功能是选 TIMx 输入触发源。其中 TIM_InputTriggerSource 可取 ITR0/1/2/3/TI1F_ED/TI1FP1/2/ETRF.

4 k4 c+ {) X: b4 e8 v7 }
void TIM_SelectInputTrigger(TIM1,TIM_TS_ITR3);
: `  P& f& W& y
13.TIM_EncoderInterfaceConfig 函数的功能是设置 TIMx 的编码界面,其中 TM_EncoderMode 可以为 TIM_EncoderMode_TI1/2/TI12
TIM_EncoderInterfaceConfig(TIM2,TIM_EncoderMode_TI1,TIM_ICPolarity_Rising,ICPolarity_Rising);
; T- Y, m" _- `4 x% j# y
14.TIM_ARRPreloadConfog 函数的功能是失能或者使能 TIMx 在 ARR 上的预装载寄存器

8 c1 k( \5 n% Y
TIM_ARRPrelaodConfig(TIM2,ENABLE);

8 Z9 _& ?' j$ b$ J1 L0 M
15.TIM_CCPreloadControl 函数的功能是设置或重置 TIM 捕获比较控制位。

9 k& V. W' R6 G9 s) V3 J
TIM_CCPreloadControl(TIM1,ENABLE);
  r# x& n3 x( O" {; i) s
16TIM_OC1PrelaodConfig 函数的功能是失能或者使能 TIMx 在 CCR1 上的预装载寄存器。

' F. Z* I0 ?2 M$ h' _8 N* ^: }
TIM_OC1PreloadConfig(TIM1,TIM_OCPreload_Enable);

+ i4 F! g+ q' r
同样的道理可以得到通道 2/3/4 的额使能或者失能问题。
+ X& O. t9 @' u8 E
20.TIM_SelectOutputTrigger 函数的功能是选择 TIMx 触发输出模式。其中参数 TIM_TRGSource 可取 Reset/Enable/Update/CO1/OC1/2/3/4ref
& I) `+ y, x9 [6 D
TIM_SelectOutputTrigger(TIM2,TIM_TRGOSource_Update);

# ?3 {$ `4 P8 f( C3 u! ]3 `. R  {
21.TIM_SelectSlaveMode 函数的功能是选择 TIMx 从模式。其中参数 TIM_SlaveMode 可取 Reset/Gated/Trigger/Externall
1 b" Z7 B7 m; m. i) q
TIM_SelectSlaveMode(TIM2,TIM_SlaveMode_Gated);
' `* \2 R4 V5 n; U# _& H
22.TIM_SelectMasterSlaveMode 函数的功能是选择 TIMx 从模式,参数 TIM_MasterSlaveMode 用于选择主 / 从模式,可取 ENABLE/DISABLE.
! h7 t& t* O2 Q6 L8 J9 r
TIM_SelectMasterSlaveMode(TIM2,TIM_MasterSlaveMode_ENABLE);

$ j% O8 O9 [" j" Z. ?, J. d( o+ g
23.TIM_SetCounter 函数的功能是选择 TIMx 从模式

6 o/ x; z7 d! }
u16 TIMCounter = 0xFFFF;
1 U8 M$ C# Y( r) J6 D
TIM_SetCounter(TIM2,TIMCounter);
8 U; r8 b0 l' f  N9 Z2 o8 F
24.TIM_SetAutoreload 函数的功能是设置 TIMx 自动重装载寄存器值。参数 Counter 为自动重装载寄存器值。
1 H, R2 j5 Q* z8 s6 r
25.TIM_GetCounter 函数的功能是获取 TIMx 计数器的值。
- g- u! Y9 Y: M, X2 V- \
u16 TIMCounter = TIM_GetCounter(TIM2);

9 i; t- g2 r8 d, ]8 a; F
26.TIM_GetPrescaler 函数的功能是获取 TIMx 预分频值。

$ a3 N% M  l8 k" r! q
27.TIM_GetFlag 函数的功能是检查指定的 TIM 标志位设置与否。 标志位可以是 Update/CC1/2/3/4/Trigger/CC1/2/3/4OF.
  ^# E: ]$ {2 Y* {# {
28.TIM_ClearFlag 函数的功能是检查指定的 TIM 标志位设置与否。

; O2 \. ~2 c' O: o
29.TIM_GetITStatus 函数的功能是检查指定的 TIM 中断发生与否。

0 o+ \' K' t( ~5 H, p6 P1 t" G6 K
30.TIM_ClearITPendingBit 函数的功能是清除 TIMx 的中断处理位。
; {, ?2 {: L/ ?, c$ w
TIM_ClearITPendingBit(TIM2,TIM_IT_CC1);
赞 收藏 评论0 发布时间:2020-2-28 13:50

举报

0个回答
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版