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

【经验分享】STM32F2XX之RCC配置

[复制链接]
STMCU小助手 发布时间:2021-12-1 22:23
一、系统时钟配置3 e3 \/ }: L" Z- y

4 k! [% U7 z) v6 l( n! l  GSTM32有多个时钟源,分别是HSI,HSE,LSE,LSI。. r: u* i8 X9 t5 Y+ t$ M6 Y
# G3 Z+ Q* A: ]1 m2 v2 r# w0 D
HSI振荡器时钟:% E# X% z9 S3 m  S, h' Y. f

" t9 R; v3 o, g6 m, N系统上电默认时钟,内部振荡器8MHZ,可以直接作为系统时钟或在2分频后作为PLL的输入。时钟频率精度较差。
0 m: `# r& `9 y/ G6 I. G0 `! p; b+ r2 K* Y
HSE振荡器时钟外部:
4 k: |4 }& C: S+ J; N
$ ~' w  y; w  J6 C提供非常精确的主时钟,STM32F1系列的板上为8MHZ,STM32F2系列的板上为25MHZ晶振。经过PLL倍频:作为系统时钟。
1 S4 i0 z3 H9 A% k" \/ M& O* g' B% b7 W
PLL时钟源输入可以是HSI时钟的二分之一,或者HSE时钟。
7 E* |0 h, o- M4 S& K" G. P" O' T, m% l1 z1 b- i
LSE时钟:' ?3 ~( a; v; y$ q' D3 q& w  A

+ Z% @7 `# x. w" ?LSE晶体是一个32.867k的低速外部晶体。提供实时时钟。一般专门用于RTC,等到RTC模块时再使用。
  t1 y% H( t/ i( A% l6 x0 V/ n: v0 a
LSI时钟(Internal内部):3 A. n$ n( }# J" t- `
5 y& V) _4 I7 u
LSI的RC担当一个低功耗时钟源的角色,它可以在停机和待机模式下保存运行。为独立看门狗和自动唤醒单元提供时钟。LSI时钟频率大约40KHZ。一般用于IWDGCLK。
& P: P  G' M! X  G/ V- y6 u5 {- i* l2 M& J  T
通常的时钟选择为HSE配合PLL使其工作在72MHZ(STM32F1系列)或者120MHZ(STM32F2系列)。
3 i; M" M4 z) [9 ~1 A6 @, ]# G7 a6 c. g- E3 N$ Q
1336782557_3471.jpg
7 r! L7 U2 }8 R6 u" D+ D0 O
8 M* d- @3 f6 ]
STM32F1xx系列

8 v+ C9 s. P, V7 A) W
: I: `3 J* |* _
1336782592_5508.png

0 j; z9 {4 O5 |  h/ M: n7 G
; E* _6 E6 ?  b1 T
STM32F2XX系列

- H: K7 j7 p- ^) y7 f7 p: L. [# Q" Z% |" t
RCC_DeInit()同SystemInit()的区别仅仅在于SystemInit()多一个SetSysClock()。SystemInit()包含了整个内部时钟到外部时钟的配置,但配置的频率不可调,如需调整频率,可以自己用RCC_DeInit()再配合其他操作进行。
- o+ _6 f) ^! m% {8 U: f, {
/ U+ B: s2 E* G9 l, R- H配置时钟流程:

% s) N" Q! Y9 o# u( T7 F- |/ M! z2 y8 ^! @4 |5 U4 M5 O  M
1.将RCC寄存器重新设置为默认值         RCC_DeInit;' N( i+ \9 x! N  _9 g; X. f
+ R6 ^; Y) v! T. {
2.打开外部高速时钟晶振HSE                 RCC_HSEConfig(RCC_HSE_ON);
, t* M  H4 r- o2 @0 X. `, r* M4 v2 `% q/ @2 N* }
3.等待外部高速时钟晶振工作          HSEStartUpStatus =RCC_WaitForHSEStartUp();
4 `! |8 b5 o2 ]7 Y3 l
- g; _9 Z) s2 M; Q1 a; @$ E4.设置AHB时钟                              RCC_HCLKConfig;
$ ?! t- U0 f* a( X6 H
' E8 v% W* a+ `# ]% ]- H% ~5.设置高速APB2时钟                     RCC_PCLK2Config;% Y8 V4 b8 F6 z& n

6 ~2 D- x5 z0 l( |7 w6 |; M% v6.设置低速速APB1时钟                  RCC_PCLK1Config
5 s' B- V$ o/ D0 G# w7 V4 U9 }( s8 Z" l5 Q/ N6 k" Z
7.设置PLL                                       RCC_PLLConfig;
7 ?+ R5 W& C0 C! x/ D# n  x( B) D2 {4 w
8.打开PLL                                       RCC_PLLCmd(ENABLE);
$ ]9 j- i* N8 F$ Q1 V& W. D  o0 s% z3 w8 ]; T
9.等待PLL工作                 while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);4 ?7 N5 R2 r# ?" ~" q/ _0 \
- m3 B  N- h1 ^3 b  r$ S
10.设置系统时钟                              RCC_SYSCLKConfig;4 U9 l8 w) v6 U

: K7 }' D' A6 {3 P11.判断是否PLL是系统时钟            while(RCC_GetSYSCLKSource() != 0x08);" k) X* Z" ?4 t* c" n4 I8 l9 Z% {! N

  N: X. K7 J8 H& R" c% v12.打开要使用的外设时钟
  1. RCC_APB2PeriphClockCmd()/RCC_APB1PeriphClockCmd();
    + K5 I  N3 f7 h: B+ M

  2. ( m( r' l# l+ _% l
  3. /*******************************************************************************
    ) x& o8 j1 U# _0 w; k0 @9 i
  4. & f* ]5 n/ R  ~/ u: D* C. m4 d( H1 I
  5. * Function Name : RCC_Configuration
    ( P7 Q2 L8 |, Z

  6. 5 H+ i1 Y; ~% Q/ y, `3 h! R* F
  7. * Description   : Configures the different system clocks.
    7 V, m0 C9 A) ~0 Q+ B

  8. 6 ?- E2 g! w# ~; q
  9. * Input         : None, S6 _7 A" ~" `, y% Y1 D" e# D: Y

  10. - d) F4 J8 Q/ v2 N/ J
  11. * Output        : None
    0 A; l- D3 t4 C" k! ?5 j; `/ E5 v

  12. * o1 U- L9 R* |, J" f
  13. * Return        : None
    5 ?. m" k& B+ N4 ]! W
  14. / I6 \0 }5 l$ J5 O( L7 S
  15. *******************************************************************************/
    - y' w( }  k4 b( s5 I. ?& N7 L

  16. 6 a% I& a0 T0 t6 b0 q2 I1 A
  17. void RCC_Configuration(void)
    2 Q- z: [0 W1 \

  18. ! |+ p6 d$ z1 j+ ]- U, n
  19. {7 |0 g' t' M7 o0 T. F
  20. ( G5 q! G5 j4 |' V4 C
  21.   /* RCC system reset(for debug purpose) */6 D  x/ x8 T- {9 C; q& C
  22. * G0 o4 \3 S6 \( E* f
  23.   RCC_DeInit();
    4 X; h2 C5 \- E2 G
  24. 1 T" X  o, B' v: P; S+ @/ c

  25. 5 ^( `; O" d( q/ C% @/ ^1 o# C
  26. / j' W; T1 b! s6 N) f! h
  27.   /* Enable HSE */% g, S1 t; f' |! Z5 V( e, @
  28. " g8 W) ]( A4 l  Z, g
  29.   RCC_HSEConfig(RCC_HSE_ON);
    2 o3 H* ?) d; @- t' L' B
  30. / g' V4 r. @( Z" M
  31. 3 ^6 `* x% V1 y* x; y$ o2 Q
  32. ! V1 q6 m& }+ l# b% A' ], f) B
  33.   /* Wait till HSE is ready */& P' E0 ]0 y* A; P

  34. / z$ Y: D0 A* {) `7 W
  35.   HSEStartUpStatus = RCC_WaitForHSEStartUp();5 L9 J2 F& x; \; g, U$ _
  36. 4 W/ N% n" @4 b  q/ j, P, V

  37. ( O8 H( N( M8 U( ^
  38. / U5 }: \0 P3 p3 r" ?! g' ?
  39.   if(HSEStartUpStatus == SUCCESS)
    & u  L5 L2 R$ v
  40. 8 o0 R/ n, H; q
  41.   {( J  @7 h0 A  q$ b

  42. 8 y5 m; M# I. D2 d9 V+ d
  43.     /* Enable Prefetch Buffer */
    6 `: Z  m0 i6 l# P5 s% f  ?$ X

  44. % x. X) x: G" C1 ^( A6 a& I8 \
  45.     FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);
    : l' s4 \2 r2 d, a; h. u
  46. 5 a7 f: y/ j0 g/ g

  47. + l7 [; ~. b& D

  48. 9 I/ p: V& l) }
  49.     /* HCLK = SYSCLK */
    # V4 S' _7 m- I  A

  50. 6 }5 C8 b* Y1 @  n1 y
  51.     RCC_HCLKConfig(RCC_SYSCLK_Div1);
    2 t: k7 }2 L6 D/ M  _9 e2 B2 p
  52. / I1 j) z/ x, w, y
  53. 5 A) W+ y6 i' V2 D
  54. ' k8 I, ^% w7 R3 ]
  55.     /* PCLK2 = HCLK */
    , O% N8 [& \+ l7 r; l; b
  56. . R) r/ r) A8 M
  57.     RCC_PCLK2Config(RCC_HCLK_Div1);0 r7 Z4 o, }# r, C' R* Z
  58. : L" H  W7 A. v- K

  59. + z  s5 u# z, |2 @" p. h8 f

  60. 5 O* e  V5 v5 B- K* n6 C9 }2 ?
  61.     /* PCLK1 = HCLK */) D/ K3 T8 m5 }9 r) q

  62. 1 ~6 t; ~  C8 |  {* Z% A/ h* I' h+ j
  63.     RCC_PCLK1Config(RCC_HCLK_Div1);
    ! \! E. c8 x* \( Q

  64. / M' \; X, f- l8 v5 V$ U

  65. ; W- x" h" E. F8 s* [6 n

  66. ( N1 H5 ]. o- c
  67.     /* Select HSE as system clock source */; v- o* O# ^( A- B0 i: m; a

  68. 3 R; V7 b, [) S. l) h9 ^1 e- ^$ _
  69.     RCC_SYSCLKConfig(RCC_SYSCLKSource_HSE);2 s# l7 k2 j8 }# \% T
  70. + O) x$ R+ C1 [5 C4 a

  71. # J. W* X! ~+ ]. h, A1 j& B

  72. 1 T  C3 r! K8 j* |: D6 l2 u( g
  73.     /* Wait till HSE is used as system clock source */1 H# p5 Z* J( |% Z0 z  c0 D
  74. * @& ~, u9 v2 c' f  r
  75.     while(RCC_GetSYSCLKSource() != 0x04). A8 }* f0 U6 F/ q, L
  76. 4 f; K* D! Z/ P4 k; v# l
  77.     {7 o' ^) L  @0 X5 W% `$ l: W
  78. % M8 \0 R% _, X. `
  79.     }* ]9 Y! _3 }" G

  80. 9 ~  h: K; t1 ?: l
  81.   }% _( ]7 d, g: F" c( J, R, l

  82. ' R3 q8 t, R8 v. n  j
  83. XXXXXXXX;    //分别为其他外设的时钟配置。! b4 c$ W# E! p- n8 d
  84. - Y0 \! E4 r4 g; `! A
  85. XXXXXXXX;; Y% F( W( t  ^! t

  86. : M/ b8 r* R0 ^: Z* c% o/ B/ Y8 L
  87. ' K0 K, O6 [9 p5 j
  88. % D: U1 e2 Y' k5 ?
  89. XXXXXXXX;
    . i7 j" a# v: }& E/ l6 E5 h  j2 S

  90. , D$ A, @% b# t
  91. }$ e/ K$ Z# y* d) g7 q; q
复制代码
& k9 w2 D" P: o8 r: \  v

7 s* P" @) m' ~& V2 u, _4 {# U2 M二、关于PLL设置' x- M+ }5 j: y  }! Z3 o6 C3 \& B
0 B" ?8 D( A' w+ W" V
PLL的设置主要通过函数:void RCC_PLLConfig(uint32_t RCC_PLLSource, uint32_t PLLM, uint32_t PLLN, uint32_t PLLP, uint32_t PLLQ, uint32_t PLLR)来实现。3 F! P) H7 {" l

: x* c' {7 G. l/ ?/ l* `主要讲一下PLL值的设置与各部分时钟的关系。函数中涉及到6个量的设置,第一个为内部时钟或者外部时钟选择,后面几个为PLL值的设置。/ u) q, ~$ o* [+ Q

% {; W: g4 w) {8 E2 m+ vl  RCC_PLLSource选择:1 W' i& [( E' D% \) t
) e8 }1 ]' ^$ z1 f4 A
RCC_PLLSource_HIS:HIS内部时钟选定,频率为16MHZ- m* d! M6 y# E# k2 D9 v' ~
) P; N% d3 p6 e, n* _/ ?9 |( |# q2 S
RCC_PLLSource_HSE:HSE外部时钟选定,频率可自选,4MHZ-26MHZ之间,系统默认25MHZ,如需改变,则对stm32f2xx.h中第70行的9 Q9 Q: W( \" d4 T3 Y
6 l! Z& o9 f1 F2 @
#define HSE_VALUE    ((uint32_t)25000000) /*!< Value of the External oscillator in Hz *// x# J( F; _7 y  p- V- C

$ r. d0 U7 `: X( q$ {7 I4 h进行修改,改成外部晶振的值。! ]$ f5 Z  y/ F# ?. i
9 o- j; N% ~9 L
l  通过选择PLLM和PLLN,来计算得到PLLVCO,计算公式如下:& {( f6 p: k' w4 I% d7 j/ S
, c# i) b4 f% F6 \$ a' v
PLLVCO = (HSE_VALUE / PLL_M) * PLL_N。
& e3 H& q. i# ]6 m, h
0 b( \, K$ w$ o5 uPLL_M可取0-63,PLL_N可取192-432。
' Y  U1 G/ O6 [- }  K" g% A6 v  ]) C) a4 S/ d, i2 \
l  通过选择PLLP来选择分频数,以得到系统时钟。计算公式如下:
( v) i& }! Y4 K2 e% S* [% M/ f2 z7 [7 t+ O! W* [
SYSCLK = PLLVCO / PLL_P,切记不要超过120MHZ最大频率。5 M( x3 m5 a5 d. v: I* T) D
% p8 J" O  u" E% m  \0 Y  b( e
PLLP可选范围为2,4,6,8。
6 x1 i3 q8 ~6 P/ g
  K1 f9 Y! w% `: f# Ul  通过选择PLLQ来OTGFS, SDIO和RNG的时钟。计算公式如下:
1 M: l- K5 D: C, d. B  }4 F2 l: j5 q7 t, t( A  E
Clock =  PLLVCO / PLLQ,不能超过48MHZ。
/ U* p" J6 z9 G& b) L
  [  ^! W/ U% G/ yPLL_Q可取4-15。
! H9 U3 N8 G) m6 D2 i1 V$ K2 G* t4 h& p. A, U( b6 N
l  通过选择PLLR来决定I2S的时钟。计算公式如下:
; F# L( |1 F/ w7 f. e# M3 L0 K- C: M! P
4 L/ f6 B2 I. n# H7 u9 n6 QI2SCLK =  PLLVCO / PLLR。4 }' f( a2 T9 V
$ H* y1 l! d, L. J/ f5 E8 N
PLL_R可取2-7。. h3 {9 t! T! j4 n+ c/ u+ \
6 h) b9 A6 F( V8 ]& U; T9 T
( r" \- D0 @0 ~" p1 _0 }- r
% h8 W; k& R& }7 f. k
收藏 评论0 发布时间:2021-12-1 22:23

举报

0个回答
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版