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

STM32定时器时钟源时钟选择

[复制链接]
STMCU-管管 发布时间:2021-6-4 10:11
基础了解7 r( k7 d+ k: q* O/ q( ?
时钟选择计数器时钟可由下列时钟源提供:
) l2 i% G; G: w% A" o! g7 z7 k3 M6 g" B6 G% u, W) L- H

7 r: X/ i7 Y$ s) O$ n● 内部时钟(CK_INT)3 P( c: i" S) w+ p9 S" k) K
● 外部时钟模式1:外部输入脚(TIx)
' X5 j% N1 P- r( j; _● 外部时钟模式2:外部触发输入(ETR)2 u4 f$ Y5 Q  w
● 内部触发输入(ITRx):使用一个定时器作为另一个定时器的预分频器( u1 J, Y: w8 A* N- ?

* u: l3 R% @/ d- I1 W
4 i/ U  c* d% `" O( x: }: q
在平常使用中我们系统复位 000 默认使用内部时钟源7 W7 h) _6 _2 {+ A/ i! G
# a- M$ V9 k1 N( J9 a9 C  u# ]

! a- s5 N" p8 s内部时钟源9 j4 h' n" ?0 q6 R
  从时钟选择框图中可以看到,内部时钟源(CK_INT)来自RCC的TIMx_CLK,即定时器本身的驱动时钟。
& B" F8 f- t" Y+ |7 T# ^% M1 |) }) T7 P( u

9 A9 U, R! D: W0 i/ F7 F8 D# u. x  当禁止从模式控制器(TIMx_SMCR寄存器的SMS=000),则预分频的时钟源CK_PSC由内部时钟源(CK_INT)驱动。定时器的实际控制位为CEN位、DIR位和UG位,并且只能被软件修改(UG位仍被自动清除)。只要CEN位被置1,预分频器的时钟CK_PSC就由内部时钟CK_INT提供。  
7 ?, t+ X% I' m) t- l, b& _. }$ g7 c6 T2 X- `: q% e

! h8 {' I/ _+ Q  通用定时器的内部时钟来源于APB1总线时钟,但是通用定时器的内部时钟是根据APB1总线时钟是否分频来决定的,如果APB1总线时钟预分频系数为1,则通用定时器的内部时钟就是APB1总线时钟;但是如果APB1总线时钟的分频系数为2,则通用定时器的内部时钟就是APB1总线时钟的2倍。
2 L- e4 W3 i# M  |5 v2 ]+ D3 n; s. \! ^
: d9 h5 H8 _4 ]+ Z* t
  下图显示了控制电路和向上计数器在一般模式下,不带预分频器时(分频系数为0)的操作。
4 P. {( X1 {& x/ V% T# Q. [
1.png

2 ^" n$ F/ v6 X% q( M% n  如图所示,只有当CEN位被置位高电平的时候,预分频器的时钟CK_PSC和计数器的时钟CK_CNT才开始工作。3 l. W3 _% w1 p" W+ C

+ V/ t" g( d4 }( e# j& }& j

: i* H) d5 {* n9 Q0 _# c9 i2 f) U外部时钟源1  ?  ~( s* r, E9 ~1 c7 [6 N
2.png
) F8 H1 p+ j. N* F  U- H
来自定时器自身输入通道1或通道2的输入信号,经过极性选择和滤波以后生成的触发信号,连接到从模式控制器,进而控制计数器的工作;7 y  n% ]9 f; i; b- G* u$ B

9 |& m- Z' U% g' H+ E7 O

! Y# x4 L0 k( k2 c4 ?1 j) ^来自通道1的输入信号经过上升沿、下降沿双沿检测而生成的脉冲信号进行逻辑相或以后的信号就是TI1F_ED信号,即TI1F_ED双沿脉冲信号。  h6 z, b, N. L
6 F; ^6 r4 B# T% X5 w  C

1 @3 N0 {5 }; G- B& r4 z( g+ F相关函数
3 F4 X) j) Z: pTIM_TIxExternalClockConfig(TIM2, TIM_TS_TI1FP1,TIM_ICPolarity_Rising, 0);+ p% B5 s$ ]' u3 b5 _& e
//设置 TIMx 触发为外部时钟(从四个通道引脚引入)5 X& z2 d; d3 L9 Y
//触发源选择:
+ o" @: J+ C- Z- P& q% s* J0 T) j! D//TIM_TIxExternalCLK1Source_TI1ED: 双边沿的Timer Input 1
% e" \: f7 [2 n, J6 Z7 _3 q//TIM_TIxExternalCLK1Source_TI1: 滤波后的Timer Input 17 p+ @  }! J. o) Q* v8 ?
//TIM_TIxExternalCLK1Source_TI2: 滤波后Timer Input 2
+ G$ i: j! f4 m9 y1 B! ~( d, `//设置输入捕获的边沿:
$ ?) {  i9 r- i- V( f//TIM_ICPolarity_Rising* n  l/ d+ j' \; {1 U0 M% i
//TIM_ICPolarity_Falling6 j. i5 u. R  d. i: Z; Z$ L  q/ g
9 i  Z9 f! l! J" H

' }( w0 b; G, A5 g5 `4 L  K//TIM_ICPolarity_BothEdge
) Q7 f! T4 B1 I! j$ L+ @
7 X$ ?' s+ S" t9 H: r! Z

, g, u6 ~* \# ?( E//设置滤波设置:7 M* y% \! A7 D5 n
//必须在0x0与0xF之间
% t4 `7 M3 T$ X  j& }% ]) o7 @: u# J/ t3 u' T" @1 ~  N- Y

' c9 }& v5 C! d  D代码示例6 Z% b- Q% ?0 D) k$ ^
时钟源对频率进行计数
' r# r# t1 |: ]  H, e: q# U' X/ |
  1. #include "timer.h"
    8 o; l. q! S( u' O0 [, s+ V# X
  2. #include "led.h"+ y# m  F. E& a) V( t' a; ]
  3. //     
    + o- r7 I, p6 C2 m
  4. //将PB5与tim2-ch1的pa0短接  x- j: ?8 \. ]- |* A
  5. pb5为时钟源对频率进行计数
    5 x( O# j# i! b+ t; y. x2 g
  6. ) _- t  i& Y0 S1 E
  7. void TIM2_Int_Init( u16 arr,u16 psc ){
    " ^+ U6 o4 H2 F* D

  8. $ B% D5 K1 _! Y9 i( D
  9.     TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;+ V, T* T( }: v! C$ \
  10.     NVIC_InitTypeDef NVIC_InitStructure;
    ' N! o9 a, r; M3 s8 q- y
  11.    GPIO_InitTypeDef  GPIO_InitStructure;) D4 f7 j+ p1 N9 E" I; S
  12. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);6 y2 c: F  u. k7 @* i, {  d
  13.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;               
    ' ?4 X9 i( L# N
  14.     GPIO_InitStructure.GPIO_Mode =     0 b8 @! _6 l5 n5 h$ q
  15.      GPIO_Mode_IN_FLOATING;            - x# R1 r' Q' o2 w1 U
  16.     GPIO_Init(GPIOA, &GPIO_InitStructure);   # t5 O, ~. g1 h. Z

  17.   Z' r6 `+ d. p" [5 X! z
  18.     RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); % a% e' X3 D, q9 M4 h5 E
  19.         TIM_DeInit(TIM2);" |; h* H  F8 I
  20.     TIM_TimeBaseStructure.TIM_Period = arr;     . J/ ~" E5 Q) j: B! v0 G: c  g
  21.     TIM_TimeBaseStructure.TIM_Prescaler =psc;
    - z# N5 Y1 v/ ?. z4 b" i
  22.     TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
    5 S2 Q% K/ P9 t" ]
  23.     TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  & A/ Z% E$ r) _/ K+ ~" }
  24.     TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); ; E& ^* F9 z0 o2 I

  25. + O2 X- ^* v( p
  26.     TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE );
    6 E6 c4 W$ s- `7 r
  27.   /*重点*/  ! J6 Q, I( l4 ^# X' u4 _
  28. TIM_TIxExternalClockConfig(TIM2,TIM_TIxExternalCLK1Source_TI1,TIM_ICPolarity_Falling,15);//设置输入滤波和边沿检测3 r* R$ d" x6 c
  29.     TIM_Cmd(TIM2, ENABLE);  
    : \% `  A8 x7 x4 ~' j& s+ l" c
  30. //
    ( a3 M- E; ~% Z5 J, ?! @# y+ `; u
  31. }, X- ]. i! K/ e  Z/ {$ l. P( h9 i

  32. , y/ E) h& S0 _# m) o5 J! T
  33. void TIM3_Int_Init(u16 arr,u16 psc){7 z) d4 V, W& {% W

  34. ! @9 v) _; n7 V6 m6 l' P) C
  35.     TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
    6 B" c! p% g* B' }7 v% p

  36. / |; n9 P4 S" U0 T) A3 Q) H
  37.     NVIC_InitTypeDef NVIC_InitStructure;& ~1 s9 D; p/ }
  38. ; ?+ q. I5 G# P! ?' e
  39.                    0 h, e/ X! z5 r1 z

  40. % |) ~: s$ l; N( Y

  41. 1 Q) R& H9 B3 O5 s' Y
  42.     RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
      h# V& K: H1 L* j- L( X
  43.     TIM_TimeBaseStructure.TIM_Period = arr;
    8 V! X& j" T8 m( b
  44.     TIM_TimeBaseStructure.TIM_Prescaler = psc; , E3 S: J! g6 i3 }' J
  45.     TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; , u) ]& j$ l* ~; Q/ ?
  46.     TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  
    * C+ R$ K1 N5 m2 b' T9 l% U! g
  47.     TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
      t8 v2 `" m5 L2 u) f# }
  48. 4 i5 S1 K/ n4 p5 P5 V5 R6 V
  49. 1 w9 w% V) \$ |5 ^  j
  50.     TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE ); " ~4 m/ _4 o- K+ ^( g
  51.     NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;  
    9 t: D( D( l9 i& U* F
  52.     NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;  
    , Z$ o* w; \; i1 y: [" \
  53.     NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;  # }: r- ?* Y( Y  X# e1 b  b
  54.     NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; ' d0 C2 n& J& M7 ^/ k
  55.     NVIC_Init(&NVIC_InitStructure);  4 v4 Q6 ~6 k6 ?4 O6 l  G) I
  56. : c( |5 m& U/ p) \4 M1 ?
  57.     TIM_Cmd(TIM3, ENABLE);               & N; R' A' t. C: C$ H
  58. }
    9 n3 |4 [7 i8 g
  59. ' G7 v& l6 O5 ]7 d9 X
  60. void TIM3_IRQHandler(void){
    6 Y" F# [- I" b6 s( Y
  61. 1 J2 a, `% O, e1 g
  62.     if (TIM_GetITStatus(TIM3, TIM_IT_Update)!=RESET){: t* Z4 a7 J4 A4 E) k' W
  63.                         LED0=!LED0;$ m0 A# w  M, J  r5 i  a5 Y0 z2 d
  64.     }
    ; h9 P8 A  }% B* f1 [8 d- m) j
  65.     TIM_ClearITPendingBit(TIM3,TIM_IT_Update);
    / y: Y  G- _# }) l7 L
  66. }9 }2 Q0 K2 T  {; [- X
  67. #include "led.h"
    ; T: p0 x( j9 B! ~% P
  68. #include "delay.h"
    # x% z/ s% h+ I# S) @. v
  69. #include "key.h"3 F2 A  K, ?' m0 `: J
  70. #include "sys.h"  T4 U5 ~" F. {0 S, G1 e+ K
  71. #include "usart.h"8 o( N$ }8 Q8 ~) [7 D
  72. #include "timer.h"
    % F% [8 U& W7 ]$ Y$ F; A. C3 S

  73. ! F/ W+ n9 C+ f9 q
  74. int main(void)9 P. z* l! `$ m3 V. Q7 I
  75. {5 u7 @2 [2 g2 p5 v. Z, p6 i, w
  76. % ]! \1 H# c+ t; J- y5 I
  77. delay_init(); //延时函数初始化
    2 R8 ^% e  T4 {- c3 u
  78. NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
    4 ?+ a, Z3 R6 x9 Z$ K& }. D
  79. uart_init(115200); //串口初始化为115200
    5 i& o( o6 K9 k" \; a) g, l
  80. LED_Init(); //LED端口初始化0 q  {2 |' u: @; |5 ^. x" t' t$ U5 a
  81. TIM3_Int_Init(4999,7199);//10Khz的计数频率,计数到5000为500ms
    # ^) f( c. U) G& x( D, b& b
  82. TIM2_Int_Init(10,0);
    + ?% a; p( Y  S6 r8 u9 u* e

  83. : ~* q: U' ?; m  ]4 B. N

  84. 1 O) ]2 b8 m8 K% d
  85. while(1)* J/ @: f5 R! G8 O
  86. {
    / E. [$ w7 w8 Q; n, [& c) w5 f
  87. //LED0=!LED0;
    5 |9 ~1 X! M7 C5 o4 Y2 ^
  88. delay_ms(400);6 x2 L- O7 k6 i) z5 g. @
  89. printf("Count=%d\n",TIM_GetCounter(TIM2));
    ( x/ i5 \$ v* g# b: E% n
  90. }
    # |3 B9 [$ U9 I0 n" N9 E! a  i
  91. ; f: }! D  C' q9 r( E" j# h

  92. , y$ f: n1 R: x
  93. }
复制代码
//TIM_TIxExternalCLK1Source_TI1: 滤波后的Timer Input 1
% ?, N. x6 j  A# Q6 J% v//TIM_TIxExternalCLK1Source_TI2: 滤波后Timer Input 2
- X6 y" L' u7 j5 F9 z1 b$ ]% }
0 A3 K3 \! y, u" {  c5 g  C
  x, ?6 z% t  E1 Z0 ~
这两个选项T1是CH1通道   T2经测试CH1与CH2通用
& h6 G6 G7 X' x5 g9 k: E1 X* E. [  C0 ~' t* z8 ^; z0 O

% z* g( f6 F, \- q大概是这个异或的原因
4 n1 h3 O* F8 c' J: p
3.png

2 k2 |% w0 n# ]% t. a( F外部时钟源模式2
0 U9 `1 b1 y( s' d2 R4 R9 W
4.png
7 E5 C" `0 w% {0 u3 Z! R/ h
来自于 外部触发脚[ETR脚] 经过极性选择、分频、滤波以后的信号,经过触发输入选择器,连接到从模式控制器。当然分频和滤波不是必需的,可以根据外来信号频率高低及信号干净度来决定。1 h5 I  S2 g0 j$ J

& M! q/ Q! u) s1 A
3 s2 J/ C% ^- ?) K6 g3 D
ETR功能较全可以完成T1的工作但仅限于CH1通道,可以经行分频( A# F. z. Y8 a* @2 d
; e* O4 z/ R  c# ]+ ]* U

. R) c# o& v  @0 e4 _. F相关函数! Q5 Q5 @1 R3 N, T- y( ^: q. Q7 B
TIM_ITRxExternalClockConfig(TIM2, TIM_TS_ITR3);* H6 `& Z3 d' A1 w3 b
//设置定时器工作于从模式,时钟源为其他定时器的输出分频.此时钟源无滤波+ D- T: b0 q7 p+ }9 O, ~5 {
//TIM_TS_ITR0 TIM内部触发0 TIM1
6 @8 j3 i3 v, M6 d7 U" m//TIM_TS_ITR1 TIM内部触发1 TIM2
: @* `6 W% ]0 V. p+ B6 O) ]! e//TIM_TS_ITR2 TIM内部触发2 TIM3- R- M( J, x  C+ ?1 F9 P
//TIM_TS_ITR3 TIM内部触发3 TIM4
& h1 b' B* G* V; \
/ w( Q& C. V6 a2 q$ v9 k  p3 I

/ l7 y  l6 Q+ N+ V/ j0 G4 y TIM_TS_TI1F_ED
0 ~4 t: m7 K9 x/ r% h3 U0 ETIM_TS_TI1FP1% Z, H. z$ Q. E% i
TIM_TS_TI2FP2" f5 ?0 q7 i2 P- C3 U2 e
TIM_TS_ETRF
4 a# l0 @. F8 i9 h; U: W, y" R
5.png
; Q3 e2 V. i+ f! n
6.png

/ g# g% U: L: W( p5 J' FTIM_ETRClockMode2Config(TIM2, TIM_ExtTRGPSC_DIV2,TIM_ExtTRGPolarity_NonInverted, 0x0);
+ Z2 V5 }) ~% S- @' q//外部时钟模式1.需要设置预分频,以及外部触发极性:滤波1 B2 R3 I( E+ d  m
//TIM_ExtTRGPolarity_Inverted TIM外部触发极性翻转: 低电平或下降沿有效 //TIM_ExtTRGPolarity_NonInverted TIM外部触发极性非翻转:高电平或上升沿有效
3 A& L- ~/ m: P) r! D& @5 o7 g  O$ j  L. ^* ^
7 @8 D; M$ G9 E) M' D, a
代码示例
8 s2 {7 ?0 u% N3 k1 w( l; E% e( h由第一个示例更改,功能一致main不变
: F: m7 y1 I+ |" f2 R
, I8 m* o+ y0 A* i& T" g8 J
  1. void TIM2_Int_Init( u16 arr,u16 psc ){
    ( S9 b  C; B- M* E6 o
  2. " W4 n' T* `7 [3 B  |  ~( N
  3.     TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;3 j0 \7 c, w, ^4 X4 V) F
  4.     NVIC_InitTypeDef NVIC_InitStructure;) B2 Y5 Q/ J1 R! K* d% X8 W& j
  5.         GPIO_InitTypeDef  GPIO_InitStructure;+ ^3 g) l7 o: }: R6 n2 F
  6.      RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
    : O2 R& r0 p6 l5 ]& G3 ]
  7.     RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);, p* \" V/ W# o
  8.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;               . E4 ~1 B( }3 u" ?
  9.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;            
    # \* j( x- {! v* r7 ?5 h2 z  p
  10.     GPIO_Init(GPIOA, &GPIO_InitStructure);     ( o5 @+ ]0 X% X  K# X$ m5 v, ^
  11.    
    * S8 o6 L) y% a1 w) d& y, R9 i
  12.         TIM_DeInit(TIM2);8 [2 F8 _1 Q# w7 l$ H
  13.     TIM_TimeBaseStructure.TIM_Period = arr;     
    0 G) [+ ]4 C  {4 D- u2 ?8 D( K
  14.     TIM_TimeBaseStructure.TIM_Prescaler =psc; # H4 ~! H5 ]# A8 t( O$ p
  15.     TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
    % m( D0 p. u3 O7 I# A( g
  16.     TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  
    8 I) p% {3 g" h# V2 A, J
  17.     TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); % g6 {. B7 ~0 b8 w2 e/ x5 E: h3 d

  18. * H5 P9 a) l  P9 w" a) q4 d
  19.     TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE );
    7 C0 f7 U* r. M; m& z0 h' r& I

  20. 5 o: P1 H) y3 e* M3 i5 r
  21. /*重点*/
    1 X# u6 `# U' c. f
  22.         TIM_ITRxExternalClockConfig(TIM2,TIM_TS_ITR3);//高级定时器开启
    1 D$ J% e+ \6 L
  23.     TIM_ETRClockMode2Config(TIM2,TIM_ExtTRGPSC_OFF,TIM_ExtTRGPolarity_NonInverted,0)//配置外部时钟2的模式;
    - f) |) ]9 x" n# ]. K/ F7 R4 F
  24.     TIM_SetCounter( TIM2,0 );" |! ?; {1 p# \; \" A
  25. /
    5 e5 f( k8 _5 n( K
  26. 6 c' Y2 z2 Q2 X3 ^
  27.     TIM_Cmd(TIM2, ENABLE);  
    6 o( H6 r3 Y$ u: H- P4 m

  28. ; z$ u! _# y( N( Y- e- z* g0 u" C) p
  29. }
    * b+ j. ]- i9 h$ Y, F3 f  T
  30. void TIM2_IRQHandler(void){    3 }. R/ o* D7 y" X9 A
  31. / _$ q2 Z4 ^$ d1 c2 w
  32.     if (TIM_GetITStatus(TIM2, TIM_IT_Update)!= RESET){
    8 P* v, T- p# k4 Y7 a

  33. ; q: e6 r1 s  T3 y$ S1 u
  34.     }
    6 H& R- X1 y2 J: ]1 L
  35.     TIM_ClearITPendingBit(TIM2,TIM_IT_Update);   
    , m1 R" |& G4 q" w
  36. }
复制代码

  u# |- \. r! ?% @
% P0 a8 `& ]" z8 W7 ?" z  t
赞 收藏 评论0 发布时间:2021-6-4 10:11

举报

0个回答

所属标签

相似技术帖

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