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

STM32心得:SYSTEMInit初始化函数解读

[复制链接]
STMCU小助手 发布时间:2022-11-20 15:40
之前初学STM32开发板的时候,也写了几篇关于时钟系统配置的文章文章一和文章二,最近又仔细回顾了官方给的SystemInit ()函数,对其做了更好的解读。所谓读书百遍其义自见。, E, b: x) P9 z( [

* x3 z! X, K& w2 B! |/ [! [主要的函数:void SystemInit (void)$ Y# Y2 }2 o0 m( j" M2 I4 k
包含的函数:static void SetSysClock(void);static void SetSysClockTo72(void); O9 ]0 {/ J& ~8 ~5 y

* w+ T4 W5 L, [# {& r
  1. /**
    5 K) I9 p2 g9 |7 N( X' A
  2. ********************************  STM32F10x  *******************************************************
    4 n# H1 o) d- V: T" R7 f
  3. * @文件名称: systeminit.c解读版
    # P# U. Z9 M" ^- E8 f1 \
  4. * @作者名称: 闲人Ne7 F. G1 k  @7 c/ A' J
  5. * @库版本号: V3.5.0
    ; I! N0 l5 g$ B
  6. * @工程版本: V1.0.0) r5 D5 B& W$ y! r3 \8 X* `
  7. * @开发日期: 2020年12月15日5 D4 k# Z' K8 `, e* h, F
  8. * @摘要简述: 本文件源于system_stm32f10x.c文件里的部分函数,不做任何修改,单独拿出来只为对其做详细解读。
    0 P' B8 G: }& p" w. u
  9. ****************************************************************************************************/
      n, S& B$ J- m) w0 O: l
  10. /************************************************************************************************
    " Y* y* B5 t% s$ p! K8 Y
  11. 函数名称:SystemInit ()
    * L+ Z6 r: P" |1 C
  12. 函数功能:系统初始化函数: H/ k) m2 U# X( i# g7 {8 X
  13. 入口参数:无8 b3 x' V0 b7 L
  14. 返回参数:无0 V: u3 _" k+ I, Q
  15. 开发作者:闲人Ne2 J, c+ C' O1 y8 v- d1 x" y
  16. 参考资料:1)RCC寄存器名称:RCC_CR (时钟控制寄存器) RCC_CFGR(时钟配置寄存器)RCC_CIR(时钟中断寄存器)
    7 G5 |) e% \( n8 b) F3 }
  17. *************************************************************************************************/
    9 C& ~! q8 r( B6 H! ^! K" |$ j
  18. void SystemInit (void)& m8 c' l9 M9 _. R) S0 R
  19. {
    9 L5 d$ ^3 n* |0 c- O
  20.   // 针对RCC_CR,HSION[0]内部高速时钟使能,设1,即内部8MHz振荡器开启
    ' V* J. m7 z0 H
  21.   RCC->CR |= (uint32_t)0x00000001;   
    9 J; C" z4 I* L4 j
  22.   #ifndef STM32F10X_CL7 y# K$ [, K, \# c3 T7 k* ~+ k1 o. U
  23.   /* 针对RCC_CFGR,SW    [0:1]   系统时钟切换,        设00,   即HSI作为系统时钟;0 t4 b6 I  {# e/ R6 w  V* _
  24.                   SWS   [2:3]   系统时钟切换状态,    设00,   即HSI作为系统时钟;- t8 z# t; D: r/ w) U$ A
  25.                   HPRE  [4:7]   AHP预分频,          设0000, 即SYSCLK不分频;
    1 D# M) J8 F: Z9 V  [
  26.                   PPRE1 [8:10]  低速APB预分频(APB1), 设000,  即HCLK不分频,从而决定PCLK1时钟;& y3 K/ R  J. a5 J5 Q+ ~* T8 C
  27.                             PPRE2  [11:13] 高速APB预分频(APB2),设000,  即HCLK不分频,从而决定PCLK2时钟;8 x% O' B# f4 c# P  [; ]
  28.                  ADCPRE [14:15] ADC预分频,          设00,   即PCLK2 2分频后作为ADC时钟;% l" K) N4 |$ P: X
  29.                  MOC    [24:26] 微控制器时钟输出,    设000,  即没有时钟输出 */  
    ) A. X) g/ f  U9 g& t) q8 d
  30.    RCC->CFGR &= (uint32_t)0xF8FF0000;  7 S1 H; I: h2 Y6 ^
  31.   #else) p' t: s6 D4 Q3 R$ x9 Z
  32.    RCC->CFGR &= (uint32_t)0xF0FF0000;  // 不执行,因为我用的是STM32F10X_HD* ]7 d+ j5 p2 o* H% \
  33.   #endif
    - f4 P2 p8 C" c# i9 L
  34.   /* 针对RCC_CR,   HSEON    [16] 外部高速时钟使能,    设0,   即外部HSE振荡器关闭;3 y( |" w; D* r( H0 `0 r8 H2 s1 c
  35.                   CSSON    [19] 时钟安全系统使能,     设0,   即时钟监测器关闭;
    + ^$ E+ ~; e3 D" I: q7 ^2 ~
  36.                   PCCON    [24] PLL使能,             设0,   PCC关闭 */* ?/ J7 V/ @2 p* J' T
  37.   RCC->CR &= (uint32_t)0xFEF6FFFF;
    % p. Z: O# L5 E3 N. O# C
  38.   // 针对RCC_CR,   HSEBYP   [18] 外部高速时钟旁路,    设0,   即外部4-16MHz振荡器没有旁路
    3 }( h" g4 P2 V/ Q& I
  39.   RCC->CR &= (uint32_t)0xFFFBFFFF;
    # ?0 x' \6 `2 f. Y6 y
  40.   /* 针对RCC_CFGR, PCCSRC   [16] PLL输入时钟源,       设0,   即HSI振荡器时钟经2分频后作为PLL输入时钟;! t4 j* ~  ~! t  N4 u" l
  41.                   PLLXTPRE [17] HSE分频器作为PLL输入,设0,    即HSE不分频;8 g2 e6 c( g1 q; }% j4 B. r# g
  42.                   PLLMUL   [18: 21]PLL倍频系数,      设0000,即PLL 2倍频输出;9 t9 z5 h3 y. S7 S8 _) j6 C
  43.                   USBPRE   [22] USB预分频,           设0,   即PLL时钟1.5倍分频作为USB时钟 */
    5 r% ~- G9 [6 w9 d
  44.   RCC->CFGR &= (uint32_t)0xFF80FFFF;
    ' r3 n- N: m0 ^! E# t
  45.   #ifdef STM32F10X_CL  // 不执行,因为用的是STM32F10X_HD
    5 G! [% q2 V5 N! S# J- n
  46.    RCC->CR &= (uint32_t)0xEBFFFFFF;
    ) b5 \) X! |  J1 e" U  O) D
  47.    RCC->CIR = 0x00FF0000;4 y- w6 [* N* o; P4 @. M' d
  48.    RCC->CFGR2 = 0x00000000;9 |& Z1 D. \$ A& o
  49.   #elif defined (STM32F10X_LD_VL) || defined (STM32F10X_MD_VL) || (defined STM32F10X_HD_VL) // 不执行,因为用的是STM32F10X_HD2 P9 }' O6 L1 A  u6 z1 ]4 x) k' l
  50.    RCC->CIR = 0x009F0000;
    * w! U6 L$ g1 _6 i4 _5 k9 q' r
  51.    RCC->CFGR2 = 0x00000000;      
    # @2 j- j3 N  o1 I7 Q+ n
  52.   #else // 执行,因为用的是STM32F10X_HD
    * M/ c: l& t7 }: |
  53.   /* 针对RCC_CIR, LSIRDYF [0]  LSI就绪中断标志,      设0, 即无内部40kHz RC振荡器产生的时钟就绪中断;2 P/ p. B. G7 i: k+ O5 v1 X
  54.                  LSERDYF [1]  LSE就绪中断标志,      设0, 即无外部32kHz振荡器产生的时钟就绪中断;
    3 Y8 E+ s( b8 U: u  l; Z1 p3 P
  55.                  HSIRDYF [2]  HSI就绪中断标志,      设0, 即无内部8MHz RC振荡器产生的时钟就绪中断;
    / F; L+ [) w8 L  L/ H
  56.                  HSERDYF [3]  HSE就绪中断标志,      设0, 即无外部4-16MHz振荡器产生的时钟就绪中断;
    4 f# T' o, S$ s. b, i3 ?
  57.                  PLLRDYF [4]  PLL就绪中断标志,      设0, 即无PLL上锁产生的时钟就绪中断;" P2 }  u+ t! d) M4 }4 ?' ]
  58.                  CSSF    [7]  时钟安全系统中断标志, 设0, 即无HSE时钟失效产生的安全系统中断;; h8 s/ D4 R7 ?+ B
  59.                  LSIRDYIE[8]  LSI就绪中断使能,      设0, 即LSI就绪中断关闭;5 o7 h- n$ Y8 U) A) M: Y4 [3 S
  60.                  LSERDYIE[9]  LSE就绪中断使能,      设0, 即LSE就绪中断关闭;# i' a2 n6 H4 p( K. i- V
  61.                  HSIRDYIE[10] HSI就绪中断使能,      设0, 即HSI就绪中断关闭;6 \" G* _7 i2 _1 d9 J8 g& c
  62.                  HSERDYIE[11] HSE就绪中断使能,      设0, 即HSE就绪中断关闭;+ I/ ?% C: u" r, E9 S7 ~
  63.                  PLLRDYIE[12] PLL就绪中断使能,      设0, 即PLL就绪中断关闭;1 ~) j9 e4 v" L9 l
  64.                  LSIRDYC [16] 清除LSI就绪中断,      设1, 即清除LSI就绪中断标志位LSIRDYF;
    9 S7 `- G; f% I% _+ {; F
  65.                  LSERDYC [17] 清除LSE就绪中断,      设1, 清除LSE就绪中断标志位LSERDYF;
    - x2 W  M8 R# m) _! f! ]3 R6 C- z$ P: K
  66.                  HSIRDYC [18] 清除HSI就绪中断,      设1, 清除HSI就绪中断标志位HSIRDYF;
    0 n2 `5 U: c2 ]( W4 s
  67.                            HSERDYC [19] 清除HSE就绪中断,      设1, 清除HSE就绪中断标志位HSERDYF;
    + @4 {1 R2 b% t' B$ e( L
  68.                            PLLRDYC [20] 清除PLL就绪中断,      设1, 清除PLL就绪中断标志位PLLRDYF */
    # x" S3 y- x% l" T
  69.    RCC->CIR = 0x009F0000;  
    ) W* R3 W* {! ^! G2 F" a
  70.   #endif* u) f7 ?7 U% |
  71.   #if defined (STM32F10X_HD) || (defined STM32F10X_XL) || (defined STM32F10X_HD_VL)   
    5 `/ ?  J% x% r9 T: A
  72.    #ifdef DATA_IN_ExtSRAM% H4 }' A. j( G0 I6 k
  73.     SystemInit_ExtMemCtl();                // 不执行, z0 G4 c+ R. F. |$ j4 C
  74.    #endif  z2 z0 D. g& @% U
  75.   #endif
    4 B9 `1 y& F% e% }/ `
  76.   /* Configure the System clock frequency, HCLK, PCLK2 and PCLK1 prescalers */8 u( S( ~" C( ?% N( z
  77.   /* Configure the Flash Latency cycles and enable prefetch buffer */
    + E  D, {0 [: x7 p  k
  78.   SetSysClock();  // 设置系统时钟函数,往下翻会有解读   
    $ p4 [5 m) A0 V6 o2 k7 @
  79.   #ifdef VECT_TAB_SRAM
    3 q4 c8 t, i! A) v
  80.    SCB->VTOR = SRAM_BASE | VECT_TAB_OFFSET; // 不执行
    / x2 ^; M  J/ W* Y1 g
  81.   #else
    ; E' F* f& A' n/ C0 R* M5 ^  b* ?; W  @
  82.    SCB->VTOR = FLASH_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal FLASH. */
    * T0 n3 s% e7 }
  83.   #endif
    3 y( Y* M& A; F8 b( S6 d# G0 y7 D$ v
  84. }' O( k  c7 c  V( k

  85. 0 W" {& T9 S) Q
  86. /************************************************8 t1 u2 p7 Y: H+ Q5 W3 g
  87. 函数名称:SetSysClock()
    7 O9 C- T2 U% F% u# ~1 O8 Z
  88. 函数功能:设置系统时钟函数  j6 l4 A" `, j' E6 e: M; W# l
  89. 入口参数:无
    , k& Y7 O6 |! c1 ^; {3 [( H' k
  90. 返回参数:无4 E$ ?  c* x8 ~0 H. H6 p. ^" [
  91. 开发作者:闲人Ne
    ' g4 W* j; I; q% x" ~4 {& H' k; I
  92. *************************************************/
    + ~: I2 q% k* l# h& z
  93. static void SetSysClock(void)
    2 [+ l0 s4 u5 h% c' G( R7 _
  94. {
    ; Q, |) Q/ w5 I
  95. #ifdef SYSCLK_FREQ_HSE3 P4 p( G+ T3 i; o& U+ B
  96.   SetSysClockToHSE();   // 不执行( f' ~4 W; p* r2 b# q
  97. #elif defined SYSCLK_FREQ_24MHz
    & c3 j1 _  C1 f. T7 o$ y
  98.   SetSysClockTo24();    // 不执行4 W% D* \/ a( y, @4 J
  99. #elif defined SYSCLK_FREQ_36MHz
    3 m: x7 X! e1 [" N/ O
  100.   SetSysClockTo36();    // 不执行  ]& B- p4 h3 ]* d+ P' Q
  101. #elif defined SYSCLK_FREQ_48MHz# [+ ]- f: K: y3 T- C( J; k3 g& k
  102.   SetSysClockTo48();    // 不执行4 r/ y$ V$ x' m! z* i2 T7 m
  103. #elif defined SYSCLK_FREQ_56MHz
    # F5 E% [9 b* {4 _/ |
  104.   SetSysClockTo56();    // 不执行) e9 u( f% T3 ?# Z: p( P7 d* P
  105. #elif defined SYSCLK_FREQ_72MHz
    / c, I* s" c+ h6 ~0 X( Q" s
  106.   SetSysClockTo72();    // 执行,因为只定义了SYSCLK_FREQ_72MHz=72000000,往下翻会有解读
    8 E4 A, l/ J! i) q' a
  107. #endif
    # W: w0 W' A) r; k
  108. }
    ( H3 e9 h- x  d- f; S/ h2 v3 W

  109. 6 x6 a5 }1 s& f9 _: k) ~( V  N
  110. /************************************************
    ! t$ @( s: p. K- }1 [
  111. 函数名称:SetSysClock()- H5 A" I" t3 S
  112. 函数功能:设置系统时钟函数# v0 Z8 `! o$ L8 y3 ^$ M- W
  113. 入口参数:无
    % H. l8 c! O  V1 a8 A; m
  114. 返回参数:无
    7 O" ]/ O( q* Q* b8 i% v
  115. 开发作者:闲人Ne
    . c, G) e+ f* ^2 S) H4 c
  116. *************************************************/
    ' t# `( T* q. @6 P8 z
  117. static void SetSysClockTo72(void)" n* M$ ^; m- n2 k: o! x+ p
  118. {
    " ?- N0 z' Y# g0 ~) Z
  119.   __IO uint32_t StartUpCounter = 0, HSEStatus = 0;; q8 \( C# r$ k" e0 O' g
  120.   /* SYSCLK, HCLK, PCLK2 and PCLK1 configuration ---------------------------*/   
    ) q* `( V* Q8 y; X; E9 a$ o0 M5 ~  y* Q
  121.   // RCC_CR_HSEON=0x00010000,针对RCC_CR,HSEON[16]外部高速时钟使能,设1,即外部HSE振荡器开启  & H9 {: F( b/ S
  122.   RCC->CR |= ((uint32_t)RCC_CR_HSEON);  
    : j# s+ h8 W2 K# A. l% a0 m
  123.   do
    & V  X: Z  V: M) j( `( x8 x
  124.   {
    9 Z9 J7 V& C, p3 N. l
  125.     // RCC_CR_HSERDY=0x00020000,针对RCC_CR,HSERDY[17]外部高速时钟就绪标志,为1时,表示外部4-16MHz振荡器就绪
    4 j3 V: ~: K3 r7 u- F% ?
  126.     HSEStatus = RCC->CR & RCC_CR_HSERDY;  // 如果RCC_CR第[17]=1,那么HSEStatus=18 L9 W% s7 R2 B' J2 S
  127.     StartUpCounter++;  
    4 R4 b% U9 o+ x! u/ y0 C
  128.   } 6 b+ |0 M& I; C3 H& E- U  x
  129.   // 当HSEStatus=1或StartUpCounter=0x0500时,跳出循环,while循环后面加;表示空循环: }. _0 j2 C, a2 R- O- t
  130.   while((HSEStatus == 0) && (StartUpCounter != HSE_STARTUP_TIMEOUT)); / g/ g" v$ ~9 o9 Z6 U8 _4 z
  131.   if ((RCC->CR & RCC_CR_HSERDY) != RESET)  // 当RCC_CR第[17]位HSERDY=1时执行if里面的函数
    7 j9 ~$ L1 n, d& `; C. i
  132.   {
    $ ]% I- F" A* U
  133.     HSEStatus = (uint32_t)0x01;( J$ O/ G0 G  f4 r& i
  134.   }
    " o" w5 W* W3 y
  135.   else5 C1 {( Q: W8 p1 F1 u8 S- Y
  136.   {& i# u! E7 f$ _' e# h( n+ N1 h
  137.     HSEStatus = (uint32_t)0x00;# l# }% k7 ]' [  X, f
  138.   }  
    5 p5 i% ^+ d2 z7 Q3 S
  139.   if (HSEStatus == (uint32_t)0x01)
    8 ?7 ?( ^  O. v# E
  140.   {6 I* l# O* J2 L3 F
  141.     // FLASH_ACR_PRFTBE=0x10,针对FLASH_ACR,PRFTBS[5]预取缓冲区状态,设1,即预取缓冲区开启
    ! W5 f% R( x5 w+ c
  142.     FLASH->ACR |= FLASH_ACR_PRFTBE;    7 G4 o6 l1 n. v/ b- M
  143.     // 第一步,FLASH_ACR_LATENCY=0x03,针对FLASH_ACR寄存器,[0:1]位先至0,[2:7]位不操作
      }) v) u4 x% d7 x
  144.     FLASH->ACR &= (uint32_t)((uint32_t)~FLASH_ACR_LATENCY);  ) e  d2 o8 G1 C$ ]/ [
  145.     // 第二步,FLASH_ACR_LATENCY_2=0x02, 针对FLASH_ACR寄存器,[0:1]位至10,[2:7]位不操作
    6 }8 \! A# W0 n$ y  W* d
  146.     FLASH->ACR |= (uint32_t)FLASH_ACR_LATENCY_2; //LATENCY[0:2]时延,设两个等待状态,当48MHz<SYSCLK≤72MHz
    # G. x. b3 [0 J0 t  K) }
  147.     // RCC_CFGR_HPRE_DIV1=0x00000000,主要针对RCC_CFGR,HPRE[4:7]位设0000,对AHB预分频配置为SYSCLK不分频,HCLK=SYSCLK% l' e- {( _9 `3 y
  148.     RCC->CFGR |= (uint32_t)RCC_CFGR_HPRE_DIV1;
    8 f5 N  ~. J. ^
  149.     // RCC_CFGR_PPRE2_DIV1=0x00000000,主要针对RCC_CFGR,PPRE2[11:13]位设000,对高速APB2配置为HCLK不分频,PCLK2=HCLK+ H7 D2 j6 f+ G$ G9 X- f3 g
  150.     RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE2_DIV1;9 g. \  b# k4 |4 C6 r
  151.     // RCC_CFGR_PPRE1_DIV2=0x00000400,主要针对RCC_CFGR,PPRE1[8:10]位设100,对低速APB1配置为HCLK 2分频,PCLK1=HCLK/21 m% r3 }8 X" e2 c4 P
  152.     RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE1_DIV2;
    + d. s9 i  v0 {  o
  153.     #ifdef STM32F10X_CL       & }+ G! r1 i& n; x& U' o3 K+ C; o
  154.       RCC->CFGR2 &= (uint32_t)~(RCC_CFGR2_PREDIV2 | RCC_CFGR2_PLL2MUL | RCC_CFGR2_PREDIV1 | RCC_CFGR2_PREDIV1SRC);               
    $ F' [. O: u0 v) F9 |
  155.       RCC->CFGR2 |= (uint32_t)(RCC_CFGR2_PREDIV2_DIV5 | RCC_CFGR2_PLL2MUL8 | RCC_CFGR2_PREDIV1SRC_PLL2 | RCC_CFGR2_PREDIV1_DIV5);
    9 t4 X' b- u# [% z( f2 o. l
  156.       RCC->CR |= RCC_CR_PLL2ON;                 // 不执行
    1 z' K! |. [3 y% p8 w+ Y6 f3 ]6 K% r
  157.       while((RCC->CR & RCC_CR_PLL2RDY) == 0);   // 不执行
    3 t8 O9 ]4 j) e+ d1 m
  158.       RCC->CFGR &= (uint32_t)~(RCC_CFGR_PLLXTPRE | RCC_CFGR_PLLSRC | RCC_CFGR_PLLMULL);                 // 不执行3 }  u0 D2 h0 R* F
  159.       RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLXTPRE_PREDIV1 | RCC_CFGR_PLLSRC_PREDIV1 | RCC_CFGR_PLLMULL9); // 不执行3 _0 d* c; E6 u" h- C
  160.     #else    ) n% S, W3 M8 ?8 o3 k# Y1 U
  161.      /* PLL configuration:  */( A: M+ n& Q* P* C  s  u4 u
  162.      /* RCC_CFGR_PLLSRC=0x00010000,RCC_CFGR_PLLXTPRE=0x00020000,RCC_CFGR_PLLMULL=0x003C0000,整合取非后,[16:21]位为000000,其余为1 */
      j1 x4 h# h& P( h
  163.      RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_PLLSRC | RCC_CFGR_PLLXTPRE | RCC_CFGR_PLLMULL));
    4 k9 i- H( }8 ~( d! T  z, g& S
  164.      /* RCC_CFGR_PLLSRC_HSE=0x00010000,RCC_CFGR_PLLMULL9=0x001C0000& n0 r/ v7 o6 _' u
  165.      针对RCC_CFGR,[16:21]位为011101,
    ) f/ C! G& h) N' s  \
  166.      PLLSRC       [16]    PLL输入时钟源,        设1,    HSE时钟作为PLL输入时钟;7 t' y3 @8 ]6 X, K* [; v9 {. d
  167.      PLLXTPRE     [17]    HSE分频器作为PLL输入, 设0,    HSE不分频;* U: S4 \8 r3 D0 g
  168.      PLLMUL       [18:21] PLL倍频系数,          设0111, PLL 9倍频输出,PLLCLK=HSE*9=72MHz */# {9 I. A' ?  d
  169.      RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLSRC_HSE | RCC_CFGR_PLLMULL9);
    $ E( c7 P% a2 W
  170.     #endif* R) f$ Y  _. O, I' z) q$ T
  171.     // RCC_CR_PLLON=0x01000000,针对RCC_CR,PLLON[24]PLL使能,PLL使能
    9 @$ m+ w, _. N# B2 @; G
  172.     RCC->CR |= RCC_CR_PLLON;
    - h2 g0 P( L/ |- G$ g" n3 r0 n
  173.     // RCC_CR_PLLRDY=0x02000000,即RCC_CR,PLLRDY[25]PLL时钟就绪标志,0 PLL未锁定;1 PLL锁定
    ) ~! [4 p* h' t6 Q
  174.     while((RCC->CR & RCC_CR_PLLRDY) == 0) // 若RCC_CR的[25]位为1,则跳出循环5 _; P$ ^# J& i/ E  {1 s; J4 r
  175.     {
    - O) [  e1 p- t  R2 O8 z  @  R, l' X
  176.     }    1 K2 S9 y& z* g
  177.     // RCC_CFGR_SW=0x00000003,SW[0:1]系统时钟切换,取非为00,先将RCC_CFGR的[0:1]位至00' ?- G1 E2 k1 {9 t$ G) R
  178.     RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_SW));/ b! o+ G% n4 c: P
  179.     // RCC_CFGR_SW_PLL=0x00000002,再将RCC_CFGR的[0:1]位至10,即PLL输出作为系统时钟
    : r6 k# Y: n3 r1 N) K" E
  180.     RCC->CFGR |= (uint32_t)RCC_CFGR_SW_PLL;    ' P4 {" k0 Z. Q% W  ]
  181.     /* Wait till PLL is used as system clock source */
    0 {1 [% ~6 h, J) s* s. d. V
  182.     // RCC_CFGR_SWS=0x0000000C,当RCC_CFGR的[2:3]位为10时,跳出循环  
    7 p6 s! N6 h% `, U1 _" u
  183.     while ((RCC->CFGR & (uint32_t)RCC_CFGR_SWS) != (uint32_t)0x08)6 r4 t+ i1 K: r1 N1 m' j' `
  184.     {& l' e  k8 v; I+ ^" i
  185.     }
    / D( S/ W2 C. L, Q* M8 ?
  186.   }
    & s( i. ?9 b5 Z! t6 ]
  187.   else
    / ?2 o( s' S: P* l$ ?
  188.   {
    5 ?2 u; z6 h1 L
  189.   }/ d' b2 W: p1 \4 T
  190. }
    : |* ]+ Q, V$ Y3 \; U) x( z
  191. #endif
复制代码
3 R# ^8 o  m' q( J8 \% b* C7 _
上述函数系统初始化后,时钟频率72MHz,APB1时钟频率为72MHz,APB2时钟频率36MHz,AHB时钟频率72MHz。/ B1 I/ D) I( G# }7 q. v6 ?
————————————————4 j! \3 x( y. c/ j  r
版权声明:天亮继续睡
7 d& D& s3 O% k0 E- L4 E7 _# L2 |! o8 F% T
赞 收藏 评论0 发布时间:2022-11-20 15:40

举报

0个回答

所属标签

相似技术帖

官网相关资源

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