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

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

[复制链接]
STMCU小助手 发布时间:2021-12-1 22:35
定时器计数值的确定。
, g3 U7 l4 B1 x2 }7 u
3 N/ l' H2 B3 \. ]0 Z6 C: u- A    TIMER的时钟不是直接来源于APB1或者APB2,而是来自经过APB1或者APB2一个倍频器后的时钟。当APBx的预分频数为1时,这个倍频器不起作用,此时定时器的时钟频率等于APBx的频率;当APBx倍频数为其他数值时(即预分频数位2,4,8,16时),这个倍频数起作用,定时器时钟为APBx的两倍。例如AHB=60MHz,APB1为AHB的2分频,即为30MHz,则挂载在APB1下的时钟的频率为60MHz(2倍频)。% _: S6 d- `6 k0 e" D8 _3 R" g
# [" d2 e( f' [& p: j
2 w* l* E4 F6 A, m

$ F) M0 }8 n" h& h& Z! a( W% p各个功能定时器的比较表。
! u" l/ [4 H7 \1 l* \# |6 h1 n
, l- y% y1 ~* G! NTimer分布0 W# F" V1 }% s* Q% n, G

4 Y" S$ ?8 T! e: O1 @
O5@B8VPHF(`$][M780(]81Y.png

, u+ y5 ]7 P6 B! {/ v3 s3 }
ZIZ8PI1]{VDP@0@UPD4WPXV.png

8 P& [- n1 F' n3 t1 w- L
2R$QRD77UN__V$IHZ@)KXZM.png

/ ~$ L  K) n' A' ?5 @8 g  B
3%3{(A52L[K}E`%({21]P_V.png

. j6 [7 }) z5 z( F/ u7 f4 F
RPFBG2D6{X43}}H8W98$L.png
6 Z9 g# j* x' b6 C
)MDOR]U_Q2WEZPE9T`DZ_44.png

, g1 E) m7 u7 t7 \% P$ d& Q
1E$F%R6}KH${605$}IP_G96.png
% p) w0 z' I0 N, U2 z8 g% s" s
_6C_X(L0JO%KS$P)51`6_JR.png
0 n  K) Y2 B' W+ T; Q; `
% w7 K0 ~: o5 u1 Z9 k
1 i0 ^9 _4 }) x' K
systemtick的时钟直接来源于AHB,而且是24位的定时时钟,一般常用在实时操作系统中。定时非常准确。以下是systemtick的配置函数,由专门的中断void SysTick_Handler(void)。3 d# A1 {! U$ |- B% \- m5 [& }

4 A1 [/ O- \! {! Z/**# a5 {( ^  ~' D8 G1 @
) g& ^. R' q1 b& G$ _8 r% D, k4 W5 T8 x
  * @brief  SysTick时钟配置。. G* ?: j& E3 n$ V) I- u5 T

* L" `& u" i! z1 }  e: F7 ^  * @note   调用的是系统中的配置函数,将其函数名改掉而已,便于统一管理。) }: z, }0 m, Y, K9 m6 o3 m( h4 T  c
0 d$ E/ d% ~  ^& ?. m; N+ v/ H( z) Z
  *               只需要在该配置中加入计数值即可实现任意时间的定时配置,包括1us。
/ L" |! ~# D0 N1 B$ |) ~8 Q% P* q
7 u0 S" N$ O: h  E9 e+ U  [  *             <h2><center>需要结合中断函数。
% T5 ^( U. _. _9 {4 ~
5 }! l" P, C5 s# T  *               void SysTick_Handler(void){···}</center></h2>
3 \: _0 K& [$ R3 R: C1 {' c* v- V8 P
  * @param  ticks   :     计数值。该计数值可通过以下公式求得:AHB_Clk*需要定时值,% @( \8 j) N, A1 Q

9 ]0 c9 A2 S4 g0 Q  *                                    例如需要定时1ms,且60MHz的AHB,则计数值 = 60MHz*1ms = 600000。     
$ Y' Q, z$ p! q( a" P
& D9 \) ~7 V$ a! d# O; O- {  * @retval 返回配置是否成功标志。
. H6 f1 `5 G: d" T  ~% Y. a* f# O" J+ z
  */5 `) L5 D5 p4 z. G9 I# {0 O  u/ r

; ], b7 X1 H% @9 }/ Z60MHz AHB1时钟systemtick定时中断。9 w) R$ E0 J% H* Y6 }, N  t

$ B9 `3 M% n6 @2 w  A+ a$ t
  1. uint32_t BSP_CLK_SysTick_Config(uint32_t ticks)  o! E0 Q6 ^8 R7 E, s3 L

  2. . N9 h8 Y9 M% w" }; a9 y# \8 b4 |" q
  3. {
    % v8 ~! K  P/ |" ]+ Q/ j4 N

  4. 0 Z9 e1 U5 u- ~# j* _4 p; u
  5.          if (ticks > SysTick_LOAD_RELOAD_Msk)  return (1);            /* Reload value impossible */
    + T5 S7 I3 \+ t6 h/ E/ P
  6.   b( h& y. O# l3 @* N
  7. ! C) q. e& K( b% k8 s

  8. - B" {, Y8 Y0 t" L9 R" o
  9.          SysTick->LOAD  = (ticks & SysTick_LOAD_RELOAD_Msk) - 1;      /* set reload register */4 P! H5 S, L1 }( @& N
  10. 8 J$ b  z- e% H5 W+ S  _
  11.          NVIC_SetPriority (SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 1);  /* set Priority for Cortex-M0 System Interrupts */9 h6 c0 C# U5 Q! T- c" C6 H$ a& ]' u
  12. 4 g5 Z9 p; ]' m/ U- v  z
  13.          SysTick->VAL   = 0;                                          /* Load the SysTick Counter Value */( `" E& t' s1 k/ ]' f# \
  14. / J# a. \! j1 {/ t( N( p4 c* h
  15.          SysTick->CTRL  = SysTick_CTRL_CLKSOURCE_Msk |
    7 a3 T2 `+ r+ j, I; H, w1 A

  16. 9 L4 K. W- u% s* {
  17.                                SysTick_CTRL_TICKINT_Msk   |/ \$ e" i; J! p6 j0 F9 E

  18. ( f* ^3 |& c8 O& i
  19.                                SysTick_CTRL_ENABLE_Msk;                 /* Enable SysTick IRQ and SysTick Timer */
    3 ^! a, ]' ~& [) L$ W* N
  20.   ~6 K) n$ k' N0 E: v
  21.   return (0);                                                    /* Function successful */
    ! c+ P! I) o) [

  22. . B2 g! R  I5 G9 H& _
  23. }
    2 E: V; M! G3 H: ^# W( C

  24. 5 \1 \1 A# R  y$ g/ b0 X
复制代码
' {: ~' ?% m5 @5 G( I: B
30MHz APB1时钟10us定时中断。
9 p7 e# J1 Z6 S6 w, Z* g
, U; _4 l( |; A' `# s
  1. void TIM_Configuration(void)
    # c) ?. V  N! N0 e2 @2 ^
  2. . n' I) i0 z6 e, l
  3. {
    + n- [$ N; ^) p; Z# g' ^5 {8 x

  4. 0 V8 S$ |: v3 f: b& u8 i
  5.          NVIC_InitTypeDef NVIC_InitStructure1;) Q5 T; W& o8 a

  6. & O1 ^  y7 k5 A' d- {) T
  7.          TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
    3 U' ~, ]% l& |7 _. w$ ^. s8 h

  8. ' Q6 n) @  s/ m; Z
  9.          RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);/ T, r' s2 N4 k/ A% U; b
  10. ( @1 r3 _* o# d
  11. " A9 J0 w5 R5 P& ?& O+ B% B

  12. 8 y* j0 l4 t3 d
  13.          NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);
    & g, u" b# q4 `" `2 B
  14. 6 o- D: [* e% w# e8 @% C/ i; @
  15.          NVIC_InitStructure1.NVIC_IRQChannel = TIM3_IRQn;
    % ]& Q0 ]+ U3 U

  16. 1 o: M' ~; S, F8 N
  17.          NVIC_InitStructure1.NVIC_IRQChannelPreemptionPriority = 0;8 v$ d3 M+ Y! s8 D, K
  18. 9 H* x( V8 n" x; I9 @
  19.          NVIC_InitStructure1.NVIC_IRQChannelSubPriority = 1;
    ' q' G8 ~  n+ W0 f2 c: V7 V
  20. 0 z- ], I! h- F
  21.          NVIC_InitStructure1.NVIC_IRQChannelCmd = ENABLE;
    4 w% p& e& u9 ?1 Y

  22. 7 g' s  o. X7 c/ {7 j$ ~
  23.          NVIC_Init(&NVIC_InitStructure1);! F! p) @& x) p+ k
  24. 7 @# |2 @7 G& M+ j  ^- U2 e7 y
  25. , I4 d' @5 t3 B4 z) r
  26. . d& t/ u7 u% d, o/ R
  27.          TIM_DeInit(TIM3);
    ' L# }4 H+ t/ U3 I2 R( E5 x

  28. , r6 x- |5 W/ v5 M( [8 j& j; D
  29.          TIM_TimeBaseStructure.TIM_Period = 599;
    0 F# Y6 e3 G+ ?8 g; ]
  30. ' r. K+ D6 `: Q+ j
  31.          TIM_TimeBaseStructure.TIM_Prescaler = 0;- p( i* a" s8 \' Q7 ^. J: j

  32. . D* O' W/ ]  B" H2 p
  33.          TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;/ J  ^& U/ |% g& u. C
  34. # ?: t; M2 Y7 ^* \, @8 {; l/ U
  35.          TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;& P0 S$ ?" K! L7 ?- S" ?
  36. ) f7 n0 q" N3 ]) \$ M
  37. $ {! a0 J- e# w( `' `" W5 j5 L

  38. % t+ z( N4 @( Q* t5 @( }7 E
  39.          TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);) G3 j% Y2 U/ n2 [& t, B
  40. 3 {! w- j0 S+ u! D

  41. 3 L6 ]: K+ J0 |2 M. C: _) Z% x; I

  42. 9 T. m8 s8 G/ q  U- y/ K: R. \4 @# _
  43.          TIM_ClearFlag(TIM3, TIM_FLAG_Update);4 l/ V( A  X! B1 @

  44. 4 c1 B) A! \% x

  45. - _4 Q* a- T, W8 s" M  [
  46. 0 ~) Z  y4 `) `$ \* Z* A/ G5 a
  47.          TIM_ITConfig(TIM3, TIM_IT_Update, ENABLE);# z& z/ x5 G& l# c, [

  48. + F* i/ |3 Z: X
  49. 2 i, ~2 j2 Q9 P4 B4 B6 U

  50. ! [* t7 D1 e4 M' w% W1 \9 R
  51.          TIM_Cmd(TIM3, ENABLE);9 Q/ h7 s- I' s6 I5 |# c9 v

  52. 8 z) M0 k+ A/ p4 j* M
  53. }
复制代码
* n. I$ \5 c5 i/ Q3 E- M
. t) P3 T4 g5 a) s: v8 K
30MHz APB1时钟1ms定时中断。
( H" i1 e0 u- `4 W9 y
3 f% Q( N& ?6 U
  1. void TIM_Configuration(void)! A  H+ q8 e4 ]# y

  2. / e7 L$ G! a2 t, F, T
  3. {
    & X) T7 e7 G: p) z% S
  4. + D$ E4 G: ]7 X; R1 Y: g
  5.          NVIC_InitTypeDef NVIC_InitStructure1;
    2 Q  T& ~9 c1 ^6 K, p) ]7 Z. b* @) B) ?

  6. 0 h( x( ^, z6 a# U& A
  7.          TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
    % M2 X# `& ]& a* r: N
  8. 4 S: N# t6 P' l( W
  9.          RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);% _9 [/ c$ k5 p

  10. 9 ~4 {) ]1 b. k7 C2 k

  11. ; D* ~: Z' V; g# x
  12. ' `' ^9 }( k* k& c. N
  13.          NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);  Z" [  O( b4 P/ F" u5 ?# K* w
  14. % @7 k$ h6 J, Z! Q% ~' J1 `
  15.          NVIC_InitStructure1.NVIC_IRQChannel = TIM3_IRQn;
    7 |! v$ `' o* y+ m+ F; [8 ?

  16. / ?  i& B2 `1 t; y" b
  17.          NVIC_InitStructure1.NVIC_IRQChannelPreemptionPriority = 0;& A. u( o5 T4 m" D2 v
  18.   q: m( U& }& L4 M1 l
  19.          NVIC_InitStructure1.NVIC_IRQChannelSubPriority = 1;
    5 U: c! m; a9 n. \3 V

  20. 8 o$ b7 _9 S7 A4 L* M. k
  21.          NVIC_InitStructure1.NVIC_IRQChannelCmd = ENABLE;2 t4 i5 H4 A- Q4 d5 F
  22.   A% k! F: B9 T5 H; t3 X% T
  23.          NVIC_Init(&NVIC_InitStructure1);5 |  m/ `- V! U- Q
  24. 9 k6 c% T) }2 u! |1 S( e7 \
  25. 1 `. |! e; g7 }* K7 ?

  26. . a$ |$ \- _. C2 t0 m2 |
  27.          TIM_DeInit(TIM3);
    % L/ s# n) b/ q

  28. # C6 S  ?6 N$ K- l( f
  29.          TIM_TimeBaseStructure.TIM_Period = (60000-1);( C2 k/ P/ |$ p0 U4 a
  30. 6 O* M  r5 D  t$ Q: K
  31.          TIM_TimeBaseStructure.TIM_Prescaler = 0;
    8 l  U1 U( K4 i, e8 B1 u

  32.   C+ [5 N5 \5 x
  33.          TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;! h' U. o6 h, ^8 i/ A- q3 z
  34. ( W1 s- K( y- `; S8 R
  35.          TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
    7 ~5 q  {+ Z7 W: A/ n
  36. 7 Q. V! N) [: i$ ^. n
  37. : Y& P: ], r: D6 [7 V- \7 ~/ n
  38. ' n' K$ R) q; X
  39.          TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);9 i: B6 F0 v  |3 ]- q
  40. % _4 c7 G$ ~: e+ m

  41. ; _  K2 w* @" H

  42. + I7 U' V, g8 d, F: @2 |
  43.          TIM_ClearFlag(TIM3, TIM_FLAG_Update);$ K$ ~8 ~8 H* j9 g# }5 E
  44. : H# g# {: {1 _  t( `0 r

  45. 9 i9 ^) O+ B# }! ~7 ^+ m- p
  46. 3 i- Y8 ~3 x1 j  c
  47.          TIM_ITConfig(TIM3, TIM_IT_Update, ENABLE);/ \9 Z) t( W% a/ c/ L6 o/ e4 Q1 k: \
  48. : p) |+ }( L0 }7 U* H" o

  49. 4 a( ^# i" r7 ?' A$ n$ K7 k

  50. / o) N4 K/ Q, E
  51.          TIM_Cmd(TIM3, ENABLE);
    6 _$ E2 Y0 h* h  @: g8 O8 Y) }6 J
  52. 5 ~2 q: @/ \5 t$ b& ^5 f8 e5 l- o
  53. }7 m: r' W; S0 D

  54. % i: w8 C) X, B, p
复制代码

  l( G/ h% T4 Q% Y+ K$ p# c
赞 收藏 评论0 发布时间:2021-12-1 22:35

举报

0个回答

所属标签

相似技术帖

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