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

STM32定时器时钟源时钟选择

[复制链接]
STMCU-管管 发布时间:2021-6-4 10:11
基础了解
3 U2 P0 F; P% X8 L! c时钟选择计数器时钟可由下列时钟源提供:$ Y# n; X4 l* N( y. D4 e

3 z+ t" p) o1 e0 ?* k
. r9 j! D/ N* g/ G, b. \
● 内部时钟(CK_INT)
( {: {. j3 P, M! y# H● 外部时钟模式1:外部输入脚(TIx): T! |0 w8 A- G6 M9 {7 [
● 外部时钟模式2:外部触发输入(ETR)
  X0 V2 w- q( e9 X● 内部触发输入(ITRx):使用一个定时器作为另一个定时器的预分频器
9 P4 O+ }1 }9 t5 [
* S% j. ]: e! l9 m6 q6 b7 }

4 E8 L& D* `* `6 {在平常使用中我们系统复位 000 默认使用内部时钟源+ O7 G! m  \7 ?7 c

2 _4 X! j/ W# d

% [' q; C' K. b  v. r1 [- X内部时钟源1 a8 B1 S5 `5 s% k3 Y) a+ }
  从时钟选择框图中可以看到,内部时钟源(CK_INT)来自RCC的TIMx_CLK,即定时器本身的驱动时钟。6 ?7 O. j! \  A3 p% C! v
2 U2 E/ C$ y5 X, s2 W4 W. w

+ }3 n9 u. v9 U6 k+ H: {! w  当禁止从模式控制器(TIMx_SMCR寄存器的SMS=000),则预分频的时钟源CK_PSC由内部时钟源(CK_INT)驱动。定时器的实际控制位为CEN位、DIR位和UG位,并且只能被软件修改(UG位仍被自动清除)。只要CEN位被置1,预分频器的时钟CK_PSC就由内部时钟CK_INT提供。  ) t0 ]- W! j5 \+ S6 n) l2 k

7 _' O5 N; D7 u, u
* q$ r1 `  N5 h
  通用定时器的内部时钟来源于APB1总线时钟,但是通用定时器的内部时钟是根据APB1总线时钟是否分频来决定的,如果APB1总线时钟预分频系数为1,则通用定时器的内部时钟就是APB1总线时钟;但是如果APB1总线时钟的分频系数为2,则通用定时器的内部时钟就是APB1总线时钟的2倍。
# O, A8 @( Z# l: q1 m/ }1 p) H8 Z+ \/ W% `# t) T# q* q( _

' O( j- l  L$ i9 z9 d& u2 l7 J  下图显示了控制电路和向上计数器在一般模式下,不带预分频器时(分频系数为0)的操作。
% t9 O( f+ h, R9 ?' Q6 H0 S
1.png

" `9 D; h% d; Q" }) a  如图所示,只有当CEN位被置位高电平的时候,预分频器的时钟CK_PSC和计数器的时钟CK_CNT才开始工作。( `# K' k0 k) L2 O* s1 X1 V2 A, y

: h+ c) e9 L& r& o! m3 {
1 h& F& ]. _, Q. v
外部时钟源18 C1 I/ Z6 y3 h+ Y/ P
2.png

9 U5 V9 `; V! @/ K# o来自定时器自身输入通道1或通道2的输入信号,经过极性选择和滤波以后生成的触发信号,连接到从模式控制器,进而控制计数器的工作;
/ D  ]9 B/ S8 e# j
  a. D9 u  J# E' j
$ Z! S8 H7 d! z( I% b
来自通道1的输入信号经过上升沿、下降沿双沿检测而生成的脉冲信号进行逻辑相或以后的信号就是TI1F_ED信号,即TI1F_ED双沿脉冲信号。1 b9 @5 Z1 a0 ^* ]

# d# c4 |5 {2 Z" z! J6 ?
8 _: u6 f/ ~0 V
相关函数
. [" k/ }8 T, Y5 }8 E3 _; o7 eTIM_TIxExternalClockConfig(TIM2, TIM_TS_TI1FP1,TIM_ICPolarity_Rising, 0);
/ Z$ c: [. g) T//设置 TIMx 触发为外部时钟(从四个通道引脚引入)
  d! z( r$ G  H) U) s//触发源选择:9 s( m8 Y1 Z4 h0 d! i3 c
//TIM_TIxExternalCLK1Source_TI1ED: 双边沿的Timer Input 1
/ ~$ L1 _! f1 w* w3 p% H! M& a+ s% f//TIM_TIxExternalCLK1Source_TI1: 滤波后的Timer Input 1
2 d* y7 z- Q- Z//TIM_TIxExternalCLK1Source_TI2: 滤波后Timer Input 2
$ {" ]8 {# s6 X3 H3 M2 ^//设置输入捕获的边沿:
; i" b+ V; g9 [2 m$ A//TIM_ICPolarity_Rising- f5 E1 r2 t7 \4 w+ w; C% l7 v
//TIM_ICPolarity_Falling
8 X8 M8 r/ }/ p! C. B5 i" J+ T( e. b: N% {0 u2 M

; t5 P) i" g9 ]8 r& b//TIM_ICPolarity_BothEdge
" T/ c# `) h7 a* P4 @7 D( o8 u8 ?( `+ v4 g8 }7 N

& W/ {; l' N# f! Z0 f//设置滤波设置:
6 z" ~2 M3 I- f/ z3 K- J8 |//必须在0x0与0xF之间$ j+ F+ R$ D% s8 y: w8 r, i  m

( J$ n0 @: P2 b
# W/ j1 h# `( s- x# k4 T
代码示例+ M* z5 C5 J6 M
时钟源对频率进行计数
6 g# i9 }3 Q" {" E3 L1 }
  1. #include "timer.h"
    6 {" G3 N8 I9 G
  2. #include "led.h"
    ( u# [( ^9 W; o
  3. //     ! D1 \/ r3 E0 d2 [
  4. //将PB5与tim2-ch1的pa0短接
    " \, l  B8 O2 z+ R* t) i
  5. pb5为时钟源对频率进行计数
    + Q. V7 e4 I( u2 T9 M$ |6 B

  6. " u# D8 T4 X; f( F9 F
  7. void TIM2_Int_Init( u16 arr,u16 psc ){6 ?$ X+ t. n" r/ k! x( H

  8. ! r% P/ G0 B0 X' i5 y
  9.     TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
    & I' O- e/ F! Q- l$ g
  10.     NVIC_InitTypeDef NVIC_InitStructure;# a% H- @$ W, B1 i6 ~) z6 p
  11.    GPIO_InitTypeDef  GPIO_InitStructure;8 x4 T  r; I7 f% ]2 c9 W" E
  12. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
    + g& |0 X, Z$ ], [: [5 L# D
  13.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;               
    0 A# u- i, Z: n8 f* p) P
  14.     GPIO_InitStructure.GPIO_Mode =     ) ^$ R3 H4 m" g+ m+ ]6 S
  15.      GPIO_Mode_IN_FLOATING;            7 k3 F/ F% D2 a; h- C6 }5 q' h
  16.     GPIO_Init(GPIOA, &GPIO_InitStructure);   
    ! C  F! I  F3 i" i/ Y

  17. 4 B4 T) s  |& m
  18.     RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); ; N2 W2 w! i" e; V# Y8 p
  19.         TIM_DeInit(TIM2);" S/ [) H7 o' H& h, ~+ x
  20.     TIM_TimeBaseStructure.TIM_Period = arr;     , p* s4 B: {/ b" x" k5 c' C/ c
  21.     TIM_TimeBaseStructure.TIM_Prescaler =psc;
    : Q  J6 j' T* a
  22.     TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
    + U4 {1 Q. Q1 L5 C* J* E
  23.     TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  
    - l0 S* e7 `# d( e* N
  24.     TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); , w$ w9 i, D8 ]1 _$ N! w, n; @" J

  25.   j6 f" s$ Y$ U$ e8 K2 m
  26.     TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE );
    6 v3 N/ d+ H" k9 P/ \/ C# N: j& b
  27.   /*重点*/  
    6 E( L" U8 a8 t7 [  H. m7 |
  28. TIM_TIxExternalClockConfig(TIM2,TIM_TIxExternalCLK1Source_TI1,TIM_ICPolarity_Falling,15);//设置输入滤波和边沿检测
    $ m/ u2 H1 M8 H* z# W' {
  29.     TIM_Cmd(TIM2, ENABLE);  
    $ K) c4 ~& u% |& W+ a
  30. //
    # H, E9 b, B. B* {: `, Q
  31. }) x) N- y. a! ^3 [" C; Y7 ?

  32. + i3 t4 A8 ]$ u# m
  33. void TIM3_Int_Init(u16 arr,u16 psc){- \  {  B% h% g8 y, X

  34. ' T# n: V" y' P) l
  35.     TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;2 O" }- a0 E7 ^( Q4 u. g
  36. 3 |) n; A2 A3 T/ U/ b8 _
  37.     NVIC_InitTypeDef NVIC_InitStructure;
    % W! ~3 V$ }+ x# i6 i1 S
  38. * I3 G( f. x, }2 a5 S1 T4 j
  39.                   
    7 U2 `0 x9 p, c5 h9 r

  40. ( [1 s; t+ U- b+ ~2 P
  41. * m; y" V8 z: N( F! _5 e# @
  42.     RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
    + U; n1 [6 q* }. V$ e7 m
  43.     TIM_TimeBaseStructure.TIM_Period = arr;
    $ A; i' C4 I& N4 d
  44.     TIM_TimeBaseStructure.TIM_Prescaler = psc; 2 [' }* u( i" j; H1 m" @' _. z
  45.     TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; . O3 h' I  x; Z3 A
  46.     TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  
    # e  ?/ {4 ~7 ?: L& h
  47.     TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); + V# q9 P3 D1 \; y0 {0 @0 P

  48. 1 v: Q8 p6 `# [& ~
  49. % v" q4 [) d$ c( r0 C! d( A0 w
  50.     TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE );
    ( E. c+ w" C7 \
  51.     NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;  
    $ G! x% N' y3 O/ }4 o9 F1 g4 y& ]
  52.     NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;  4 k( _0 B  u/ q* d
  53.     NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;  * J7 z# j& f: p4 E  }
  54.     NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; 8 B3 U5 h/ o5 q5 ~  ]. V: Z4 p
  55.     NVIC_Init(&NVIC_InitStructure);  1 s7 C8 E3 Z0 u& y5 _/ O6 k
  56. " N# f6 @/ r5 o9 G& s+ {2 G
  57.     TIM_Cmd(TIM3, ENABLE);               
    . `: g( V/ }9 u6 D; E
  58. }. H& d5 m% [$ s4 B3 V! }
  59.   |4 q% r  ~% U+ U$ {
  60. void TIM3_IRQHandler(void){( y& E- d. f+ f* s5 n5 @! z7 ?
  61. 1 }; H0 C+ K% \. P
  62.     if (TIM_GetITStatus(TIM3, TIM_IT_Update)!=RESET){* ?1 w5 y- ^5 O: V
  63.                         LED0=!LED0;
    2 ^  p% v5 Y2 E9 S' d" k
  64.     }+ ]0 H, m* k! s, e, s9 q
  65.     TIM_ClearITPendingBit(TIM3,TIM_IT_Update);
    4 T- ]( l. f4 p( u1 Z$ [; W4 d
  66. }% v" l; \" L' _
  67. #include "led.h"6 F8 k# |; x& u* \! V/ u0 K
  68. #include "delay.h"5 A( C/ N2 s" v4 ~( I! S6 D2 w8 S+ t
  69. #include "key.h"
    , @7 ~" n/ v7 x4 u4 q
  70. #include "sys.h"% S! P7 g5 R0 q4 e8 \
  71. #include "usart.h"3 x$ ^) a! G; i1 H- n2 L
  72. #include "timer.h": g# B! F/ ]8 v$ v5 W' n

  73. , U  O" `1 X3 B9 w0 d& C% E& |8 e
  74. int main(void)( G5 f0 a/ Z* G1 w: |; U" P
  75. {& S% D7 `$ m. S; x: U
  76.   Z) c% _; l/ e3 f6 x1 J, R
  77. delay_init(); //延时函数初始化
    ' t9 U; h$ h; Y# F: X
  78. NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
    ) l# U0 g2 e5 c' {
  79. uart_init(115200); //串口初始化为115200* t8 A. P2 l4 D, q3 w: ?; M* T2 k' l
  80. LED_Init(); //LED端口初始化! K' u! z$ y" |1 v* ]
  81. TIM3_Int_Init(4999,7199);//10Khz的计数频率,计数到5000为500ms
    % J# h8 m( I. q9 W) W$ h
  82. TIM2_Int_Init(10,0);) L. W; ?  `" t9 S
  83. & M5 a9 I$ `0 P& Q3 N
  84. & g' [: j' d7 f* F* w, L' }
  85. while(1)
    9 d2 u. o0 Z( x  L* s+ E7 Z" k
  86. {7 {. c: B* G5 _; A
  87. //LED0=!LED0;
    % D  b& U& ~8 k* z  g$ ~
  88. delay_ms(400);4 Z& g, i& t' ?, U# D
  89. printf("Count=%d\n",TIM_GetCounter(TIM2));, Y% v0 `$ \$ ~
  90. }; `. x) T4 n' F2 d& F! I. u5 k
  91. 5 G2 y1 U* `6 E/ P$ V$ f
  92. / X5 d2 J: m. t  }
  93. }
复制代码
//TIM_TIxExternalCLK1Source_TI1: 滤波后的Timer Input 1
, D3 x' h. I' {" {& j//TIM_TIxExternalCLK1Source_TI2: 滤波后Timer Input 2# l! F1 @$ Y3 i, I8 X3 o

' x# s" Y* `& @
; {7 _  R& {! H& B' J) F
这两个选项T1是CH1通道   T2经测试CH1与CH2通用0 z. B' R1 h( r7 ]
0 G- @& G% ]  c9 W5 q2 g

# J# h- |1 N" \7 n- x5 b. p. \, j大概是这个异或的原因* p- x4 D( H& }( F5 t
3.png
- M+ b' P: ^& r: B1 b6 k7 j  e
外部时钟源模式2
0 ~' B! t: T5 y" R+ ?9 @
4.png
$ j- w5 }) @+ M% P1 d' b
来自于 外部触发脚[ETR脚] 经过极性选择、分频、滤波以后的信号,经过触发输入选择器,连接到从模式控制器。当然分频和滤波不是必需的,可以根据外来信号频率高低及信号干净度来决定。
7 n5 b( N% ^; R' V! ?+ ]! G+ Y# n" O! S
8 B$ x9 \/ W& F: o( U9 \6 U
ETR功能较全可以完成T1的工作但仅限于CH1通道,可以经行分频
" }: s+ O* f+ m' K2 R! V
- m( |$ k5 M1 S7 B
' t7 i' W3 Z1 U& y7 J
相关函数
2 X% }. c# E% L3 P+ zTIM_ITRxExternalClockConfig(TIM2, TIM_TS_ITR3);% ~( ?! `! {' s3 i; G
//设置定时器工作于从模式,时钟源为其他定时器的输出分频.此时钟源无滤波
% t% v" m+ Z% w* T2 C; E% C//TIM_TS_ITR0 TIM内部触发0 TIM13 t& J$ M. _, ]$ b/ x( w: t  g
//TIM_TS_ITR1 TIM内部触发1 TIM2
' o9 ]( i. j& [- S3 P- j//TIM_TS_ITR2 TIM内部触发2 TIM3) j8 j0 \1 R& k8 g" K
//TIM_TS_ITR3 TIM内部触发3 TIM4/ ~% p4 m; W+ m. t+ }1 T  W* E0 h. _

# \. p, \9 o0 T+ T8 ]) |

% w1 Y: q4 I/ S5 P7 s7 |$ } TIM_TS_TI1F_ED0 H  t$ i5 a* v; b- _8 `4 K* k, ^" ~: z: |
TIM_TS_TI1FP1* b9 U4 I% R/ m
TIM_TS_TI2FP2  l$ [0 a" G% x4 M
TIM_TS_ETRF# _- M& m& V* a% x8 y# ^3 a
5.png

5 s9 q3 c- }. I9 I/ S
6.png
& K# n! j8 i8 n) {
TIM_ETRClockMode2Config(TIM2, TIM_ExtTRGPSC_DIV2,TIM_ExtTRGPolarity_NonInverted, 0x0);- b* D, I) S' [2 Q7 {# f& H
//外部时钟模式1.需要设置预分频,以及外部触发极性:滤波
/ N+ `8 ?" H3 o//TIM_ExtTRGPolarity_Inverted TIM外部触发极性翻转: 低电平或下降沿有效 //TIM_ExtTRGPolarity_NonInverted TIM外部触发极性非翻转:高电平或上升沿有效
$ l; ~  c- n) h7 j/ \& T. l, H& k" c# V3 P" x4 c, H
. {2 F* e, b! b) H8 K
代码示例
9 o0 U/ O9 n8 a0 u$ u) n由第一个示例更改,功能一致main不变4 x& o8 A4 Z! _7 s+ D
, Q+ B* C$ ^4 k: P8 x
  1. void TIM2_Int_Init( u16 arr,u16 psc ){$ J0 x: v/ [0 D

  2. $ A* P' R  U( _
  3.     TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;" w9 _1 _7 _  u  \( B: ?! _3 }
  4.     NVIC_InitTypeDef NVIC_InitStructure;
    , G" l. h7 T# s2 m0 a" n8 E
  5.         GPIO_InitTypeDef  GPIO_InitStructure;/ w3 l: p/ [* c
  6.      RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
    0 Y2 t  p; e/ E: u7 N9 ~
  7.     RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
    2 {) x# ^' ^5 Q
  8.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;               8 l+ Y1 O6 b% `5 r  H- A- m3 j
  9.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;            ; C$ d4 H- f% B7 n$ f+ m& E
  10.     GPIO_Init(GPIOA, &GPIO_InitStructure);     
    # @- I$ l; Q9 Y8 c8 d
  11.     ! Y: O2 d( ]7 j4 u7 p
  12.         TIM_DeInit(TIM2);+ Z- ^6 B( M6 E% D% K% M
  13.     TIM_TimeBaseStructure.TIM_Period = arr;     & D# j/ {! ~% b: V- B
  14.     TIM_TimeBaseStructure.TIM_Prescaler =psc;
    ) s* ?/ W. _6 R8 G
  15.     TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; , ~- M3 t0 h  G$ S( n
  16.     TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  
      Z6 O. y; q; r7 w, L$ N5 j
  17.     TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); ; ~9 x' S' X$ ?. R6 E  m; B' U1 F

  18. , `5 r/ F2 ?: f8 \
  19.     TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE );
    6 D7 O* r+ n/ z' W7 K# _7 V
  20. - I* L% K+ C2 Y$ h2 G' q+ {
  21. /*重点*/# e5 m% U' z0 Q9 o) q* k# a
  22.         TIM_ITRxExternalClockConfig(TIM2,TIM_TS_ITR3);//高级定时器开启
    5 G9 q$ B1 N7 D
  23.     TIM_ETRClockMode2Config(TIM2,TIM_ExtTRGPSC_OFF,TIM_ExtTRGPolarity_NonInverted,0)//配置外部时钟2的模式;4 \# R; m) m' A* R" u+ m
  24.     TIM_SetCounter( TIM2,0 );
    + Q/ \! V) a4 o5 b0 |: M
  25. /
    ' r. }3 L$ @9 s9 h
  26. ) T, J/ p2 K6 k$ N, S7 }
  27.     TIM_Cmd(TIM2, ENABLE);  # ]" O/ X# J1 c' e

  28. * ?/ m) R4 L4 E( _
  29. }
    2 A4 D8 e% T1 {8 V* u9 u
  30. void TIM2_IRQHandler(void){   
    6 [1 b6 F* Y) l9 n0 L
  31. ( t* B/ {& A; ~1 W
  32.     if (TIM_GetITStatus(TIM2, TIM_IT_Update)!= RESET){
    & T9 J! D1 J; i3 O: O0 y

  33.   W' N% S- U# h; J
  34.     }
    4 E6 X  n5 n( K% H4 z* `: `8 o% Z
  35.     TIM_ClearITPendingBit(TIM2,TIM_IT_Update);   
    " y) s, g3 l  V6 m: v( T
  36. }
复制代码
; l% H8 E/ e/ f/ B9 I

' b" m* p. @$ w7 X7 O
收藏 评论0 发布时间:2021-6-4 10:11

举报

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