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

【经验分享】STM32F2xx的定时器的应用

[复制链接]
STMCU小助手 发布时间:2021-12-1 22:35
定时器计数值的确定。
; Q$ U8 d6 U7 z: d6 G" k0 ~. }0 H- j& [+ t% G+ Y, @( s9 D
    TIMER的时钟不是直接来源于APB1或者APB2,而是来自经过APB1或者APB2一个倍频器后的时钟。当APBx的预分频数为1时,这个倍频器不起作用,此时定时器的时钟频率等于APBx的频率;当APBx倍频数为其他数值时(即预分频数位2,4,8,16时),这个倍频数起作用,定时器时钟为APBx的两倍。例如AHB=60MHz,APB1为AHB的2分频,即为30MHz,则挂载在APB1下的时钟的频率为60MHz(2倍频)。
, ^5 Y5 S) }+ g0 [& t. V+ V- C+ W9 S0 a

8 e  p# y+ T9 q8 C1 `9 @
! L' q/ F8 R* m% j9 w" p各个功能定时器的比较表。0 D; D0 N& z  n8 c. }: {

3 i: B% w4 \" ZTimer分布
. ~3 }# l" n; L* }% }8 c
4 H& `/ I6 Q. d0 J  V' I3 V
O5@B8VPHF(`$][M780(]81Y.png

" U6 d; _- `# s; c7 }
ZIZ8PI1]{VDP@0@UPD4WPXV.png

7 E9 \/ G9 Q6 v- _6 L
2R$QRD77UN__V$IHZ@)KXZM.png

/ W  ~6 K- S0 Z0 W5 z$ A8 d
3%3{(A52L[K}E`%({21]P_V.png
# z" r* i+ B& S) @' }
RPFBG2D6{X43}}H8W98$L.png
' z$ b/ P0 V- W- I5 I: @
)MDOR]U_Q2WEZPE9T`DZ_44.png
1 V+ V& I& U' x
1E$F%R6}KH${605$}IP_G96.png

* a; N9 u5 t8 x2 {3 G/ a
_6C_X(L0JO%KS$P)51`6_JR.png
+ ^2 h% }+ E* u0 i
5 }" K6 j% z4 x& l
( E6 H. o+ ]" H1 [# [6 R+ S; B
systemtick的时钟直接来源于AHB,而且是24位的定时时钟,一般常用在实时操作系统中。定时非常准确。以下是systemtick的配置函数,由专门的中断void SysTick_Handler(void)。
. w+ ?* p; o. _5 ]) ]
/ Y  R+ `8 p1 I0 H/**
- F8 D* n7 m  i1 q( B4 f5 @& N$ T7 {. V. N
  * @brief  SysTick时钟配置。
. `, s- x, G9 H8 [- k- l' Z" r3 ]3 C/ w( ^
  * @note   调用的是系统中的配置函数,将其函数名改掉而已,便于统一管理。& z1 B! q+ g- m* ^

; {6 a" R' ^, ?1 h  *               只需要在该配置中加入计数值即可实现任意时间的定时配置,包括1us。# m, a5 `" y7 U1 s

3 X7 G, p3 {& [8 k7 U! _  *             <h2><center>需要结合中断函数。
% W% M% Y0 l; v
! U, Y5 I+ G3 ~5 S1 c& W. y  *               void SysTick_Handler(void){···}</center></h2>; @2 ]  D: {: l4 u5 i+ ~
% n0 L6 k5 j) p7 X; @9 Q
  * @param  ticks   :     计数值。该计数值可通过以下公式求得:AHB_Clk*需要定时值,
0 Q6 [6 K& m/ c' o
! x% ?# g9 }( ]" r  *                                    例如需要定时1ms,且60MHz的AHB,则计数值 = 60MHz*1ms = 600000。     % z' v2 S. P3 D! B1 H5 R4 X

- e! t; s& w2 ^8 e: V5 E3 L  * @retval 返回配置是否成功标志。% j0 T0 j! k0 K/ Q) E: T# G. r

" ?" ^* k& `* `4 \8 k# y  */
, F8 b: ]6 I$ J  z) E+ D: X* ]( `& f  A& u
60MHz AHB1时钟systemtick定时中断。
. Y) ?6 n" z8 R' z
2 y  \$ A; ~& l
  1. uint32_t BSP_CLK_SysTick_Config(uint32_t ticks)! l# x, W/ R+ T" C! N

  2.   j6 y- U$ N8 D1 ~7 Y
  3. {2 T( J8 r+ k3 y5 f

  4.   b9 X2 E5 T9 G" V$ u2 X% E
  5.          if (ticks > SysTick_LOAD_RELOAD_Msk)  return (1);            /* Reload value impossible */
    4 W/ M, z# d4 X# j; ?$ G4 m2 M
  6. . H8 l7 g3 ]  m& _) V) Z. H: m2 b  t
  7. * N+ Q6 Y, M- {" N/ M

  8. 4 t# \7 e5 S8 M* t7 J
  9.          SysTick->LOAD  = (ticks & SysTick_LOAD_RELOAD_Msk) - 1;      /* set reload register */8 E. E: U; l& L; ^

  10. $ t! _- I( S) r; a/ m& J
  11.          NVIC_SetPriority (SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 1);  /* set Priority for Cortex-M0 System Interrupts */3 I7 x6 F  e# g* B$ r1 K
  12. , b0 N+ Y, R+ x
  13.          SysTick->VAL   = 0;                                          /* Load the SysTick Counter Value */
    3 f9 b/ a* q4 T1 O3 I, ]

  14. 1 D* a1 w0 t2 k3 N; {
  15.          SysTick->CTRL  = SysTick_CTRL_CLKSOURCE_Msk |
    7 k& b$ V! H/ p8 k

  16. 0 R2 H9 V0 r1 ?; @
  17.                                SysTick_CTRL_TICKINT_Msk   |0 U4 ?* Z2 z/ t% B" N, q+ d- v
  18. ' ]7 j" ?# U8 u
  19.                                SysTick_CTRL_ENABLE_Msk;                 /* Enable SysTick IRQ and SysTick Timer */; W) V+ X% R& x3 T! \6 I7 C5 T& X

  20. ' H- C" \4 U  l  s6 [
  21.   return (0);                                                    /* Function successful */2 ]9 N4 W& {% l: K. u
  22. . X9 D3 l- I7 r) e. T
  23. }) j$ H; ], n! {* O2 X2 K

  24. - _1 l  _6 d. n6 I" P# r% i
复制代码
# q. T) p: R3 q" z, ~/ T, ?
30MHz APB1时钟10us定时中断。
) Q" F* l/ o6 q  I* G0 ^+ ?, P! i4 N6 |
  1. void TIM_Configuration(void)
    # N& ]7 i9 p9 v/ ~3 [2 t) K+ E+ [

  2. + M0 q: _" V4 {7 k6 b
  3. {( v  T/ ^7 f) Z/ L) @, f' T. e% q
  4. ) }6 u3 k8 _7 L- ~& c/ ?
  5.          NVIC_InitTypeDef NVIC_InitStructure1;: I* R% T+ |+ A# R; }! s4 r

  6. ! ]$ L: P7 [/ o3 C% `
  7.          TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;2 k% Q/ G" u: I; F  l0 U9 H: P. O; E: c
  8. 3 R3 o6 g& A4 T$ z- O/ s
  9.          RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);1 j3 x) m+ s, k6 S

  10. 2 f0 g5 O4 L" i3 O. O' [
  11. 2 X7 y& b& r4 R0 V3 c
  12. + R' f+ V6 ?: Z0 ~- k- b! v
  13.          NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);# W3 y' B. s) T7 U0 r8 [* t- K

  14.   V* F% s' Z0 _" w+ X
  15.          NVIC_InitStructure1.NVIC_IRQChannel = TIM3_IRQn;$ I/ i# v% E( C. u2 |" `8 X

  16. - g, [1 y1 e, s4 \
  17.          NVIC_InitStructure1.NVIC_IRQChannelPreemptionPriority = 0;* t% _  Z  w8 I- n+ ^

  18. 3 a2 @3 g. ~6 I- R
  19.          NVIC_InitStructure1.NVIC_IRQChannelSubPriority = 1;) b: _: S0 T9 t8 H
  20. 7 F) m9 S7 d4 C3 ]+ \1 E) s( t' x
  21.          NVIC_InitStructure1.NVIC_IRQChannelCmd = ENABLE;
      @! G6 U$ ^/ V4 ~* n

  22. , M: t' V, F! f
  23.          NVIC_Init(&NVIC_InitStructure1);
    0 n+ ^# t  i- ?* \* i- Z8 m
  24. * \* \/ C5 \9 r; R* W& h) Z1 _$ d

  25. ( A) ~; m2 ]( t

  26. " v; Z+ G+ w5 b
  27.          TIM_DeInit(TIM3);
    - L4 b7 [0 Q0 C1 `! \, [% r
  28. 8 o% u8 V# T1 \" m" D4 g
  29.          TIM_TimeBaseStructure.TIM_Period = 599;
    1 v1 }0 M1 i- U, X2 F1 o6 T5 M

  30. ) e7 C9 Z/ K5 K: g: {3 q5 C' g+ n
  31.          TIM_TimeBaseStructure.TIM_Prescaler = 0;# b! ~1 o9 G  J
  32. , [, @; b+ G) U3 m' g
  33.          TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;% u- [  r- }6 o/ K" d
  34. : M% [" f% h5 O  f5 \
  35.          TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;, t* |+ o4 D7 S! Y4 i/ |( C3 L

  36. 8 l9 d2 ?2 `2 p; Q! @& L' q

  37. 6 K) T& E# K+ Q2 O1 Z
  38. ) s$ N3 e  Q9 V9 N6 x0 w* S0 y* Q
  39.          TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
    ; O  w* i7 X& I2 A9 A/ R4 D
  40. 2 a( s5 x! j1 N5 a, S/ W

  41. 4 M! ]7 B0 T2 J; ]  D
  42. 8 O+ y& c& h1 o. o
  43.          TIM_ClearFlag(TIM3, TIM_FLAG_Update);
    % w0 p2 b# v1 D. I

  44. " `( F/ b8 p% Z( L/ L
  45. ! R9 I3 z+ a2 B. W2 I& B/ h) z
  46. . U& O. q; S2 j  w; c
  47.          TIM_ITConfig(TIM3, TIM_IT_Update, ENABLE);8 R. ^9 j: T* \  b

  48. : Y+ k) x$ R$ T  y. c! D
  49. 9 Y2 Q4 `% P- F5 J; `* d7 ^
  50. , S# x0 R- C$ H9 r
  51.          TIM_Cmd(TIM3, ENABLE);
    ) \1 j' k- m, V& K& @
  52. # }5 s' N; |" W8 W7 u7 M2 \, B3 s
  53. }
复制代码

5 ~8 T5 D# p! B$ o  p  k
& ^  G, s7 o2 E! c; d5 E' J$ }30MHz APB1时钟1ms定时中断。1 [) {; V5 C4 o; V( b" Q

' M5 p$ s9 r& z- R4 l# v' l! |
  1. void TIM_Configuration(void)1 Q3 Y8 |  t) E. u5 O1 t

  2. ) ^, q9 t$ m6 {$ N- }
  3. {
    3 v- N/ [% ~$ E  n

  4. 6 {  a) G6 A# E! _7 m
  5.          NVIC_InitTypeDef NVIC_InitStructure1;
    3 i0 p9 [8 |% ?( S6 G. S1 _. q
  6. ; e# k, \: Q+ W0 u
  7.          TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
    # }9 X) Y; P2 V

  8. : e+ o7 ?' |4 ~2 A+ B, @
  9.          RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
    2 x4 V+ Q7 I9 t& R

  10.   m2 Y+ Z7 J7 D# d

  11. 5 U6 O( r! O5 @, X- O- M9 o

  12. ( g1 X* g5 {- a/ J! @- `6 O
  13.          NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);1 c# Y) H; K7 e9 ~
  14. + c! [( c, l# D4 N6 o- Z
  15.          NVIC_InitStructure1.NVIC_IRQChannel = TIM3_IRQn;
    : H6 @' e$ x# Z# m5 e. x
  16. . s' w$ Q4 n, |3 G6 \% G
  17.          NVIC_InitStructure1.NVIC_IRQChannelPreemptionPriority = 0;
    . Z' Y7 ?, Z# e4 Y0 t/ h) N& I
  18. 1 b& `6 Z+ F1 |! s' {# U, z- g4 ]' K
  19.          NVIC_InitStructure1.NVIC_IRQChannelSubPriority = 1;, [3 P* {- c$ U8 X; w7 X; B

  20. ! t7 M- m: D7 O# M% p
  21.          NVIC_InitStructure1.NVIC_IRQChannelCmd = ENABLE;! x. {4 T( y5 _
  22. - U* m/ B/ d2 k/ v* F
  23.          NVIC_Init(&NVIC_InitStructure1);
    ) @7 w% p1 y8 K" Q
  24. ; G# s7 m" a. d+ F! z
  25. $ g; s3 t$ g' Q
  26. " r0 ]1 q5 n0 f. x1 H" V8 ^) _
  27.          TIM_DeInit(TIM3);: R4 g* u- k/ f8 ^5 I3 t/ D2 t
  28. # E- O1 G, h) t% \' T' m
  29.          TIM_TimeBaseStructure.TIM_Period = (60000-1);
    2 X3 @# G+ [, t7 }: i

  30. ( ^# \; L0 Z+ K9 a
  31.          TIM_TimeBaseStructure.TIM_Prescaler = 0;
    ' t$ s+ e0 D) ?: P* S3 C
  32. % A1 ?( Z4 D- a; ]0 k/ m: D. X' Q
  33.          TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
    + C: r: \7 s! p3 {0 {

  34. 7 o  ^% d: e% z! [- i" k
  35.          TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
    # N1 u( p, d/ C: Z4 S! R+ K: `

  36. ) ^5 M5 o; o% R* F# E7 p) @
  37. + W# z' J4 b" |; m; v' ]8 Z4 H9 c

  38. & p5 N  m" ]* F% P; @* F. |
  39.          TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
    0 i* k4 M0 b6 I6 ?8 P* D: z  X0 d
  40. ; z. q7 O. Z- _" j' H4 `$ G1 Y
  41. * X) I* [) A# D5 m

  42. 6 N0 _$ p2 f, L, t* n% o8 D( F
  43.          TIM_ClearFlag(TIM3, TIM_FLAG_Update);
    8 \* W1 k1 i2 c% f# ^% i% p

  44. 2 T" m) R, a% L" I
  45. / k% o/ r# N6 d) t
  46. 0 R: A: g( o" H: n& X. X. R
  47.          TIM_ITConfig(TIM3, TIM_IT_Update, ENABLE);
    1 d. ~6 e- C% m3 E9 s* M; z9 ?
  48. 3 Y8 A# ~% o: v1 n. |2 p4 l$ T, S

  49. / ?/ r' B+ H/ `( w: j

  50. 2 A, h8 m6 g# `- q& s! c
  51.          TIM_Cmd(TIM3, ENABLE);3 V5 |- M2 g. p$ }4 M9 f

  52. 0 d7 a* @! J1 M* n' V: R8 S
  53. }0 R5 j2 B' Z6 g  F( B

  54. & ]0 _+ J, n! q) X
复制代码
$ h8 Q4 c* d: t7 [9 u  f, x% h6 l, U
赞 收藏 评论0 发布时间:2021-12-1 22:35

举报

0个回答

所属标签

相似技术帖

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