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

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

[复制链接]
STMCU小助手 发布时间:2021-12-1 22:35
定时器计数值的确定。
% L* ~6 r* D$ p; }' O$ I* l# B. m1 @( d* k! o1 T' G& I- Q
    TIMER的时钟不是直接来源于APB1或者APB2,而是来自经过APB1或者APB2一个倍频器后的时钟。当APBx的预分频数为1时,这个倍频器不起作用,此时定时器的时钟频率等于APBx的频率;当APBx倍频数为其他数值时(即预分频数位2,4,8,16时),这个倍频数起作用,定时器时钟为APBx的两倍。例如AHB=60MHz,APB1为AHB的2分频,即为30MHz,则挂载在APB1下的时钟的频率为60MHz(2倍频)。) G9 G8 z, v/ z) i. n. J
! C/ [7 t& c2 G$ Q
% Z+ I' Z& f) v8 s6 i4 ~. J1 t
! l/ _, G9 H4 K9 N6 T6 O4 l
各个功能定时器的比较表。
6 I2 @2 H! C% J3 X# l% y' W9 d
; D- D, s' W; c0 Z' WTimer分布6 i' p. t. G0 p* j, S2 m
' R4 T8 {9 e# p/ {7 v# c, \
O5@B8VPHF(`$][M780(]81Y.png

+ \* r7 ~" _) ~8 s
ZIZ8PI1]{VDP@0@UPD4WPXV.png

+ Y" R9 V- Z! I" R
2R$QRD77UN__V$IHZ@)KXZM.png
/ I1 w( \& ?# G) ?$ u* [
3%3{(A52L[K}E`%({21]P_V.png
6 u* @) [% P: |8 f: ~
RPFBG2D6{X43}}H8W98$L.png

) m. O; @& C- ?# G
)MDOR]U_Q2WEZPE9T`DZ_44.png

  x. m; N' P4 X, ~) _
1E$F%R6}KH${605$}IP_G96.png
# G- }8 U4 j$ s
_6C_X(L0JO%KS$P)51`6_JR.png
0 `9 L, J2 y9 h/ S4 m2 S, r. O
* ^( N; L7 g' Y
' o/ _5 |4 x6 Y
systemtick的时钟直接来源于AHB,而且是24位的定时时钟,一般常用在实时操作系统中。定时非常准确。以下是systemtick的配置函数,由专门的中断void SysTick_Handler(void)。/ O# B) I! V1 i! ~5 [

& ^3 e* P/ P: L1 X, n- `3 H/**
6 Q1 K+ e5 W- k% q8 C, e6 n: N) j# H4 s0 g8 Y# A7 l7 m+ W& B7 a
  * @brief  SysTick时钟配置。
  u* T5 Y& Y! v1 l' _6 Q$ r+ M9 N. W( z7 F) V
  * @note   调用的是系统中的配置函数,将其函数名改掉而已,便于统一管理。
0 y) P& y+ O. _7 Y( F
9 e4 M3 G3 O# M! \7 I: E" g  *               只需要在该配置中加入计数值即可实现任意时间的定时配置,包括1us。
/ ~1 z0 q6 L: X" t% ?  U- t1 s+ c
4 D* ^  x# N) s! S* w  *             <h2><center>需要结合中断函数。
- R# ]7 @4 r3 i& J5 ^* ?! m/ z1 g+ Z/ ^) |  }" p
  *               void SysTick_Handler(void){···}</center></h2>
% ^: ~2 A3 C, d2 v- A% b
0 `4 A! g; O' y; `  * @param  ticks   :     计数值。该计数值可通过以下公式求得:AHB_Clk*需要定时值,
2 y1 S/ f, U1 d8 f$ L& c' @! j# g+ V/ p5 }
  *                                    例如需要定时1ms,且60MHz的AHB,则计数值 = 60MHz*1ms = 600000。     
- f! c- G# U* W8 \4 q) M3 C3 ~
" v0 A7 n# s( `- s# V2 I  * @retval 返回配置是否成功标志。$ W4 L4 F7 o2 m' m
1 `2 c: q2 R1 Q- m7 W  t/ J
  */! T: D8 ^) Y/ A/ v- R$ A' l
# ]) P! E! u  U' s
60MHz AHB1时钟systemtick定时中断。% s$ V6 D5 b3 T" E3 R5 W! u2 A
  ], d% f( ]; l* [, U& F
  1. uint32_t BSP_CLK_SysTick_Config(uint32_t ticks)- q; ^# I6 P/ f& |( h/ ]
  2. 6 j0 O( J) P9 O2 Z
  3. {
    0 A! Q2 N; O- O) k" Q
  4. 9 N& V0 n  K0 \3 C* m& t1 V" q
  5.          if (ticks > SysTick_LOAD_RELOAD_Msk)  return (1);            /* Reload value impossible */
    3 H4 f- M& \# ]; U& |2 L

  6. $ `( B$ a7 q( `  p2 _

  7. / k' V- x; l6 E, ]. x0 f" g) k$ H

  8. " G" U0 I7 b" d3 U+ v+ i* U
  9.          SysTick->LOAD  = (ticks & SysTick_LOAD_RELOAD_Msk) - 1;      /* set reload register */& q- a# J' S3 Q2 r' z5 u, G( h; \
  10. ( @' Z" e* F" R& A' l' e
  11.          NVIC_SetPriority (SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 1);  /* set Priority for Cortex-M0 System Interrupts */) W3 g0 m6 w9 |* P% d8 @: d

  12. # M2 |. {4 D* Q% ~$ g
  13.          SysTick->VAL   = 0;                                          /* Load the SysTick Counter Value */: F# c# P9 j9 B5 c
  14. - k. a7 N8 j. m% |6 u, u
  15.          SysTick->CTRL  = SysTick_CTRL_CLKSOURCE_Msk |) i) x2 S' Q: n: T  x5 U1 Q: @
  16. 3 o; ~* k/ F2 Y2 @: [4 q
  17.                                SysTick_CTRL_TICKINT_Msk   |$ s3 U- z; ~9 b4 Q3 L

  18. 5 _5 S" T0 r$ N1 H- ^' J8 O  J& c8 {
  19.                                SysTick_CTRL_ENABLE_Msk;                 /* Enable SysTick IRQ and SysTick Timer */7 B7 c7 {/ H8 f+ f1 U% P4 E6 ~, y

  20. / p3 a& r7 n8 h" D
  21.   return (0);                                                    /* Function successful */
    3 g7 P; t: ~: D9 `  c
  22. # B3 I% U- @7 v
  23. }5 a- Z7 L* e5 n

  24. $ O- [+ n# _: d; u% }
复制代码
" N- }2 M! u! x# W% m
30MHz APB1时钟10us定时中断。
5 w; L* c, y: m0 O: H& f+ M4 `/ e) W  s% f) N
  1. void TIM_Configuration(void)
    / W, E, r5 X9 v; {

  2. 2 T) r1 V, ~8 p+ X
  3. {3 I9 i+ v' t. Z/ I) i7 b+ s

  4. 6 t+ S2 a8 B% f. r2 L* E
  5.          NVIC_InitTypeDef NVIC_InitStructure1;
    5 g6 p/ j# ~; N* {3 i
  6. 3 L" N0 m( O! f- e: M( s6 y
  7.          TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;, k; ?3 b1 T$ N9 ^
  8. / r9 G2 o, h* M3 c
  9.          RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);# y( i* M0 M& _6 Z0 p) Y6 u
  10. 0 m! Y; n* G/ P0 u% d

  11. 8 U; R8 P5 [! q' o

  12. 4 W3 x, |% {8 Y! D: V
  13.          NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);
    ( r: ]4 n. ^$ o% C/ g

  14. & _" S7 C$ U4 n& V4 v$ ]0 r& u) b
  15.          NVIC_InitStructure1.NVIC_IRQChannel = TIM3_IRQn;
    ! Z- _" P5 @! x6 O1 R& h) K

  16. % j; B' u* ~, E; W
  17.          NVIC_InitStructure1.NVIC_IRQChannelPreemptionPriority = 0;
    5 ]- i1 d7 F+ n% C. P- i

  18. ) O% ?6 l: X- Y  m  j/ k
  19.          NVIC_InitStructure1.NVIC_IRQChannelSubPriority = 1;
    $ d/ @) ]* Y$ B, G( l

  20. 7 n7 o9 i$ f5 x, n( q7 b- z, u
  21.          NVIC_InitStructure1.NVIC_IRQChannelCmd = ENABLE;) t2 X# r, E- J+ r8 y
  22. 0 [+ W: c  [) N3 C7 v$ J5 U
  23.          NVIC_Init(&NVIC_InitStructure1);
    ( u6 A" w) I+ n8 B
  24. 9 I; M# [" z0 [. M
  25. 9 O6 e. c4 ]6 D. M8 w. n3 R* e3 t: x
  26. ) D* u4 \  P0 [3 W
  27.          TIM_DeInit(TIM3);
    ; i) U: O6 M9 B8 ]4 c& V9 R
  28. 2 l% `9 \/ p" Z! [! F2 O
  29.          TIM_TimeBaseStructure.TIM_Period = 599;
    ; l6 `7 O9 q0 P; m

  30. 4 o1 F8 ~9 {* j" n2 y$ w
  31.          TIM_TimeBaseStructure.TIM_Prescaler = 0;
    / s; Y7 g  b& r8 b
  32. 1 D1 i/ M# m( E8 @8 H0 e0 u
  33.          TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
    - Z6 `+ f# p6 `

  34. * k- [  g2 V6 h4 v- f
  35.          TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
    * H  H* y. [3 }7 y# c% g; f

  36. # z" Y4 [6 I, O. V; m' ~6 q- X7 B

  37. + L: b& P0 o) y3 u! H8 W# {
  38. + @& q/ t3 U$ l' K; |, g
  39.          TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
    8 w' B4 L. M0 ~/ L* @2 o
  40. / O  M& h1 q6 b- A' s* `
  41. - C3 @1 {6 |) u) U

  42.   O3 j' n" R: M( N0 F" B* l, B2 G, ^
  43.          TIM_ClearFlag(TIM3, TIM_FLAG_Update);
    + m! D% D/ |& m' P6 l7 l% a
  44. 1 u! r  C& Y" f  J3 h

  45. $ L1 S& I, {! N2 ?, r

  46. 4 ?. t, q* v* m2 D& [# @+ u
  47.          TIM_ITConfig(TIM3, TIM_IT_Update, ENABLE);0 G8 B. |1 o9 y4 e
  48. 8 C% P8 `, z' `4 e5 K
  49. 8 q# ~8 Q; M* S5 w8 x  B* j
  50. & G6 E2 o8 K" h" ?" k" s" b
  51.          TIM_Cmd(TIM3, ENABLE);/ f2 z2 A1 m3 D0 n: a6 W. N
  52. : I- I. i% m/ z: k
  53. }
复制代码
7 V% I- w+ l5 q1 n) N% g' R
0 d- Q. s8 i) N. M- C/ ]
30MHz APB1时钟1ms定时中断。! I4 u; M; b  t; m6 {" }
1 }  D; n% N4 j1 }
  1. void TIM_Configuration(void)
    " e7 R) S" c# E

  2. 8 y  R& t  h0 Z) E2 o
  3. {
    5 p3 G1 y/ P6 w6 }1 J

  4. & G$ d- _2 j( m% X& M+ K- [- Y
  5.          NVIC_InitTypeDef NVIC_InitStructure1;2 w6 `8 b2 [! X2 I) N+ m0 _+ u- y

  6. $ I5 v) {4 Y9 |  L! ?! c1 V* Q1 L
  7.          TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;) G1 m/ e( T, c  v$ D
  8. ' E/ m  m; l" D8 J1 z! Z7 q' Q/ D3 f
  9.          RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
    0 W2 K! h" P, a1 |: l6 R9 C4 i5 c1 W

  10. - F% V- P' e. H; q, T0 U0 V

  11. 0 e* b5 F3 W( s3 p! T) Q

  12. ' X2 O5 Y7 f8 O8 u
  13.          NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);
    , x- _3 J$ h1 D
  14.   C- n  E+ b; o; }
  15.          NVIC_InitStructure1.NVIC_IRQChannel = TIM3_IRQn;
    5 `( K) ]4 ^% m; j( @; u0 J

  16. " u5 B0 Q7 ^7 O
  17.          NVIC_InitStructure1.NVIC_IRQChannelPreemptionPriority = 0;
    - }5 M6 e) \, h+ X

  18. 4 J/ y4 u0 v, d6 S( w
  19.          NVIC_InitStructure1.NVIC_IRQChannelSubPriority = 1;3 o$ U! S1 T: R+ S7 b) @

  20. % w- X; }2 x/ h- E. n: ^$ v" [
  21.          NVIC_InitStructure1.NVIC_IRQChannelCmd = ENABLE;1 T" j$ M# z' q2 T

  22. ' W; d1 L) ?  H2 f2 @  y1 A
  23.          NVIC_Init(&NVIC_InitStructure1);) e( t& Y* r# i( A: t$ Q3 J

  24. : a; u4 t8 B7 @0 x1 m* z1 l, e/ p5 I* _

  25. ( |) t' `+ T' g' H

  26. 0 E) S+ U# F2 }% H# k" l5 {) V
  27.          TIM_DeInit(TIM3);
    * y# t9 o$ }- R

  28. / D0 h$ }1 o+ U1 X  T
  29.          TIM_TimeBaseStructure.TIM_Period = (60000-1);. ^* E4 {# w5 X9 V

  30. 9 k4 {. a3 u& c
  31.          TIM_TimeBaseStructure.TIM_Prescaler = 0;
    4 `; F4 e# [0 M( t1 N' q! p

  32. + z7 I2 u$ u7 ~% q2 V
  33.          TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
    % ]9 ]" d3 l( l: \+ e

  34. ! t" s& O3 ~3 b( S, j/ z" ?
  35.          TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;, n% L' j7 y: \. B
  36. 0 m* W6 H+ a7 ]# M
  37. # |! {) ]( S2 ?4 Z" Y8 I
  38. & l% t: ]5 B8 k8 z9 I! ?
  39.          TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
    7 Y% b1 e; |1 k0 d5 p
  40. / `$ N5 g4 H% ^8 Z7 I4 d3 X

  41. $ Y8 G( `) j8 ^7 V! h1 n
  42. " U# c0 k6 W* \9 l; C
  43.          TIM_ClearFlag(TIM3, TIM_FLAG_Update);
    * @: |8 P- |0 |) d: K! V' S
  44. 2 T4 d" U; C. i" `$ z

  45. . [; `- a9 N- \" I; q) _
  46. 1 R' J- y9 F8 ]/ z! Y8 U
  47.          TIM_ITConfig(TIM3, TIM_IT_Update, ENABLE);% ^) v, [! V8 z2 O
  48.   a- k. y+ d6 S: |7 d' U; K

  49. $ ^1 c4 R6 p$ w% D
  50. . K- c7 [" x% n5 A" \
  51.          TIM_Cmd(TIM3, ENABLE);
    # j  C* b! o" F+ E" B: J
  52. * W' g. M( r* G* z3 `! I% J1 o
  53. }1 W& g) D! h' I. m' s' Q

  54. : w: y8 \. P/ v5 C2 d
复制代码
' Y  ]' k- C' j6 _) T# E
收藏 评论0 发布时间:2021-12-1 22:35

举报

0个回答
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版