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

【经验分享】STM32F2XX之RCC配置

[复制链接]
STMCU小助手 发布时间:2021-12-1 22:23
一、系统时钟配置
4 h5 q' p! z/ A/ V: t/ W3 P9 N. S$ q- f
STM32有多个时钟源,分别是HSI,HSE,LSE,LSI。
% h7 ~( l: r- B+ |, K' w$ h* w4 N1 `( d7 k
HSI振荡器时钟:
3 t+ Z3 ^2 I! v6 e/ B; ^; D& B; D% w& X/ {: P. V
系统上电默认时钟,内部振荡器8MHZ,可以直接作为系统时钟或在2分频后作为PLL的输入。时钟频率精度较差。
+ d9 o. l& X: ]  h
0 D: A# F" Q  THSE振荡器时钟外部:
$ L. X2 m: r- [4 U  a, o" W0 F( n5 W
提供非常精确的主时钟,STM32F1系列的板上为8MHZ,STM32F2系列的板上为25MHZ晶振。经过PLL倍频:作为系统时钟。: ?, S  X! O+ q; E# e# d

) b2 H/ s' O8 [PLL时钟源输入可以是HSI时钟的二分之一,或者HSE时钟。
8 ?( S: M- k; L) c  s& k! A" d9 U1 n5 t/ B0 u# J% y. n7 i
LSE时钟:
8 U  M- G+ b3 f) n4 e  s7 v* @8 U! J1 [( v, S3 W4 ~
LSE晶体是一个32.867k的低速外部晶体。提供实时时钟。一般专门用于RTC,等到RTC模块时再使用。
$ _6 j7 F5 t1 }2 [, w: O% `/ {, T- Z6 u
LSI时钟(Internal内部):
/ r+ L! {. E- t: y5 x( I+ @6 x: z1 C. G9 r+ Y4 q
LSI的RC担当一个低功耗时钟源的角色,它可以在停机和待机模式下保存运行。为独立看门狗和自动唤醒单元提供时钟。LSI时钟频率大约40KHZ。一般用于IWDGCLK。
0 d8 ]. T3 _, j) i0 [8 h2 u: _, S/ v6 ^; P
通常的时钟选择为HSE配合PLL使其工作在72MHZ(STM32F1系列)或者120MHZ(STM32F2系列)。
" L* C# }# n- c6 V4 _
, z# v; Z$ Q; H! l+ j" t3 W
1336782557_3471.jpg

4 `9 W2 x4 N2 W. u9 w# Z! \2 {/ x& y0 W( R
STM32F1xx系列
: w7 e6 _' @$ a) |

6 G1 D5 e0 k& l- p1 M  l; [
1336782592_5508.png

0 |9 |6 b7 D9 q
% q9 H% G* t* U- b- _
STM32F2XX系列

  a. l2 E& ^; i' w; ]) g) E# F6 T. u6 J1 I0 R
RCC_DeInit()同SystemInit()的区别仅仅在于SystemInit()多一个SetSysClock()。SystemInit()包含了整个内部时钟到外部时钟的配置,但配置的频率不可调,如需调整频率,可以自己用RCC_DeInit()再配合其他操作进行。. |9 j% ^0 P/ ]; K6 F/ F* u

  M1 y7 C+ G; V( ~9 e* d配置时钟流程:

( W* a2 @$ x! m: \$ R
- t# s/ u2 M4 @6 @( t7 D' Q1.将RCC寄存器重新设置为默认值         RCC_DeInit;) O! c& P9 _% `& ?6 q! d0 I

1 a" F9 H( c; n; O% T- G2.打开外部高速时钟晶振HSE                 RCC_HSEConfig(RCC_HSE_ON);7 A3 _4 C' N* _

- N, F, x% N( u8 y* T  r3.等待外部高速时钟晶振工作          HSEStartUpStatus =RCC_WaitForHSEStartUp();( j, @5 W8 g; [: u" A. g: r. i

* p7 ?# ^" p2 W1 R6 ]4.设置AHB时钟                              RCC_HCLKConfig;- B& l" G4 W8 A7 q% D! c# d* n
( @1 k# m) {  W7 P$ Z! s
5.设置高速APB2时钟                     RCC_PCLK2Config;
6 w1 ]6 D  E# h, v1 M/ B6 ?& h# X8 P
6.设置低速速APB1时钟                  RCC_PCLK1Config/ s1 w  J+ e( i" I' T: ^
' i$ K/ ?  t! w* |( Y& e
7.设置PLL                                       RCC_PLLConfig;
* x# f  B5 }5 s* c& K8 n4 W- f- M6 F! n2 M% c2 l* _; |0 n
8.打开PLL                                       RCC_PLLCmd(ENABLE);" F4 y5 N  f- |4 i

9 b  G2 |4 H5 X6 k- c& s# G2 ]9.等待PLL工作                 while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);
& B6 b5 Q8 X" d& U$ f* Y6 E! p$ u, J
9 [+ x- U5 B' c" o$ I10.设置系统时钟                              RCC_SYSCLKConfig;
# }8 j( l# d1 R7 e- H/ ?& y( w7 Q7 L7 C0 R
11.判断是否PLL是系统时钟            while(RCC_GetSYSCLKSource() != 0x08);
4 x  w/ O0 E7 Z; w& L  y4 l2 W. u; A
12.打开要使用的外设时钟
  1. RCC_APB2PeriphClockCmd()/RCC_APB1PeriphClockCmd();
    ) g2 L1 b! V' q! ]. V$ Q: N
  2. # I/ A6 T: n- T2 R  f: o4 K
  3. /*******************************************************************************9 Q4 ?5 T) ^1 s, Y! |& R6 @
  4. 9 A3 P) s& c' r8 C  z& q  Z; i
  5. * Function Name : RCC_Configuration
    3 ?0 @9 T& n5 k* j! y+ w3 x
  6. 8 J! h0 `+ T3 t- K* K; [2 [& |
  7. * Description   : Configures the different system clocks.
    ) J. Q1 T* S: h$ d
  8. 8 [( Y+ |+ H7 _9 y9 ~) Z9 L4 ?. {
  9. * Input         : None4 n3 S. q, f, e9 [, w3 r

  10. 0 x9 d- J# _1 W9 |9 [
  11. * Output        : None
    5 W* R& {8 l  i+ d& B$ c; b

  12. 7 r- M( Z% q: r& _
  13. * Return        : None
    ) ^1 n1 J7 r* E
  14. ! b3 h! Q0 \% c4 P; M( v! R
  15. *******************************************************************************/
    5 G# X7 i$ ]# `

  16. & \4 `9 R% Y9 G4 A% _
  17. void RCC_Configuration(void)
    4 t" U+ c/ L# x+ g' X8 g
  18. : H! c7 \) g" E  W" }
  19. {2 d" n5 \7 q( K/ d# d
  20.   i/ S8 P. D4 _. h5 c- i" Y/ o3 b
  21.   /* RCC system reset(for debug purpose) */
    4 |5 w  G' q, F7 ]/ f' c" N: u

  22. ; f- O, u( }2 q! v
  23.   RCC_DeInit();
    1 M6 X' t2 @) M

  24. + B% \7 y' B: q, I, @- L3 E9 d3 `: J
  25. 7 K: [1 I' S' q
  26. " R; B1 c$ q2 i+ u. ~/ ?
  27.   /* Enable HSE */; z9 @+ N" t/ ~$ H" _, S' u6 \

  28. 3 W, k. G# F( r. d! v
  29.   RCC_HSEConfig(RCC_HSE_ON);/ b" N: h" @6 p* y
  30. 7 `% h* ^" F: M/ {; k% O: s8 Q) V. O( a7 U
  31. 8 `- J+ t: H7 Z: O/ e

  32. , \7 \2 Y6 Z" ]" ^! e7 X" P
  33.   /* Wait till HSE is ready */
    : u. _1 n  ^1 X# m
  34. 5 W: l# h8 F! X5 d+ H/ k/ b' {1 M6 d
  35.   HSEStartUpStatus = RCC_WaitForHSEStartUp();
    ! H( U$ N+ @1 c8 w0 x$ Y
  36. ; y$ N& y. `3 E% s
  37. 7 b9 }5 W9 ^4 ~' F# a# S; h

  38. 5 Q6 ~2 {1 V2 X$ E0 \- G
  39.   if(HSEStartUpStatus == SUCCESS)
    7 Y4 I! J0 o' q7 k6 v

  40.   v/ M0 e4 L6 p. |# H9 U
  41.   {9 H( c8 o- I' d- R
  42. 0 v7 j% T; @: G- m$ s! o8 c$ o
  43.     /* Enable Prefetch Buffer */  c* }! O1 I9 b# s2 i
  44. * _+ w) h& G: u5 w. G: i3 ?  w
  45.     FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);
    8 `# {6 e+ I, D" `' [8 y

  46. 9 R/ f# |/ S/ m: E% O# v5 P

  47. 5 Z/ M/ t" t  ]* U! Z6 j

  48. 8 W6 O( F5 `/ }+ U: c) D8 z
  49.     /* HCLK = SYSCLK */
    ( {- ?6 r( F7 e0 g+ s
  50. * U! H! {3 O7 j7 v4 P5 i
  51.     RCC_HCLKConfig(RCC_SYSCLK_Div1);9 F- L) m2 X- p' O

  52. , X" X7 h% s# x

  53. ' b" z5 E' ]$ Z( \

  54. " ?3 Q! l+ ]7 s5 F
  55.     /* PCLK2 = HCLK */
      `9 r& z) r- }5 x# Z' g
  56. 5 a, C9 q2 F* C5 x0 Q
  57.     RCC_PCLK2Config(RCC_HCLK_Div1);
    ( E5 b- Y" v( t
  58. / F8 t+ T) C2 U* W& h- r1 p

  59. ( d' Q8 ]8 ]4 R( ~8 H5 g$ W

  60. 9 p# ?3 w" k! ?$ s
  61.     /* PCLK1 = HCLK */
    ! s4 Y8 F0 I& ?+ h

  62. 5 p+ m8 f; U9 P: L, Q
  63.     RCC_PCLK1Config(RCC_HCLK_Div1);
    9 w( U* ]- E, i' v+ ]6 x
  64. , K0 [7 R5 T; A- c6 Y& P  b2 K
  65. 8 ?, ]8 g9 L$ a+ C' N, ?  L9 Y& q, P! Q# ?

  66. ! G* [% L; p: O2 q; U- x
  67.     /* Select HSE as system clock source */( G; ^! z% n9 o7 |. \0 x+ E, V

  68. 2 f) [9 b$ j3 h: a
  69.     RCC_SYSCLKConfig(RCC_SYSCLKSource_HSE);# l8 \0 c. d6 n, R( J8 x3 Y

  70. ' R+ b. D8 u  b/ U

  71. 9 @* v6 j8 {! r% Y8 W, G0 I/ a, }

  72. : M5 n6 r3 E+ L. n0 a6 K
  73.     /* Wait till HSE is used as system clock source */
    - A/ n/ _# D' a/ i

  74. 0 y% c) _3 p5 m# r5 W% e% `0 d
  75.     while(RCC_GetSYSCLKSource() != 0x04)
    ; D2 w1 b% \8 x$ u* \

  76. 5 {: ~5 \' T5 Z4 H
  77.     {
    / ?/ q7 n5 Z8 a) j% M  C. W+ a- \! C

  78. ; K) R5 A9 p3 @4 O3 b
  79.     }
    . `# Z: r/ H" P# a7 {

  80. 6 o! y- C$ x- h/ C# v; u; h) R
  81.   }
      x, z# U+ d* t0 l; \# J

  82. + @' a, F  R: _0 Y) B# l
  83. XXXXXXXX;    //分别为其他外设的时钟配置。  k/ k; n9 J' _7 S% \) @

  84.   V4 D1 A5 z! Y9 s' ?
  85. XXXXXXXX;( }( L, I3 b! r. @: O
  86.   K" h% L4 m9 L1 u3 I" e, t8 K0 {

  87. & l/ Q' D4 o6 Z  z  s2 D
  88. 7 w* e1 G8 g; D3 M* a' r$ X
  89. XXXXXXXX;: a; J: j9 R  T7 I6 `

  90. ! t. A5 g* T2 h+ h: Q
  91. }5 S+ e0 L- s. k. H3 Q
复制代码
  \; O0 H/ t5 T# M+ I
& L2 }. m6 m4 n( y! n( K
二、关于PLL设置4 u# e3 \4 {9 T  ?1 _4 S" F: O

! }/ s$ C( }' M- L$ WPLL的设置主要通过函数:void RCC_PLLConfig(uint32_t RCC_PLLSource, uint32_t PLLM, uint32_t PLLN, uint32_t PLLP, uint32_t PLLQ, uint32_t PLLR)来实现。" t8 I5 e' S, x! i4 k8 @' Z

9 U! y! p& |  k# }; B5 }5 _主要讲一下PLL值的设置与各部分时钟的关系。函数中涉及到6个量的设置,第一个为内部时钟或者外部时钟选择,后面几个为PLL值的设置。- J* l+ e. _) V5 F3 E

! U# z- d6 C/ x! d6 c8 U, xl  RCC_PLLSource选择:
! w: _0 M& p7 b; e5 v
3 K) G* F: q8 @* q8 gRCC_PLLSource_HIS:HIS内部时钟选定,频率为16MHZ
# g  o! T: B4 f! m3 s7 E2 a) u$ n9 R. C5 o3 M- d
RCC_PLLSource_HSE:HSE外部时钟选定,频率可自选,4MHZ-26MHZ之间,系统默认25MHZ,如需改变,则对stm32f2xx.h中第70行的
( A7 Z( Z& g  f5 c- N9 O0 F7 Q$ T+ y+ O* O
#define HSE_VALUE    ((uint32_t)25000000) /*!< Value of the External oscillator in Hz */. w" w) A7 q( n% R3 R* R

3 m' F" Z4 Q9 W; h9 G0 Z进行修改,改成外部晶振的值。
: c. ~% T/ S+ C0 l2 Y1 }& R. w$ Z8 d- q# P
l  通过选择PLLM和PLLN,来计算得到PLLVCO,计算公式如下:1 p+ o" ~* M- c
! h: S: O: n2 t- w" m. ?: X
PLLVCO = (HSE_VALUE / PLL_M) * PLL_N。) u3 ?2 m/ A  ~

9 s4 m- _. f5 i% lPLL_M可取0-63,PLL_N可取192-432。& V' }" M) ~' e0 I2 `. i
3 y6 H" h2 g0 J3 ?
l  通过选择PLLP来选择分频数,以得到系统时钟。计算公式如下:/ C8 h# k: H: I& q# ~
% V' e$ B% W) o; ]
SYSCLK = PLLVCO / PLL_P,切记不要超过120MHZ最大频率。
! q9 Y3 R; P; j7 m# c4 w: i6 E. Z1 m+ l. B5 k
PLLP可选范围为2,4,6,8。' r2 p8 X  C/ C/ \, X
1 H9 T  C3 c' n& ~/ M- \5 ~
l  通过选择PLLQ来OTGFS, SDIO和RNG的时钟。计算公式如下:
. H; E- I, v( m4 o9 C" {6 D$ t% E% q! q5 g4 }4 u/ }* a
Clock =  PLLVCO / PLLQ,不能超过48MHZ。, ^% d, R! s$ g7 L

5 C: x; x% i7 _! ?# h, h: Y6 BPLL_Q可取4-15。, X1 ~, f% R7 N

5 O8 f8 Z+ _* al  通过选择PLLR来决定I2S的时钟。计算公式如下:6 C$ c7 x. |7 s4 z" R' p

6 R) u$ E/ r2 x( w/ Z3 YI2SCLK =  PLLVCO / PLLR。
! o3 T6 ~+ B& F; x+ ]2 M$ r2 f' Z) e( P2 y; l
PLL_R可取2-7。
6 N& v$ H4 P0 S* O6 y/ u6 x
) S# y+ Y) H; G) G: d! u
$ o; l; L' a$ f: w8 r1 _4 _! R/ s
收藏 评论0 发布时间:2021-12-1 22:23

举报

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