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

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

[复制链接]
STMCU小助手 发布时间:2022-11-20 15:40
之前初学STM32开发板的时候,也写了几篇关于时钟系统配置的文章文章一和文章二,最近又仔细回顾了官方给的SystemInit ()函数,对其做了更好的解读。所谓读书百遍其义自见。
) Q( R  [% e9 ~& z( U$ w
& G3 C" r+ x9 @主要的函数:void SystemInit (void)9 J. T% A$ s# O6 Q2 D* x: m
包含的函数:static void SetSysClock(void);static void SetSysClockTo72(void)7 S' N% @3 I/ J3 u; w

; w# F% k6 Q7 M% w. Q5 z4 h
  1. /**" y$ U; l7 g' V7 ~7 O
  2. ********************************  STM32F10x  *******************************************************
    ( b- x/ z! g6 {
  3. * @文件名称: systeminit.c解读版
    7 J# ]2 X$ E' y
  4. * @作者名称: 闲人Ne
    7 P! Y% H& k5 V7 E9 o
  5. * @库版本号: V3.5.0
    6 \- e1 Z" ~" s  Z- |2 O3 k# |- ^
  6. * @工程版本: V1.0.0  A8 R9 B- Q$ A
  7. * @开发日期: 2020年12月15日
    3 r/ w9 O) O; J, R3 v" F' z
  8. * @摘要简述: 本文件源于system_stm32f10x.c文件里的部分函数,不做任何修改,单独拿出来只为对其做详细解读。
    6 ^0 H# w- ]& R: Z
  9. ****************************************************************************************************/
    " j) O/ m* {4 Q" Y2 H
  10. /************************************************************************************************
    5 G  A( M  e7 I4 [  q4 \+ F& V) O
  11. 函数名称:SystemInit ()8 ~7 S5 l" \$ j! u2 f3 V
  12. 函数功能:系统初始化函数  T0 Z3 g3 l; U% q7 p+ h/ |) j
  13. 入口参数:无  s' G4 R8 K1 S3 H! R
  14. 返回参数:无
      d) H2 ?5 f# K' }! V" N8 O( B' X
  15. 开发作者:闲人Ne1 ?, s+ L. \8 r# E
  16. 参考资料:1)RCC寄存器名称:RCC_CR (时钟控制寄存器) RCC_CFGR(时钟配置寄存器)RCC_CIR(时钟中断寄存器)
    5 D) _. N' K7 L# Q7 K$ X/ u
  17. *************************************************************************************************/6 d0 S% e9 t& {9 Y
  18. void SystemInit (void)
    : j+ N! ]# l) v/ C6 E( q* M( g
  19. {
    1 H3 w% @- H; F% x! [% _- F' [4 V
  20.   // 针对RCC_CR,HSION[0]内部高速时钟使能,设1,即内部8MHz振荡器开启
    7 Y5 q/ v# _8 N+ _# |% t2 s/ l
  21.   RCC->CR |= (uint32_t)0x00000001;   
    8 |/ t; A6 T1 p. {- ^: H
  22.   #ifndef STM32F10X_CL
    0 H, h# h) a7 x: K
  23.   /* 针对RCC_CFGR,SW    [0:1]   系统时钟切换,        设00,   即HSI作为系统时钟;4 V) g* m3 G; T/ U
  24.                   SWS   [2:3]   系统时钟切换状态,    设00,   即HSI作为系统时钟;* _# z5 O: b: N: Y* r
  25.                   HPRE  [4:7]   AHP预分频,          设0000, 即SYSCLK不分频;* C1 F2 ?  t2 X0 H. z4 u1 ]5 E
  26.                   PPRE1 [8:10]  低速APB预分频(APB1), 设000,  即HCLK不分频,从而决定PCLK1时钟;8 I1 v1 d' X1 ]; C/ J( f
  27.                             PPRE2  [11:13] 高速APB预分频(APB2),设000,  即HCLK不分频,从而决定PCLK2时钟;6 {, F6 I3 K/ a! Q- e
  28.                  ADCPRE [14:15] ADC预分频,          设00,   即PCLK2 2分频后作为ADC时钟;
    8 K7 n% |+ a6 a: X+ `
  29.                  MOC    [24:26] 微控制器时钟输出,    设000,  即没有时钟输出 */  
    , H/ f7 v% @4 K3 k) w
  30.    RCC->CFGR &= (uint32_t)0xF8FF0000;  5 K- [9 B7 \8 C6 B! c; U
  31.   #else: ?: S8 g0 @3 y
  32.    RCC->CFGR &= (uint32_t)0xF0FF0000;  // 不执行,因为我用的是STM32F10X_HD. t" J+ `( W/ q/ L9 h
  33.   #endif
    " t. H- a+ X0 p6 c& t) B
  34.   /* 针对RCC_CR,   HSEON    [16] 外部高速时钟使能,    设0,   即外部HSE振荡器关闭;2 N2 V0 v+ F9 ?; R! e
  35.                   CSSON    [19] 时钟安全系统使能,     设0,   即时钟监测器关闭;3 Z, b% F0 q; P, A
  36.                   PCCON    [24] PLL使能,             设0,   PCC关闭 */
    . G" S- m9 n+ i  p5 ^
  37.   RCC->CR &= (uint32_t)0xFEF6FFFF;
    ! @+ P1 H+ Z' T1 j/ q$ w8 R+ p
  38.   // 针对RCC_CR,   HSEBYP   [18] 外部高速时钟旁路,    设0,   即外部4-16MHz振荡器没有旁路
    * }3 p% j3 v7 N4 x
  39.   RCC->CR &= (uint32_t)0xFFFBFFFF;
    ( P% c+ ^; G6 h- p  ]* z4 H: _
  40.   /* 针对RCC_CFGR, PCCSRC   [16] PLL输入时钟源,       设0,   即HSI振荡器时钟经2分频后作为PLL输入时钟;
      L  a, G! f/ x! f8 L
  41.                   PLLXTPRE [17] HSE分频器作为PLL输入,设0,    即HSE不分频;1 ?/ j' Q4 K4 k' v6 }
  42.                   PLLMUL   [18: 21]PLL倍频系数,      设0000,即PLL 2倍频输出;) D& k/ m6 |# w. E) P5 F
  43.                   USBPRE   [22] USB预分频,           设0,   即PLL时钟1.5倍分频作为USB时钟 */6 E2 g+ |% L  J$ y) ^
  44.   RCC->CFGR &= (uint32_t)0xFF80FFFF;. B1 Q9 m3 [. _; T3 G
  45.   #ifdef STM32F10X_CL  // 不执行,因为用的是STM32F10X_HD
    ! ?2 l5 @5 v6 Y- G
  46.    RCC->CR &= (uint32_t)0xEBFFFFFF;
    . }1 ?4 L8 `' l- V
  47.    RCC->CIR = 0x00FF0000;9 j% V+ o4 h0 O. A
  48.    RCC->CFGR2 = 0x00000000;
    $ G& a, O( F4 _8 W, C( N& G
  49.   #elif defined (STM32F10X_LD_VL) || defined (STM32F10X_MD_VL) || (defined STM32F10X_HD_VL) // 不执行,因为用的是STM32F10X_HD, q# r5 t5 [0 R' q
  50.    RCC->CIR = 0x009F0000;
    & n; `) z( ^' w; A, v8 Y8 E0 }
  51.    RCC->CFGR2 = 0x00000000;      $ ?6 ^* v5 v9 a" n2 ?- u9 J
  52.   #else // 执行,因为用的是STM32F10X_HD
    9 T: s" R; c5 v. {" J' x' r
  53.   /* 针对RCC_CIR, LSIRDYF [0]  LSI就绪中断标志,      设0, 即无内部40kHz RC振荡器产生的时钟就绪中断;
    % Y0 @5 A9 N* T) N
  54.                  LSERDYF [1]  LSE就绪中断标志,      设0, 即无外部32kHz振荡器产生的时钟就绪中断;  R; V" a3 ?) z9 H  t
  55.                  HSIRDYF [2]  HSI就绪中断标志,      设0, 即无内部8MHz RC振荡器产生的时钟就绪中断;
    $ _# x6 v( B7 E3 u3 N4 A
  56.                  HSERDYF [3]  HSE就绪中断标志,      设0, 即无外部4-16MHz振荡器产生的时钟就绪中断;
    * ]' r/ z3 [3 o2 T6 N, U1 n
  57.                  PLLRDYF [4]  PLL就绪中断标志,      设0, 即无PLL上锁产生的时钟就绪中断;1 ?6 f9 ~* u, X8 d0 I- c
  58.                  CSSF    [7]  时钟安全系统中断标志, 设0, 即无HSE时钟失效产生的安全系统中断;( v2 ]" u' M9 t0 F
  59.                  LSIRDYIE[8]  LSI就绪中断使能,      设0, 即LSI就绪中断关闭;
    4 Y/ [6 e# V9 x$ }
  60.                  LSERDYIE[9]  LSE就绪中断使能,      设0, 即LSE就绪中断关闭;* O; a  K: s% ?+ }+ ^
  61.                  HSIRDYIE[10] HSI就绪中断使能,      设0, 即HSI就绪中断关闭;0 [/ E+ s6 j$ C  P
  62.                  HSERDYIE[11] HSE就绪中断使能,      设0, 即HSE就绪中断关闭;* o" K: }1 t5 ?, q" P( k$ n
  63.                  PLLRDYIE[12] PLL就绪中断使能,      设0, 即PLL就绪中断关闭;" a7 x) L+ g/ B7 G! _
  64.                  LSIRDYC [16] 清除LSI就绪中断,      设1, 即清除LSI就绪中断标志位LSIRDYF;) {( S7 D0 n# l8 X
  65.                  LSERDYC [17] 清除LSE就绪中断,      设1, 清除LSE就绪中断标志位LSERDYF;" b8 ^6 N- X. S7 }# s! h7 f; X! W
  66.                  HSIRDYC [18] 清除HSI就绪中断,      设1, 清除HSI就绪中断标志位HSIRDYF;
    $ a3 m) _, [' i
  67.                            HSERDYC [19] 清除HSE就绪中断,      设1, 清除HSE就绪中断标志位HSERDYF;
    , C- Q- K. }8 e0 }8 }$ c- `4 ?9 v* }
  68.                            PLLRDYC [20] 清除PLL就绪中断,      设1, 清除PLL就绪中断标志位PLLRDYF */
    + C  G- o8 F4 G/ _
  69.    RCC->CIR = 0x009F0000;  : b- N7 x0 y" C, P. F, X* Q( h
  70.   #endif
    ' \: b$ S& s/ e: D
  71.   #if defined (STM32F10X_HD) || (defined STM32F10X_XL) || (defined STM32F10X_HD_VL)   
    + l# T9 X6 I: J) V/ t
  72.    #ifdef DATA_IN_ExtSRAM
    ( @. ^- J( d2 u, L7 C1 M+ M
  73.     SystemInit_ExtMemCtl();                // 不执行# E4 E  _9 e( q
  74.    #endif; Q0 }! C5 u1 n6 w. A) }9 h. b) g) Y) E
  75.   #endif# t' w  p& F  x
  76.   /* Configure the System clock frequency, HCLK, PCLK2 and PCLK1 prescalers */
    ' O9 e; W! R5 \8 W, W8 x) w( U2 b
  77.   /* Configure the Flash Latency cycles and enable prefetch buffer */" r& T3 ~8 [+ _+ o; W% U% q; L
  78.   SetSysClock();  // 设置系统时钟函数,往下翻会有解读    0 ?* L9 c7 U& b+ \; Y4 V6 N) l
  79.   #ifdef VECT_TAB_SRAM6 O' ]$ P  b" p- E" N! X
  80.    SCB->VTOR = SRAM_BASE | VECT_TAB_OFFSET; // 不执行
    " t9 O. w- J6 l9 ~3 K8 c
  81.   #else
    " Q5 ^6 q. M  Y4 Y% U4 V
  82.    SCB->VTOR = FLASH_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal FLASH. */
    # i  c# }* m0 X, N% Z$ w# }( K7 y
  83.   #endif % r) C7 l4 A4 X* l
  84. }
    6 f# k) T: J5 @* O  X1 m% n2 o: Z
  85.   t/ Y3 H1 F" h8 V# ?
  86. /************************************************
    , n+ g, d  Z9 t# ^1 J
  87. 函数名称:SetSysClock()( u, N/ w5 a2 i) D4 q" y: }& d
  88. 函数功能:设置系统时钟函数. ^$ H5 ~0 x* K5 v, q
  89. 入口参数:无% o* X1 l, g: q6 B
  90. 返回参数:无
    0 `0 r8 ^( S9 G
  91. 开发作者:闲人Ne
    + K* ^+ \$ G; p5 m0 g
  92. *************************************************/% a; H4 V7 b6 }6 L1 ~) Y
  93. static void SetSysClock(void)$ p) m" a9 U) B! `! u8 s5 K
  94. {" ?! j( C/ G: \' @) b! f  \+ M
  95. #ifdef SYSCLK_FREQ_HSE4 ]& k2 @9 W) `6 X' M" j
  96.   SetSysClockToHSE();   // 不执行; Y! O- [! F. D$ p
  97. #elif defined SYSCLK_FREQ_24MHz  ?+ _9 L5 @6 p% E, M
  98.   SetSysClockTo24();    // 不执行
    " ]0 E8 s3 N. Q$ Z2 }
  99. #elif defined SYSCLK_FREQ_36MHz
    / B3 y" b9 r/ Z; u3 v6 _1 d
  100.   SetSysClockTo36();    // 不执行6 Q4 d7 c' M  P# J
  101. #elif defined SYSCLK_FREQ_48MHz
    * U) e! U  `  [: ~/ d% Q+ a6 S, F
  102.   SetSysClockTo48();    // 不执行
    4 Z4 V/ Z1 @" J: c
  103. #elif defined SYSCLK_FREQ_56MHz; ?9 Z# v; K( S* u1 y* R/ `& |
  104.   SetSysClockTo56();    // 不执行
    " H/ B+ H$ q( q
  105. #elif defined SYSCLK_FREQ_72MHz: B& C# V4 f- j/ _* O* w* B8 W' ?
  106.   SetSysClockTo72();    // 执行,因为只定义了SYSCLK_FREQ_72MHz=72000000,往下翻会有解读  B! T' j3 O/ u  R4 j4 f
  107. #endif
    ! J- K5 {' O1 r" O
  108. }6 q$ ]$ Z8 A  g% X7 h1 C9 f$ e  ]' [( r5 d
  109. - z( S2 p) v2 N  N! s
  110. /************************************************3 h8 w( W% s1 N9 T: F. Q
  111. 函数名称:SetSysClock()+ \3 M4 p+ `( `( z' i- v/ c
  112. 函数功能:设置系统时钟函数
    2 i) i/ O5 a! F- X0 x
  113. 入口参数:无
    ; `3 ?% \! E8 l6 g$ o' ]+ b& B" s  N
  114. 返回参数:无
    ! ]/ P, a% |2 s+ Z0 K) C  ^+ X
  115. 开发作者:闲人Ne( W. l7 h& s$ T- A- }
  116. *************************************************/9 z8 V) [- j! y8 P; m2 G
  117. static void SetSysClockTo72(void)
    4 I* h! K* s1 O! g/ e* A7 ^
  118. {
    ( J% @% P) {4 v8 w  F  o: J
  119.   __IO uint32_t StartUpCounter = 0, HSEStatus = 0;7 r# ?! ?0 X. Z$ s! ]) w
  120.   /* SYSCLK, HCLK, PCLK2 and PCLK1 configuration ---------------------------*/    ( u& G# N2 q/ I2 E* M2 b
  121.   // RCC_CR_HSEON=0x00010000,针对RCC_CR,HSEON[16]外部高速时钟使能,设1,即外部HSE振荡器开启  
      t( Q: [, c0 J7 m& H$ ~9 {& ?
  122.   RCC->CR |= ((uint32_t)RCC_CR_HSEON);  - j9 r+ j: G; m$ x% Z
  123.   do$ Y, r. S9 _; v+ w! [/ w! T4 F
  124.   {
    % W; g5 Z! ^6 A0 G- z3 {
  125.     // RCC_CR_HSERDY=0x00020000,针对RCC_CR,HSERDY[17]外部高速时钟就绪标志,为1时,表示外部4-16MHz振荡器就绪4 o* A# ^' ?/ j
  126.     HSEStatus = RCC->CR & RCC_CR_HSERDY;  // 如果RCC_CR第[17]=1,那么HSEStatus=1, e& o6 z6 H: L% \9 K5 O% Y
  127.     StartUpCounter++;  
    1 e/ D( `% I* {0 N/ f
  128.   }
    6 m8 ?$ f' g0 s: r" D
  129.   // 当HSEStatus=1或StartUpCounter=0x0500时,跳出循环,while循环后面加;表示空循环
    $ ~. z) w6 W8 K3 t( U4 m
  130.   while((HSEStatus == 0) && (StartUpCounter != HSE_STARTUP_TIMEOUT));
    5 d3 Q, D0 R8 T4 e4 u# |4 G3 {" V
  131.   if ((RCC->CR & RCC_CR_HSERDY) != RESET)  // 当RCC_CR第[17]位HSERDY=1时执行if里面的函数
    + f( m4 S- D& C! ^/ r0 S" {
  132.   {
    5 i: q$ w9 U# i9 x9 A* D$ P
  133.     HSEStatus = (uint32_t)0x01;: I+ ]9 I7 Q; l' F
  134.   }
    ( [- p- t1 m! u2 S* O; R- H4 `" Y
  135.   else& {+ i# [$ H9 y2 f2 J& e3 J, C7 @7 b
  136.   {
    . [; |/ R! j: b5 m7 I" r
  137.     HSEStatus = (uint32_t)0x00;
    & P3 a  W# Y+ }6 I5 Q5 M* E% g
  138.   }  
    - O. o0 i# d: Y4 H" J7 o/ f0 R
  139.   if (HSEStatus == (uint32_t)0x01)
    # O2 J7 }' g) \; U6 T1 y) f
  140.   {; h" g+ o* D  \2 t
  141.     // FLASH_ACR_PRFTBE=0x10,针对FLASH_ACR,PRFTBS[5]预取缓冲区状态,设1,即预取缓冲区开启- `5 F5 m1 z! l; T
  142.     FLASH->ACR |= FLASH_ACR_PRFTBE;   
    3 |7 l3 z# N8 x
  143.     // 第一步,FLASH_ACR_LATENCY=0x03,针对FLASH_ACR寄存器,[0:1]位先至0,[2:7]位不操作
    5 R# K# F5 {) G/ R8 o' B
  144.     FLASH->ACR &= (uint32_t)((uint32_t)~FLASH_ACR_LATENCY);  
    " r' F+ G* t: m+ }; N- O  ~
  145.     // 第二步,FLASH_ACR_LATENCY_2=0x02, 针对FLASH_ACR寄存器,[0:1]位至10,[2:7]位不操作: |( X) v/ T* W
  146.     FLASH->ACR |= (uint32_t)FLASH_ACR_LATENCY_2; //LATENCY[0:2]时延,设两个等待状态,当48MHz<SYSCLK≤72MHz
    6 H1 i( r6 [/ x$ `$ H% B
  147.     // RCC_CFGR_HPRE_DIV1=0x00000000,主要针对RCC_CFGR,HPRE[4:7]位设0000,对AHB预分频配置为SYSCLK不分频,HCLK=SYSCLK
    1 p, a  R( R' _) f7 y; Y. o$ q
  148.     RCC->CFGR |= (uint32_t)RCC_CFGR_HPRE_DIV1;
    4 h4 d; P, P# x* v
  149.     // RCC_CFGR_PPRE2_DIV1=0x00000000,主要针对RCC_CFGR,PPRE2[11:13]位设000,对高速APB2配置为HCLK不分频,PCLK2=HCLK
    % l4 S$ B" T/ n# V# G# M5 v
  150.     RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE2_DIV1;0 e4 Y' A0 p# j4 `' j( {* t
  151.     // RCC_CFGR_PPRE1_DIV2=0x00000400,主要针对RCC_CFGR,PPRE1[8:10]位设100,对低速APB1配置为HCLK 2分频,PCLK1=HCLK/28 |/ R6 `8 _; W0 R4 a
  152.     RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE1_DIV2;  ]& ~7 E  l$ P
  153.     #ifdef STM32F10X_CL      
    ! O$ D6 U$ L' `) |/ n* e# }: W9 C0 R
  154.       RCC->CFGR2 &= (uint32_t)~(RCC_CFGR2_PREDIV2 | RCC_CFGR2_PLL2MUL | RCC_CFGR2_PREDIV1 | RCC_CFGR2_PREDIV1SRC);               
    " H& P5 B0 S; a
  155.       RCC->CFGR2 |= (uint32_t)(RCC_CFGR2_PREDIV2_DIV5 | RCC_CFGR2_PLL2MUL8 | RCC_CFGR2_PREDIV1SRC_PLL2 | RCC_CFGR2_PREDIV1_DIV5);
    " I3 U) H# n" E3 a* i1 P# M' n
  156.       RCC->CR |= RCC_CR_PLL2ON;                 // 不执行
    8 k! Z/ n: i6 o! T7 s5 e& W
  157.       while((RCC->CR & RCC_CR_PLL2RDY) == 0);   // 不执行. T  q0 A2 r7 l- O& M
  158.       RCC->CFGR &= (uint32_t)~(RCC_CFGR_PLLXTPRE | RCC_CFGR_PLLSRC | RCC_CFGR_PLLMULL);                 // 不执行
    7 I$ w% P# ]' N$ d4 _8 ~  d
  159.       RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLXTPRE_PREDIV1 | RCC_CFGR_PLLSRC_PREDIV1 | RCC_CFGR_PLLMULL9); // 不执行
    / S7 Y1 _- u( K9 c
  160.     #else   
    % d/ ^( A$ W5 D  o6 j% Y8 j6 Q# ~
  161.      /* PLL configuration:  */0 I" W. L4 p- C# j
  162.      /* RCC_CFGR_PLLSRC=0x00010000,RCC_CFGR_PLLXTPRE=0x00020000,RCC_CFGR_PLLMULL=0x003C0000,整合取非后,[16:21]位为000000,其余为1 */! l6 t: `( }+ f  p+ `
  163.      RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_PLLSRC | RCC_CFGR_PLLXTPRE | RCC_CFGR_PLLMULL));
    / u* a: j6 M! `& T
  164.      /* RCC_CFGR_PLLSRC_HSE=0x00010000,RCC_CFGR_PLLMULL9=0x001C0000) c( o- e* g' b3 Q% h. H- n
  165.      针对RCC_CFGR,[16:21]位为011101," ~* V' |" D: S1 c/ f. o! V% [- R
  166.      PLLSRC       [16]    PLL输入时钟源,        设1,    HSE时钟作为PLL输入时钟;2 R2 [" C. _* z
  167.      PLLXTPRE     [17]    HSE分频器作为PLL输入, 设0,    HSE不分频;2 D/ t. i8 ~, ?, X! D0 @$ `
  168.      PLLMUL       [18:21] PLL倍频系数,          设0111, PLL 9倍频输出,PLLCLK=HSE*9=72MHz */" G$ Y! B7 u, I% L8 M; S4 |
  169.      RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLSRC_HSE | RCC_CFGR_PLLMULL9);
    & U1 R; \+ I7 o, |
  170.     #endif
    7 \8 ~3 v0 w/ ^7 Y( [& W' B
  171.     // RCC_CR_PLLON=0x01000000,针对RCC_CR,PLLON[24]PLL使能,PLL使能
    ) ~1 M# w7 k1 [( V
  172.     RCC->CR |= RCC_CR_PLLON;
    9 _4 e, `, Q1 G' B7 u8 z
  173.     // RCC_CR_PLLRDY=0x02000000,即RCC_CR,PLLRDY[25]PLL时钟就绪标志,0 PLL未锁定;1 PLL锁定# Z6 r. d  L; m5 Q4 K$ N- y
  174.     while((RCC->CR & RCC_CR_PLLRDY) == 0) // 若RCC_CR的[25]位为1,则跳出循环7 F0 N* ~+ b3 l. w6 D
  175.     {
    4 N8 ^: O3 L7 y' }% f. m7 G9 a
  176.     }    4 F5 B; b" a. C
  177.     // RCC_CFGR_SW=0x00000003,SW[0:1]系统时钟切换,取非为00,先将RCC_CFGR的[0:1]位至00. A- e. @/ W3 a% G; l2 S
  178.     RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_SW));
    1 C3 W8 ?# u. W7 N
  179.     // RCC_CFGR_SW_PLL=0x00000002,再将RCC_CFGR的[0:1]位至10,即PLL输出作为系统时钟& ]5 k0 n/ C; D* d1 I2 s7 w/ ~
  180.     RCC->CFGR |= (uint32_t)RCC_CFGR_SW_PLL;   
    / B! L/ f8 {. W0 ?% d0 Q; v4 u- F( i
  181.     /* Wait till PLL is used as system clock source */
    6 E3 P, v$ ?. C6 Q4 O5 d3 Q1 p: P
  182.     // RCC_CFGR_SWS=0x0000000C,当RCC_CFGR的[2:3]位为10时,跳出循环  
    1 r% }4 h$ L/ }& `* P
  183.     while ((RCC->CFGR & (uint32_t)RCC_CFGR_SWS) != (uint32_t)0x08)1 l' ?$ N: n" w
  184.     {
    7 Q  c1 _" x8 h4 \
  185.     }
    % g5 t2 V3 M+ a; H0 Z$ @3 D7 c
  186.   }
    6 d, ~( @& s* n) i3 d
  187.   else# b: p8 }7 b3 X9 n0 q; U
  188.   {
    , E4 o1 ?, [) l8 g( i: Q
  189.   }  S' J1 Q3 b$ w  |- J& x
  190. }1 u0 {, U4 z; K. b, a0 z$ B
  191. #endif
复制代码
5 ?9 f7 n2 T! J, W# X
上述函数系统初始化后,时钟频率72MHz,APB1时钟频率为72MHz,APB2时钟频率36MHz,AHB时钟频率72MHz。
3 e) B' x, e7 ]* L/ Q————————————————1 `, g* e% l' H! J$ F
版权声明:天亮继续睡
' ~* |# N  J- {0 u4 }% R3 z0 ^; d" D; [( a: z4 |. E
收藏 评论0 发布时间:2022-11-20 15:40

举报

0个回答

所属标签

相似分享

官网相关资源

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