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

STM32定时器时钟源时钟选择

[复制链接]
STMCU-管管 发布时间:2021-6-4 10:11
基础了解
/ x* L: _1 N7 Y# D时钟选择计数器时钟可由下列时钟源提供:$ H& w8 b( A  K5 d# |

5 f8 M% K; `. V) A6 K
8 F7 g0 b  U8 W! k
● 内部时钟(CK_INT)( x) H9 s. J, k! N) y( D
● 外部时钟模式1:外部输入脚(TIx)
/ z& ~2 {' @& P) r+ |0 c. y0 o● 外部时钟模式2:外部触发输入(ETR)5 Z* e9 x+ L6 G6 [
● 内部触发输入(ITRx):使用一个定时器作为另一个定时器的预分频器
! j: \: ]: O+ P* F6 E7 [% C0 Q& |' M% }" z/ }
, X- K: O' x- a, c
在平常使用中我们系统复位 000 默认使用内部时钟源* f- ~( h7 ^; m6 i6 z4 J
; M) f) O+ I+ @* B' D- l7 `
  z5 x- w+ l6 e) c6 m
内部时钟源8 [$ y" a$ [; ~0 v& M, X) z
  从时钟选择框图中可以看到,内部时钟源(CK_INT)来自RCC的TIMx_CLK,即定时器本身的驱动时钟。+ n# l  p) K7 Y; x, b
! D8 `# @  c; P
- c; ^$ X3 E6 D3 K9 U5 R; P
  当禁止从模式控制器(TIMx_SMCR寄存器的SMS=000),则预分频的时钟源CK_PSC由内部时钟源(CK_INT)驱动。定时器的实际控制位为CEN位、DIR位和UG位,并且只能被软件修改(UG位仍被自动清除)。只要CEN位被置1,预分频器的时钟CK_PSC就由内部时钟CK_INT提供。  9 j) a7 D+ C6 B2 Q) T: O( Z2 R
3 i$ Z/ L. \$ u# o
0 H0 w, R5 h  o; |
  通用定时器的内部时钟来源于APB1总线时钟,但是通用定时器的内部时钟是根据APB1总线时钟是否分频来决定的,如果APB1总线时钟预分频系数为1,则通用定时器的内部时钟就是APB1总线时钟;但是如果APB1总线时钟的分频系数为2,则通用定时器的内部时钟就是APB1总线时钟的2倍。
; J# j5 W, }  x' x7 x& R8 z7 J7 L4 N; }( w( H' L

, t$ V! \5 G4 u5 ]8 k* ~+ n/ h1 t* v9 Y  下图显示了控制电路和向上计数器在一般模式下,不带预分频器时(分频系数为0)的操作。
$ M- `5 x) O# o3 w) }& y
1.png
+ Y7 }- L! a- w, `% T! C! ~8 b9 R, m
  如图所示,只有当CEN位被置位高电平的时候,预分频器的时钟CK_PSC和计数器的时钟CK_CNT才开始工作。1 u5 v1 h# a: L0 n+ D. L$ |: h

6 q$ L! d' ?" M+ [5 L4 D
9 D) ]+ j* n) c6 s, F/ S8 }9 n
外部时钟源1) R) z/ m3 `( @
2.png

! A0 _% l. K, [& w' z来自定时器自身输入通道1或通道2的输入信号,经过极性选择和滤波以后生成的触发信号,连接到从模式控制器,进而控制计数器的工作;
1 S# X2 \5 d) H" U9 G  Z9 U6 U& a0 e2 b3 Q' E

+ |: _; D+ S& [$ c  d& y; E% {+ g, K来自通道1的输入信号经过上升沿、下降沿双沿检测而生成的脉冲信号进行逻辑相或以后的信号就是TI1F_ED信号,即TI1F_ED双沿脉冲信号。
/ m1 I; S4 f' s7 U: Z3 S! M, g4 c$ _; q& ~4 }

6 C' a6 S# m& w- X9 b5 h& X相关函数' x; `/ z1 Q  e6 m
TIM_TIxExternalClockConfig(TIM2, TIM_TS_TI1FP1,TIM_ICPolarity_Rising, 0);; Z1 b, T" v) \8 [, s
//设置 TIMx 触发为外部时钟(从四个通道引脚引入)$ k% n) n3 G4 a$ V% p# L
//触发源选择:. n/ x) `- F3 ^5 V. i
//TIM_TIxExternalCLK1Source_TI1ED: 双边沿的Timer Input 1
9 A) w1 k: ]5 E" O8 {1 _//TIM_TIxExternalCLK1Source_TI1: 滤波后的Timer Input 1% k# g% L. o' q$ I
//TIM_TIxExternalCLK1Source_TI2: 滤波后Timer Input 20 D$ ?* p) d: n9 j$ G$ [' @/ o
//设置输入捕获的边沿:
- [; z% H$ T( I0 e1 o4 m/ d, F2 }# x//TIM_ICPolarity_Rising" h" z) @9 b9 r3 ^, g1 ]4 U
//TIM_ICPolarity_Falling/ x0 t" r9 [# N3 x

9 w: A  q* ?! \% k
) @0 r! A) C; J8 N
//TIM_ICPolarity_BothEdge- c' Z6 |( l; t4 ^. e- v0 g

  N5 M- W) W. r. j. O& Q5 f
) Z$ R2 c" S! D+ n- v# t; ]# e
//设置滤波设置:: O8 L' G  _* [
//必须在0x0与0xF之间: P' k8 R, @: |' M2 y6 N+ b( V

1 ?# z4 v' B2 `5 }" m& A0 j6 h

) I; Q% E. s" g, ?代码示例
  @7 [1 ]) \' |: z1 I4 Z2 `* b时钟源对频率进行计数$ B  l2 e( t5 i: i
  1. #include "timer.h"7 [& z, O9 U- Q' ^8 O2 F
  2. #include "led.h"
    ' ]4 a2 r, k9 j9 p  y, q$ O0 ]
  3. //     
    / T: h0 G* B( j; C0 R9 R
  4. //将PB5与tim2-ch1的pa0短接1 V+ j  Z- W7 i" Y2 M! F& n! {
  5. pb5为时钟源对频率进行计数  e( q* r$ i3 k/ H7 X% A
  6. 2 i% v: o7 E$ o. x1 {0 f
  7. void TIM2_Int_Init( u16 arr,u16 psc ){
    - a2 {, z4 ^+ E( W% i
  8. + B8 t, O$ ]& [0 t9 ^
  9.     TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;2 p2 z( g# X% ^
  10.     NVIC_InitTypeDef NVIC_InitStructure;
    ( O. Q4 @# m7 u( C( F; t7 P7 s
  11.    GPIO_InitTypeDef  GPIO_InitStructure;
    ( o6 D: O" c+ F  c& ]* `+ G
  12. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);! @- g$ l- a* p5 G
  13.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;               / G+ N% e3 W8 G. ]7 t/ c
  14.     GPIO_InitStructure.GPIO_Mode =     
    # d; K+ X: K8 _  @0 j. }
  15.      GPIO_Mode_IN_FLOATING;            
    ; D' x5 t0 K% X" K! L
  16.     GPIO_Init(GPIOA, &GPIO_InitStructure);   5 ^- ~1 w. k! [& ]3 u  Z* C
  17. 6 g' X# a1 Y. a
  18.     RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); $ J. y0 q) G1 i$ N4 y, D- V
  19.         TIM_DeInit(TIM2);
    5 h2 m7 }) `5 ~: Y1 j
  20.     TIM_TimeBaseStructure.TIM_Period = arr;     1 D1 b4 d" n% d& J% {
  21.     TIM_TimeBaseStructure.TIM_Prescaler =psc; 5 C4 O4 X3 \* `& a5 R
  22.     TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
    ! U7 S7 h" x9 V
  23.     TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  
      G7 U% c* q, J: I: u  z! h
  24.     TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
    : |8 n3 ]6 x1 w. j5 M. B' z
  25. ( N' J* v: T& g0 H# u- ?
  26.     TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE );
    + ]6 S2 b: D9 G! n8 c$ K" x  z
  27.   /*重点*/  
    " B( Y  p! ~2 f6 n; T. T& Z
  28. TIM_TIxExternalClockConfig(TIM2,TIM_TIxExternalCLK1Source_TI1,TIM_ICPolarity_Falling,15);//设置输入滤波和边沿检测; r- Y. y; g( h8 a
  29.     TIM_Cmd(TIM2, ENABLE);  4 W- F( V' V* Q
  30. //
      @5 R5 i+ W8 p! h9 f! L
  31. }
    4 u" O5 U. U) }' r5 j
  32. 7 K% v, {: U( t, j" L: [! b* s
  33. void TIM3_Int_Init(u16 arr,u16 psc){
    8 _: s- `# ]+ R5 c; E

  34. 9 ^3 K& f, P1 O; i: ?- G+ R& d
  35.     TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
    5 B% p$ `1 U  i

  36. 4 v% D, Q: O( Y4 j8 J: v
  37.     NVIC_InitTypeDef NVIC_InitStructure;! d3 t; @8 _7 w  p+ u
  38. - J1 J* b0 W2 D8 z( n: \* [( i. Z
  39.                   
    8 L) q1 j* I/ H4 _% @& S9 _
  40. 6 g& x: g0 k- o& `

  41. $ `3 [) d: T* J. h
  42.     RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); % q/ b, R$ X4 t$ a- C* b
  43.     TIM_TimeBaseStructure.TIM_Period = arr; . [: W9 I& f+ G& W
  44.     TIM_TimeBaseStructure.TIM_Prescaler = psc;
    8 ^; ~7 {, @& c) n& D
  45.     TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
    7 |6 i! A- \* F
  46.     TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  : o8 U$ [; \% X; _- G6 h) I
  47.     TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
    / I, ~* Z- U* n4 N  g
  48. # \% f! D7 k# J- t$ F) D

  49. ; g7 |8 w' ?1 {1 v: Y$ u
  50.     TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE ); 2 s5 m; j# E0 e3 W) w
  51.     NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;  
    ) B# Q% v( {  O( \2 H" s
  52.     NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;  8 k2 e0 P6 C4 X
  53.     NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;  
    2 E! ]' W% y( f( E/ d5 ]* p
  54.     NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    : {$ `- G, m! X
  55.     NVIC_Init(&NVIC_InitStructure);  
    " D1 D9 X/ t  ?; z" @0 T
  56.   c# ^; G; s# ~1 r4 m) H
  57.     TIM_Cmd(TIM3, ENABLE);               
    ' b# D% h, L, Q( y4 C
  58. }
    % \# C! O6 n; s

  59. - _% ?9 R& Y0 C! V! T" q. o
  60. void TIM3_IRQHandler(void){
    + ]& T. n4 d8 k. b

  61.   O9 u4 B% L* H* O% A" ?% ^
  62.     if (TIM_GetITStatus(TIM3, TIM_IT_Update)!=RESET){# [% i" Z( P* t+ _3 [( s; e
  63.                         LED0=!LED0;$ t/ C7 v6 P' t0 N) k* z* t8 S1 p; p8 t
  64.     }
    6 s2 Y$ }7 c5 O7 r9 k
  65.     TIM_ClearITPendingBit(TIM3,TIM_IT_Update); 9 w5 B" k) ?+ Q# ^
  66. }& }/ h4 H- V0 l& b9 ?
  67. #include "led.h"* b! G# B$ r9 t( }
  68. #include "delay.h"' Q6 X4 [. J5 y- o! j
  69. #include "key.h"
    3 `4 c  j# E3 Z" V$ j. d8 d4 ]
  70. #include "sys.h"
    , Q2 c' o. @, D' l9 r
  71. #include "usart.h"! a0 X* X& C8 x. P/ ]4 s
  72. #include "timer.h"4 Y/ W2 x7 J" H

  73. ) j# d% d" z9 f3 ~* g9 ?1 f
  74. int main(void)
    / P! ]( R7 Z  X& C3 v
  75. {
    2 ?1 G; P2 S6 d( Y% ^6 \

  76. ' ]" p3 b, {! K, ?
  77. delay_init(); //延时函数初始化/ s+ x( x/ H' ~  k# J1 O, M' `: U1 T
  78. NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级/ r- g4 n- i/ e7 h0 j0 h
  79. uart_init(115200); //串口初始化为115200
    + q/ h- X8 W1 i- x* z% J' N% K
  80. LED_Init(); //LED端口初始化
    3 k' |$ q! A6 x! x; s
  81. TIM3_Int_Init(4999,7199);//10Khz的计数频率,计数到5000为500ms
    - `. y7 d! t/ X+ H
  82. TIM2_Int_Init(10,0);
    5 [  B1 c) {0 q% D

  83. ' ~1 B2 Q/ _6 R0 @

  84. * Q, X- y& J3 ]/ q; n
  85. while(1)
    ' W, s9 B" B4 j' I5 M" ~0 m0 r  o# o
  86. {
    9 y+ r- W: T1 v+ ]% F
  87. //LED0=!LED0;" u1 \0 c* }/ j$ p
  88. delay_ms(400);# s6 f, |) B  o
  89. printf("Count=%d\n",TIM_GetCounter(TIM2));
    - U: k& P6 O6 ]. z* K" W
  90. }7 p# I- e5 V  n; L' b! _# W* Z
  91. 6 @2 J3 S7 \8 d, t
  92. 4 U9 R3 {& w  j
  93. }
复制代码
//TIM_TIxExternalCLK1Source_TI1: 滤波后的Timer Input 1
! k+ Q* G. x, O  H$ y/ Q6 ]) w- v//TIM_TIxExternalCLK1Source_TI2: 滤波后Timer Input 2- @! M+ H  h$ ]; M1 s" t

/ A2 Z: h5 r/ h9 S% D& b5 ^

5 s+ j: T" Q5 e这两个选项T1是CH1通道   T2经测试CH1与CH2通用
; r4 \- U! J( t7 T3 O* y3 l% J5 c% G$ W' w+ C
* e0 S& W* f# f2 ?3 I+ t
大概是这个异或的原因3 ~+ q% ~" w+ L- ]+ X
3.png

- r, }3 }7 X- J- q外部时钟源模式2
" ~6 u8 t8 I9 b3 i+ W5 T# q6 t
4.png

# e" u' C/ W5 j0 M+ `- ~- w7 I来自于 外部触发脚[ETR脚] 经过极性选择、分频、滤波以后的信号,经过触发输入选择器,连接到从模式控制器。当然分频和滤波不是必需的,可以根据外来信号频率高低及信号干净度来决定。
  }1 c9 i/ W' V' E1 D1 _
% Q( _3 ^, {( W- ?6 q, @
! ~  F' c  y) l3 [9 ^/ E. {7 z: u
ETR功能较全可以完成T1的工作但仅限于CH1通道,可以经行分频. k3 }# ~$ m" }, c4 U/ K. |

, H) s% Y& c" z

3 f( r* k( j; ~4 R* G相关函数
  |! k% m9 a$ y* t' RTIM_ITRxExternalClockConfig(TIM2, TIM_TS_ITR3);2 s) @' c" i/ t% D! E& M
//设置定时器工作于从模式,时钟源为其他定时器的输出分频.此时钟源无滤波3 a* q- Z1 A. ^
//TIM_TS_ITR0 TIM内部触发0 TIM1& V; k$ \8 S3 f. i  P1 A
//TIM_TS_ITR1 TIM内部触发1 TIM2( p  K1 }. Y: Y& n" o
//TIM_TS_ITR2 TIM内部触发2 TIM3
2 c1 L+ Y- N# z" M& q* ~' X& _//TIM_TS_ITR3 TIM内部触发3 TIM4! L7 D! }  L$ E0 [$ e/ n

9 O( ^3 U# a. e+ T) H% b: y
9 S; `' Q# G2 a* _. L* n" w
TIM_TS_TI1F_ED: Y& v2 x& ^! O% o# L
TIM_TS_TI1FP1' R9 g( s4 g) q3 A8 h. k
TIM_TS_TI2FP23 t4 U5 r: R. O/ D* l% p& h
TIM_TS_ETRF8 h5 R0 `8 h- D7 z* U2 K  s
5.png

# S- r) A* I+ P) E( u4 Z9 W3 C; f
6.png
2 j$ r& p' b7 R2 I4 t
TIM_ETRClockMode2Config(TIM2, TIM_ExtTRGPSC_DIV2,TIM_ExtTRGPolarity_NonInverted, 0x0);
# d0 L$ N, T/ o; K. |//外部时钟模式1.需要设置预分频,以及外部触发极性:滤波6 i9 q0 V4 B5 ]! L. v9 _8 J6 l2 A
//TIM_ExtTRGPolarity_Inverted TIM外部触发极性翻转: 低电平或下降沿有效 //TIM_ExtTRGPolarity_NonInverted TIM外部触发极性非翻转:高电平或上升沿有效; m" n6 |% g7 k$ F+ M' O4 C3 K+ ^
" p5 F6 E$ Q1 V6 o

' n6 W1 M2 U6 q代码示例$ {$ u& ]: l/ W# g
由第一个示例更改,功能一致main不变+ a! z" v; s2 n/ m$ k( D
3 K1 K: \8 P$ y/ P! Q
  1. void TIM2_Int_Init( u16 arr,u16 psc ){: e4 W- T, l  @

  2.   u, V, W4 w3 z7 q& M! J
  3.     TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
    + b5 i; _5 V* Q6 F
  4.     NVIC_InitTypeDef NVIC_InitStructure;' W2 m& ~% U3 d4 n2 D
  5.         GPIO_InitTypeDef  GPIO_InitStructure;2 _: ?; W' |  Z% d5 c/ v
  6.      RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); + f" n! P% h+ ]. Z; X% _
  7.     RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
    4 i" [8 ], z  @* Q
  8.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;               , A# V3 l; K" r2 M& P1 j
  9.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;            
    * p( q5 w, j. g! h& ?
  10.     GPIO_Init(GPIOA, &GPIO_InitStructure);     
    3 J( q3 s: U. I9 Q1 z
  11.    
    " d, P3 {5 {! X8 M2 a; i, n$ c
  12.         TIM_DeInit(TIM2);
    + Y/ K8 A8 z) O* `/ v
  13.     TIM_TimeBaseStructure.TIM_Period = arr;     . [; G# l! O1 A
  14.     TIM_TimeBaseStructure.TIM_Prescaler =psc; ( J! x/ S" z) o9 ]0 ?1 k
  15.     TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; # j4 W* i9 i6 I& Q9 v1 [
  16.     TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  
    + Q* u3 I4 N: @! d' U
  17.     TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); 6 H; v7 I7 D2 z

  18. , R" _" s+ s: H7 C
  19.     TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE );
    + T: s$ i; k( H. C* m# k8 ]

  20. ) r- ?$ r' }; L5 Y( F# y
  21. /*重点*/
    1 n2 }+ H% ~' H1 c; _
  22.         TIM_ITRxExternalClockConfig(TIM2,TIM_TS_ITR3);//高级定时器开启
      [) U1 g2 S$ O, q
  23.     TIM_ETRClockMode2Config(TIM2,TIM_ExtTRGPSC_OFF,TIM_ExtTRGPolarity_NonInverted,0)//配置外部时钟2的模式;
    3 b# x) `# \; c6 x
  24.     TIM_SetCounter( TIM2,0 );
    ) n: q* m# F; `- d8 f% w3 Q
  25. /
    0 a5 W. ?7 i4 z
  26. 2 {9 h) U: q4 ?$ F9 h
  27.     TIM_Cmd(TIM2, ENABLE);  5 d. H, Y7 K. `) `0 r* r
  28. 1 C) A0 I5 o% e. F) ]1 r
  29. }
    * [& ?* W' F, q& ^1 x1 P
  30. void TIM2_IRQHandler(void){    ) a' J8 F0 L  v% q  R; d0 B- H* `
  31. 9 s9 O; i3 P" R* Z9 v* o* q* K
  32.     if (TIM_GetITStatus(TIM2, TIM_IT_Update)!= RESET){8 A( F; ^( }: j) A9 z7 ^

  33. 7 V2 P9 y' a7 u4 Z# Y& |, w8 g
  34.     }
    2 U$ m7 J" M# R. ^+ c' o
  35.     TIM_ClearITPendingBit(TIM2,TIM_IT_Update);   
    ' h- m4 [5 X% D7 q
  36. }
复制代码
' w  d. f" I3 u* y

: d8 s0 P" N' o- ?0 B" h7 B
赞 收藏 评论0 发布时间:2021-6-4 10:11

举报

0个回答

所属标签

相似技术帖

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