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

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

[复制链接]
STMCU小助手 发布时间:2021-12-1 22:35
定时器计数值的确定。% P/ w# z7 m5 Z! a, b4 j

9 W; m$ ], K) k, x    TIMER的时钟不是直接来源于APB1或者APB2,而是来自经过APB1或者APB2一个倍频器后的时钟。当APBx的预分频数为1时,这个倍频器不起作用,此时定时器的时钟频率等于APBx的频率;当APBx倍频数为其他数值时(即预分频数位2,4,8,16时),这个倍频数起作用,定时器时钟为APBx的两倍。例如AHB=60MHz,APB1为AHB的2分频,即为30MHz,则挂载在APB1下的时钟的频率为60MHz(2倍频)。
0 K% Q6 |3 w/ s% X0 Q( q9 W/ p& G. \& G$ U1 d4 Q: i

/ @2 F" S$ e" g- u) |
: X7 d% d7 p/ c各个功能定时器的比较表。% S; K- e: w5 o2 M. c% i. z

/ O( M5 F% |' C9 |Timer分布
3 Q/ k0 v2 W/ s! W" Q/ N
5 a8 U9 ^5 ^7 ^$ F( V$ \4 h3 S
O5@B8VPHF(`$][M780(]81Y.png
& M2 \& m  s3 q) H! [: ]& F
ZIZ8PI1]{VDP@0@UPD4WPXV.png

' i- g7 y0 l7 ?( j6 L! l  {. T
2R$QRD77UN__V$IHZ@)KXZM.png

* ^9 d9 T) G0 w/ Z) Y! w
3%3{(A52L[K}E`%({21]P_V.png

" v4 |. S* M* j/ y/ x3 @
RPFBG2D6{X43}}H8W98$L.png
+ D) A+ V; v! d: V8 y9 U
)MDOR]U_Q2WEZPE9T`DZ_44.png
4 E( Q8 c8 A" ]/ N1 D
1E$F%R6}KH${605$}IP_G96.png
. ]4 B+ v* w% k& n' l" F( v8 ^3 F8 q
_6C_X(L0JO%KS$P)51`6_JR.png
) r& a& s+ \: Y2 K. Q; W$ B

5 G! o' `9 T) i& |% H, a$ @5 E
systemtick的时钟直接来源于AHB,而且是24位的定时时钟,一般常用在实时操作系统中。定时非常准确。以下是systemtick的配置函数,由专门的中断void SysTick_Handler(void)。
% ]( i% v& O6 Q8 E$ \; o7 b- r
: g1 [3 i" p! g2 c8 h: N2 W  J( n/**
0 Q' E# s8 {0 N4 P2 ]& d+ \
' ~+ M- L7 i" j' Y  * @brief  SysTick时钟配置。
) z  u9 s$ i2 E9 q# Q! q% h" I5 p
4 m6 @3 ~9 Y0 E  * @note   调用的是系统中的配置函数,将其函数名改掉而已,便于统一管理。0 F& b# {% o; F# U& d

$ |* R+ F$ @; A) }# c  *               只需要在该配置中加入计数值即可实现任意时间的定时配置,包括1us。+ S( R) a4 L3 }' @2 ~

" g. }. g) ?: b% b  *             <h2><center>需要结合中断函数。
* G: X# o# J2 U- g  p# C6 O: L1 N5 Q# @$ _5 T' Z. p
  *               void SysTick_Handler(void){···}</center></h2>, W4 d: _3 v1 o' u- |6 Z; l
6 @1 C+ G7 y5 Z6 {' W- w9 K
  * @param  ticks   :     计数值。该计数值可通过以下公式求得:AHB_Clk*需要定时值,
+ G9 n1 H* `! T
% y9 y' s0 l* @5 e  *                                    例如需要定时1ms,且60MHz的AHB,则计数值 = 60MHz*1ms = 600000。     
# N# b5 Q2 d4 ?% ~3 o1 k% ?3 b+ D. y3 \# ?
  * @retval 返回配置是否成功标志。
6 T8 ]! Y! m7 E* S: o
  C2 ?$ U3 Q' L, X6 ?) F  */. {! ]+ l" ]) I3 o& x  H6 i
0 y0 V; u" V2 y2 R: n
60MHz AHB1时钟systemtick定时中断。
" G6 \& y; {& ^. S) R: p" ]+ F7 s& J: i* H3 ]8 t$ u; X, G, [: F
  1. uint32_t BSP_CLK_SysTick_Config(uint32_t ticks)
    2 U; o1 ^" m- M/ l" \8 b! j6 X( I

  2. * d8 P# L! I- U. t  ?
  3. {
    2 @; q" q, Q4 R: Q5 I% q2 n" F0 n

  4. 7 x% I) q+ Q) p; L$ z
  5.          if (ticks > SysTick_LOAD_RELOAD_Msk)  return (1);            /* Reload value impossible */
    " |& {5 H  m) [( n

  6. 5 ^$ C( X1 ^' G+ Q& C5 K
  7. ! }5 l; ]) t  z- d

  8. / l: |: ?! n- |7 A5 {6 q4 Z0 h
  9.          SysTick->LOAD  = (ticks & SysTick_LOAD_RELOAD_Msk) - 1;      /* set reload register */& I2 B7 W0 j' Z3 g! c
  10. 2 L" U6 V% _3 l, X
  11.          NVIC_SetPriority (SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 1);  /* set Priority for Cortex-M0 System Interrupts */- m- J( ?# Y* _6 q; i) Z
  12. / T$ A$ m0 g4 @' }/ s
  13.          SysTick->VAL   = 0;                                          /* Load the SysTick Counter Value *// B8 @& I" k: ?* m6 o" @( s8 u

  14. : i, Y. r. x. r% r, J
  15.          SysTick->CTRL  = SysTick_CTRL_CLKSOURCE_Msk |$ o; \! O1 W5 ]; M; l$ \4 ~' m

  16. 8 b2 X5 }6 |/ E+ c* Q
  17.                                SysTick_CTRL_TICKINT_Msk   |2 Z( O" O6 `8 F
  18. 0 [; I) j+ l. Z% S# {5 ]& @
  19.                                SysTick_CTRL_ENABLE_Msk;                 /* Enable SysTick IRQ and SysTick Timer */
    . Q  H' h/ A" p4 z1 v, O0 {
  20. & }, r  {4 b: I
  21.   return (0);                                                    /* Function successful */
    + z9 \3 r  _" z3 X, t# E2 h

  22. 1 Z( x0 H! J) b9 ]5 ?8 E, `8 Y$ X
  23. }
    * h: z1 V: P0 {
  24. 8 R; I0 N) ~7 I2 L
复制代码

" U4 m- D" H  c8 G# b7 M' N# h. g6 g7 a30MHz APB1时钟10us定时中断。8 a6 a0 p! `4 p

2 |3 [+ Z% o$ G
  1. void TIM_Configuration(void)/ I% a. p5 E  P3 _3 e' V" p0 H

  2. $ f- o, H, o  s( x0 N% W
  3. {
    & m% W" y; W0 M) g3 ]1 w
  4.   {$ ^( ^* S9 }" Y2 G
  5.          NVIC_InitTypeDef NVIC_InitStructure1;; e7 e( r3 ?3 |4 G1 ~1 ~' ~/ g
  6. 9 b. u, |9 @! C2 t. W: q
  7.          TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;! A  z( P+ n. W1 C0 L3 p
  8. ! c4 y! l: v8 Q  |+ B2 ~0 d: m
  9.          RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
    8 `+ K# r2 F! ~, y' Q+ D1 `+ O5 j
  10. " }% v- Q2 `2 K( ^& y, {: l
  11. 8 `! ]9 S4 B' p
  12. 2 `! ~3 N6 m: b9 U" M
  13.          NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);" K: ~, Y% S) k, a% N+ y
  14. + E; M4 F$ y0 |
  15.          NVIC_InitStructure1.NVIC_IRQChannel = TIM3_IRQn;! D* A9 L3 j( b! F" c5 e2 F
  16. * F  P; a! H( Q! V0 h
  17.          NVIC_InitStructure1.NVIC_IRQChannelPreemptionPriority = 0;7 }" |8 K( J* L; n! |4 x
  18.   z6 D+ @% X$ x
  19.          NVIC_InitStructure1.NVIC_IRQChannelSubPriority = 1;
    ) h3 u, H) @& L7 M* l2 a
  20. / e# o: s1 b1 q
  21.          NVIC_InitStructure1.NVIC_IRQChannelCmd = ENABLE;
    4 ]: ^; L3 [; ~5 D. D4 d7 n+ {% G$ T

  22. % d. K, U7 O- ~4 x# F- e
  23.          NVIC_Init(&NVIC_InitStructure1);
    8 X+ q3 f) p% n7 |5 w- S
  24. . a' S9 k+ {5 M$ s+ r

  25. 8 r) q$ p6 F, l( ]; r

  26. 6 e( O6 n1 F8 n  c
  27.          TIM_DeInit(TIM3);" ^- i! C! f% f/ C

  28. 3 P3 Y! W- |+ w& w' ^  _0 v
  29.          TIM_TimeBaseStructure.TIM_Period = 599;
    ) N5 @  D4 H$ G

  30. ! B- a2 D8 T) n' r- Y, ]
  31.          TIM_TimeBaseStructure.TIM_Prescaler = 0;
    , m) j; U4 I8 }# J+ h

  32. ' x0 N- R- y2 u7 Z+ B$ B/ B
  33.          TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;6 ^  h" l# m) U" Y$ \5 t9 B' G
  34. 2 g- q- {* ~5 |
  35.          TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
    # z( K) ~4 p$ V) _+ K
  36. 6 f1 f2 m: N! d$ \& ^4 [( ^

  37. " n+ H. A% A# x) d& v
  38. $ P$ d# `; {, u2 [8 |" E
  39.          TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
    ' f( \* J' ~% \, r; |

  40. 1 E9 C1 x( p. I, ]3 u

  41. 4 `& ~9 l, L  y; r" J% i

  42. % ?1 ^4 p" S8 y/ @
  43.          TIM_ClearFlag(TIM3, TIM_FLAG_Update);7 l) `- \. A4 F6 o  N8 p

  44. ; s5 h: l# Z7 n$ `3 e5 s7 Y$ X" H
  45. ) t8 t# m, m5 A/ u
  46. 0 a# ]3 g# R, J& x
  47.          TIM_ITConfig(TIM3, TIM_IT_Update, ENABLE);0 s+ J8 ]) F- f% s5 x: y  T

  48. 6 N- x  E5 y$ ?, j
  49. " e/ M, |" i! e9 M; P
  50. ) f+ S% X6 J! t' u& H: b: T
  51.          TIM_Cmd(TIM3, ENABLE);
    & Z" C% L  q; ?* c# y
  52. , A2 M2 \# }; {; K( h8 P! ]2 {
  53. }
复制代码
" g$ U$ n2 P5 e. f8 z
# x0 Q! r- n+ e. p) `2 K
30MHz APB1时钟1ms定时中断。
& v" B" i$ J! g7 B3 L7 ~- |6 V# L! c# ]# {
  1. void TIM_Configuration(void)2 h: t7 W: a9 c& w, A; H
  2. 6 P0 z" r3 @+ x8 }5 c
  3. {# I# U) X+ B& Q  k8 N4 q9 p5 D
  4. 7 F5 a1 G) I5 X
  5.          NVIC_InitTypeDef NVIC_InitStructure1;
    ; e. h; Q3 r8 n7 I
  6. 7 b8 a# Y% M$ A! S! R
  7.          TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;3 k/ l) P: J8 K3 ?2 {
  8. / `. b/ Q, [3 F* j$ o- n  o
  9.          RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
    ( U3 d  l1 C2 |

  10. 4 [+ r0 p4 x- e* m+ [# R
  11. + o6 @: Z( C/ ^  Q
  12. , p* c! ^/ L& k/ j
  13.          NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);
    2 ?3 V5 \5 U, J; T2 ^' a
  14. 3 l6 P% M, U. T7 U8 s) P8 A' G& Q
  15.          NVIC_InitStructure1.NVIC_IRQChannel = TIM3_IRQn;
      O% F0 Z; `0 M8 E+ {+ k4 P
  16. 0 ?- E" X4 @+ c* O/ @- e3 ]! Z
  17.          NVIC_InitStructure1.NVIC_IRQChannelPreemptionPriority = 0;
    3 x, |/ u" Z; H5 I3 \( g$ A& B

  18. 2 ^. e; W0 y6 \
  19.          NVIC_InitStructure1.NVIC_IRQChannelSubPriority = 1;
    9 c  V- Z/ X9 e3 O6 J% b
  20. 2 W4 E' l: K5 \3 Z
  21.          NVIC_InitStructure1.NVIC_IRQChannelCmd = ENABLE;
    . O' U2 J3 g( E
  22. * P7 K- b6 E: S1 F7 C
  23.          NVIC_Init(&NVIC_InitStructure1);
    , X8 z9 `" {- O% c0 y; j2 y
  24. ! z+ j) D: ~6 X# T, m) f9 P: [3 k9 S

  25. 1 \" z6 l. Z0 s' p0 n
  26. % g7 K* Y2 v1 _2 v% B$ ?3 o
  27.          TIM_DeInit(TIM3);
    6 @9 e6 `; J# s- M; W8 `6 k
  28. / _* U; g- X3 p. e+ Q3 R9 W
  29.          TIM_TimeBaseStructure.TIM_Period = (60000-1);
    & g! Z5 _  @% C' {

  30. 6 S! K* t& L- B' v
  31.          TIM_TimeBaseStructure.TIM_Prescaler = 0;
    + }9 M6 S" o  Z( G8 n
  32. " N" H' G6 A) J7 J' ?! R
  33.          TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;3 l7 L/ o3 ~( E! T  B0 q7 C

  34.   Z; ^% C) ?5 f' O& ?; V# A
  35.          TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;8 H+ u# h! e* ^

  36. $ }6 @( S1 ~% m

  37. . G$ v' U: l% u3 g& ]& h

  38. 5 Y5 v; T6 R8 d  k) L
  39.          TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);: z8 `" h& C9 d  c% w! j

  40. 3 W  r. n9 o& ~  p
  41. * a0 r. z/ g# Y
  42. * T( o* S/ B! x  ]0 d; v
  43.          TIM_ClearFlag(TIM3, TIM_FLAG_Update);
    $ J' H- q4 U9 H- U9 g$ H$ M1 {
  44. $ E, W% }8 Q6 v3 x" g
  45. ' \5 l$ w" P( q

  46. 1 k& e% |/ N2 H7 @% }
  47.          TIM_ITConfig(TIM3, TIM_IT_Update, ENABLE);
    ) |; b+ Y( U# I# T8 w
  48. : R( e5 T& f$ T9 T
  49. , u6 w$ T* R7 ?
  50.   K4 y2 s. }, R( D" X+ j3 S
  51.          TIM_Cmd(TIM3, ENABLE);
    4 L7 ~2 F1 O! f3 i, V1 s3 V& I
  52. 2 K" v. }0 v( N# Z
  53. }: p  G& {% G9 x" k
  54. 2 F$ U7 C, s- ]6 n; }2 v5 w
复制代码
6 i9 U6 o2 x9 \$ I3 r
赞 收藏 评论0 发布时间:2021-12-1 22:35

举报

0个回答

所属标签

相似技术帖

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