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

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

[复制链接]
STMCU小助手 发布时间:2021-12-1 22:35
定时器计数值的确定。
; h8 U; V# d! ~/ x! k4 q$ N
+ D6 q7 q# P0 ^( ^3 A2 o    TIMER的时钟不是直接来源于APB1或者APB2,而是来自经过APB1或者APB2一个倍频器后的时钟。当APBx的预分频数为1时,这个倍频器不起作用,此时定时器的时钟频率等于APBx的频率;当APBx倍频数为其他数值时(即预分频数位2,4,8,16时),这个倍频数起作用,定时器时钟为APBx的两倍。例如AHB=60MHz,APB1为AHB的2分频,即为30MHz,则挂载在APB1下的时钟的频率为60MHz(2倍频)。/ p1 R" a* e1 a% X* {

2 C3 t7 K  T% Y6 h/ v: H1 ]$ a5 t
) l( N# z! i  Y8 ^7 R9 d$ ~
7 i! {4 \: Q2 m各个功能定时器的比较表。
# G# }. ~; @& ?3 h' K  t, c1 O" _7 y* K% a, T
Timer分布
2 k" r4 |7 Z, P2 o# Z7 D
% @& ~, Q; o# x- z. U& x/ N
O5@B8VPHF(`$][M780(]81Y.png
  x( v8 ?2 x  {6 g1 N
ZIZ8PI1]{VDP@0@UPD4WPXV.png
3 d: y3 s0 X: [' {* X" l, [
2R$QRD77UN__V$IHZ@)KXZM.png
# P1 _3 y4 \$ M2 ^- n8 O7 Z* S
3%3{(A52L[K}E`%({21]P_V.png
  s8 V# I% N- Y9 Q: C1 i
RPFBG2D6{X43}}H8W98$L.png

; Z+ t  @- n3 s) @* B
)MDOR]U_Q2WEZPE9T`DZ_44.png
5 g0 h# y3 b, v
1E$F%R6}KH${605$}IP_G96.png
( w- {7 _" z0 d  s, G! l# B4 ~+ s
_6C_X(L0JO%KS$P)51`6_JR.png

3 R" X# ^3 k7 ?, A+ S/ I8 ^- [% H
3 G3 R: N# a5 R4 f
systemtick的时钟直接来源于AHB,而且是24位的定时时钟,一般常用在实时操作系统中。定时非常准确。以下是systemtick的配置函数,由专门的中断void SysTick_Handler(void)。
. A5 |$ z  W& r: m$ G, Z) [7 U) R( ?
/**, d' o7 _5 s5 k3 s, {$ ~6 L' J3 S
5 E% E3 \5 Y' ?# c+ k7 S9 u. D
  * @brief  SysTick时钟配置。
$ T% m- L, H- b! K" l' y, `. X/ ~6 s& ?1 f0 O; m) A
  * @note   调用的是系统中的配置函数,将其函数名改掉而已,便于统一管理。$ z2 l5 {7 I% G- A

' _- W5 N% n: ?3 _% Q+ x  *               只需要在该配置中加入计数值即可实现任意时间的定时配置,包括1us。
( U- h; W$ f8 d0 h3 S) n. I. G2 i5 S' T+ ^- E  [8 Y- d+ B. w
  *             <h2><center>需要结合中断函数。7 `  T6 c0 r$ N* P  W5 ]( l$ T

6 X7 a. b; {7 J9 ^4 d  *               void SysTick_Handler(void){···}</center></h2>
3 F/ n) ?% f- ~' s9 N6 Y% x7 N2 Q, P- `3 s( p' n& @
  * @param  ticks   :     计数值。该计数值可通过以下公式求得:AHB_Clk*需要定时值,1 V0 ]1 n* t( `& O

0 S: K& F3 U" l" g4 d/ A  *                                    例如需要定时1ms,且60MHz的AHB,则计数值 = 60MHz*1ms = 600000。     
) i8 D3 _4 S" N  Y
4 v3 D" S% w) Y# w  * @retval 返回配置是否成功标志。
% e) q& C& [0 I5 K
9 x( }. b- T* w& {8 R: [  */! J8 K3 K% K2 l: K
, u- K& ]' l, J5 H$ }  g
60MHz AHB1时钟systemtick定时中断。5 s. z  u8 y  v6 B' a& i8 e; A5 {- m) C' v
& S, Q, P+ h8 ~
  1. uint32_t BSP_CLK_SysTick_Config(uint32_t ticks)
    " p4 v# d/ ~. `4 f  G' A# }
  2. 4 j' I3 @& y: H$ p3 B  X; w
  3. {9 d* s9 F1 q( c. L" A# m
  4. % E4 t- x3 F4 u7 h
  5.          if (ticks > SysTick_LOAD_RELOAD_Msk)  return (1);            /* Reload value impossible */7 o5 w# `- C" ^( m8 L& G
  6. . d6 j- o8 Q8 ]$ o2 |) n. N4 f
  7. ( z' \4 X( l2 F
  8. ! W6 B) s1 o9 X; j+ Y: y$ {. B
  9.          SysTick->LOAD  = (ticks & SysTick_LOAD_RELOAD_Msk) - 1;      /* set reload register */! q; t- q$ _' X" u# ]! Q: e

  10. 5 l* v* ~! u9 l) T
  11.          NVIC_SetPriority (SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 1);  /* set Priority for Cortex-M0 System Interrupts */
    % o1 K2 h0 T- b' w6 B# a

  12. . J$ \5 H9 Z& {# [( R0 G7 a
  13.          SysTick->VAL   = 0;                                          /* Load the SysTick Counter Value */
    6 q  W0 ~. u) m$ x2 a
  14. 1 r6 g3 h; \4 f8 f- d
  15.          SysTick->CTRL  = SysTick_CTRL_CLKSOURCE_Msk |) n9 g+ J! d- C% a6 F0 e3 g& w
  16. % t9 b$ A3 J' \3 k; y2 F; ?
  17.                                SysTick_CTRL_TICKINT_Msk   |
      {( E3 v! I5 h2 |

  18. 6 _7 O, a4 H* v2 n  i8 c
  19.                                SysTick_CTRL_ENABLE_Msk;                 /* Enable SysTick IRQ and SysTick Timer */9 X, Y2 V$ [# G

  20. 7 S* e: R  j* Q* \
  21.   return (0);                                                    /* Function successful */
    ' {3 S1 F0 C. S& N% p9 p

  22. , ~4 |; i) m- H) N$ q
  23. }0 w% T9 e% m4 ~

  24. ) |- @0 l4 x3 p5 u8 I4 s1 S% T
复制代码
. a) B. J) ?, e  x/ J
30MHz APB1时钟10us定时中断。8 u5 L1 i1 w$ w' ^" R% z. F
3 W0 ?' _$ c8 [- X* f2 a% n
  1. void TIM_Configuration(void)5 F# T' }* x5 E# }$ `2 S

  2. 1 F7 @# O+ c( U8 W. L* J
  3. {+ t, A- R2 `* i! t

  4. + ?* m! @$ [9 ]% x3 p0 b/ j; C
  5.          NVIC_InitTypeDef NVIC_InitStructure1;
    % j/ L+ m$ T# K) Q

  6. 1 R1 O! o5 P5 T, H. u
  7.          TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
    ; d  u7 q8 y* M8 a! h

  8. 7 Y5 @. A: [* O  x! W8 \
  9.          RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);- w% x0 _8 o: `- p8 f! s7 \5 W
  10. * `  L  ?& V3 {0 b; A/ ?' }3 V% }' v

  11. # g5 M( x0 X) y! a: h3 D" l
  12. ; T0 b; w2 G7 p* t. m, {% Y
  13.          NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);. c* [: w- W* ]( d1 o
  14. 4 F  ^! H7 |( ?
  15.          NVIC_InitStructure1.NVIC_IRQChannel = TIM3_IRQn;' d( h3 l: I2 A! l$ @/ x

  16. 4 M9 ]; p( j$ @  C8 Y) w
  17.          NVIC_InitStructure1.NVIC_IRQChannelPreemptionPriority = 0;0 O* ~! Q2 r* h5 L& g/ E) p
  18. ' b' q1 _/ _$ m) H
  19.          NVIC_InitStructure1.NVIC_IRQChannelSubPriority = 1;
      b$ l7 g0 C2 l2 L
  20. 4 Y( |4 l; r" Z2 b- L2 B3 _3 l4 }6 [6 k
  21.          NVIC_InitStructure1.NVIC_IRQChannelCmd = ENABLE;3 r# x* D$ l8 h
  22. 6 q1 Z1 Y0 u8 E" @9 o
  23.          NVIC_Init(&NVIC_InitStructure1);9 u8 q$ }9 d) H+ [

  24. : B7 R% s% Y8 O) g9 Z8 N8 W2 w* p
  25. 3 c( x5 n1 o, c7 x- j
  26. 8 |4 Y/ f4 l( j7 }$ t
  27.          TIM_DeInit(TIM3);$ @1 A4 t% V8 s1 q4 M9 c

  28. " q+ }3 Q: E" k2 }  N
  29.          TIM_TimeBaseStructure.TIM_Period = 599;
    1 L4 A1 _/ R- ~  J, [0 ~
  30. 6 k9 a* v1 B: H5 y, ?1 _. b
  31.          TIM_TimeBaseStructure.TIM_Prescaler = 0;
    / ~$ w7 N# f8 N: a  A! g5 ]' M9 g

  32. ( S7 E( |" n5 L$ Q0 [# O
  33.          TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;0 Y+ k5 n1 R6 A3 R4 @8 x

  34. & V) U/ j/ Z6 {4 s# e
  35.          TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
    8 V  q( M0 g/ O+ S0 L
  36. $ a. n: k' u( J

  37. 1 G1 ]6 |. u6 s

  38. 1 d( K8 `* E% A- I* G3 G
  39.          TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
    # W% C! x: c, w; B( d/ [
  40. 7 t" k% a7 \$ k+ u( h& n) M; p
  41. 2 ]( |- h/ n# D/ ^% @! {' U' |

  42. 7 l- B) s* B) B$ H  B
  43.          TIM_ClearFlag(TIM3, TIM_FLAG_Update);1 j- T( I: ~/ v6 ^; ^' C1 g
  44. , Q: B7 k. Q7 o* j8 `' j

  45. ( @+ b7 A9 K* b7 X2 e1 g, ]- c

  46. - x" O( A* Y1 i
  47.          TIM_ITConfig(TIM3, TIM_IT_Update, ENABLE);  M* J) F4 K9 l. ?: s/ O" r/ h3 y* u

  48. ) g4 W6 S+ l+ W2 `( F, b
  49. ) n- t/ R, J4 w
  50. : V$ ^9 G7 S( V
  51.          TIM_Cmd(TIM3, ENABLE);9 m% N7 d- C/ J* E! I3 d) w% E3 L

  52. ) F. O% L! v7 Z. K: z7 D' @9 e
  53. }
复制代码

8 V$ G& O" \( m/ U& @- Q( A# q: T* O2 r/ {) G
30MHz APB1时钟1ms定时中断。6 k* c3 K7 A, q1 I

0 J$ Z. p% V+ D8 j( b9 r
  1. void TIM_Configuration(void). J1 T* ^) f0 T+ ]$ e, }2 |* c; W
  2. ' C' u) \" g- N* {1 L. o
  3. {  n7 i9 Z/ X5 `$ ^" q
  4. 5 g+ a5 G0 p; ?  n7 M  o
  5.          NVIC_InitTypeDef NVIC_InitStructure1;
    4 Y- a3 f& y/ g
  6. ( m7 d/ l: M7 Q
  7.          TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
    ) R7 o- s7 \. y. I
  8. & i# e/ e- k$ R+ p" ~7 v  V& }
  9.          RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);  h9 s9 w, J  ~8 W* J, f. d( h

  10. + p' K5 O  V5 e9 A* b% c, W# |7 m
  11. / L, l( c# y% ~: C
  12. $ V, T0 v- D% ~7 i' i& L  ]
  13.          NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);
    - W0 V) ?% z" u* F. r  r
  14. . i1 }& w0 b. z7 Y: |2 A
  15.          NVIC_InitStructure1.NVIC_IRQChannel = TIM3_IRQn;
    ! m& r: ~  w7 ^( e

  16. / N5 U8 F3 K+ a4 H
  17.          NVIC_InitStructure1.NVIC_IRQChannelPreemptionPriority = 0;
    3 T( c/ i' |! \0 O

  18. 1 V2 r8 d( r0 @. S5 J/ W% L' S
  19.          NVIC_InitStructure1.NVIC_IRQChannelSubPriority = 1;
    - ~1 d" H2 S3 h
  20. 3 Y$ P. e! M7 a
  21.          NVIC_InitStructure1.NVIC_IRQChannelCmd = ENABLE;% k; Q* W. j+ X  o2 z

  22. 4 {& R* n0 t/ v2 r7 _  v
  23.          NVIC_Init(&NVIC_InitStructure1);; I) \% Y5 q$ S& @  p9 v5 C

  24. : F/ W$ h( E9 {2 B7 o2 Q
  25. 9 g$ Q! U* K/ ~. m
  26. ' U, D  X/ V" r, ?! E9 Y
  27.          TIM_DeInit(TIM3);
    9 l7 j: t8 C  M1 h, W5 k

  28. : ?) u* l% L6 ]' ]
  29.          TIM_TimeBaseStructure.TIM_Period = (60000-1);; e# z* l* C# d) U% f- u3 u1 a

  30. 7 @, Y$ _2 b6 r, H/ V
  31.          TIM_TimeBaseStructure.TIM_Prescaler = 0;
    / p4 x. z$ f6 u9 {  ?6 e/ o+ i: i

  32. 1 D% X. ]  g! ?
  33.          TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;* m3 v5 b7 H. q" J9 @2 n- u8 K9 o
  34. ; U" Z3 b* K. r. K# i, k8 p
  35.          TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
    3 I: r4 Y, g* [: g0 ]8 C1 B% k
  36. 8 F# H6 d& K1 d
  37. + S  f# h. F$ Y" u

  38. # W# ]4 [" F% F1 N7 R4 a) R
  39.          TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);. _! A# |5 g4 g9 k" t$ ~& u. r

  40. 9 z3 A) E9 d- C

  41. ) g( ~( }% J' ?+ `' ]) Q7 _

  42. , S" m' g: t( R$ e. @" G
  43.          TIM_ClearFlag(TIM3, TIM_FLAG_Update);
    # w. c( w8 d2 I# ^' }
  44. $ F3 W, y( b% e) C
  45. " K% M1 P& H2 R9 n5 T0 W
  46. 3 f( ]" Q6 d( e! x' T( |
  47.          TIM_ITConfig(TIM3, TIM_IT_Update, ENABLE);  J9 M6 }. V  o. `# @# H
  48. ; o# Z7 D$ A1 _3 g4 r. O4 k& T
  49. 8 U4 a4 G( L' D" }
  50. 0 n& q$ a! B0 _  i
  51.          TIM_Cmd(TIM3, ENABLE);9 \* {& I2 B% }

  52. 6 D2 T7 j" h  @0 B" f! N7 J% X$ [
  53. }9 Q- X2 i. d+ K  t9 @6 G
  54. . K& Q) L& i3 O3 C
复制代码
! b; V" q) [: `* g6 ^
收藏 评论0 发布时间:2021-12-1 22:35

举报

0个回答
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版