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

STM32F103配置系统时钟的代码【寄存器篇】

[复制链接]
Dylan疾风闪电 发布时间:2018-8-9 14:12
本帖最后由 Dylan疾风闪电 于 2018-8-9 15:39 编辑 ( W+ |' B1 {9 f! f, }; P6 r
1 B: v/ }8 {; ^9 H
使用举例:配置72MHZ时钟作为系统时钟#define SystemClockMHz        72//MHZ0 u; ~, }- f: j' n* \

: j/ X0 Q- G! U! }. n  aHW_SystemClockMux(USE_EXTERNAL_HSE, SystemClockMHz) ;# {: o, ]. z1 `' u
HW_SystemClockMux(USE_INTERNAL_HSI, SystemClockMHz);
" t7 E/ N) ^2 S9 o( O- O; L3 o; M6 M9 G
; a3 G1 p4 |; I3 c( }2 D2 U/ d
3 J4 l" M5 K5 p1 M9 d
---------------------------------------------------------------------------------------------
  B. V" ~4 Z' v, A) f代码已验证。发个帖子,便于自己移植使用。9 R) h3 {3 \+ j3 O+ N! C
; ?) s- J/ F9 F

  n2 k+ n3 y5 m% W/ o
  1. /* Const to source of high speed clock:internal or external. */7 f2 P5 n# k( m9 O' D3 j
  2. #define        USE_EXTERNAL_HSE                                                0
    + W* y, E0 c7 l0 Y1 t: N" Z8 }
  3. #define        USE_INTERNAL_HSI                                                1
    1 \: K* g3 h+ g/ h3 l
  4. /**
    6 s  m  e) z6 X+ U
  5.   * <b>配製系統主時鐘頻率。</b>
    0 R) q$ \* V$ e* D$ c
  6.   * <p>功能:選擇時鐘源,并進行PLL倍頻。0 O. G0 Q8 ~& n- }+ P' f
  7.   * @param  osc   高速時鐘源的選擇。! q1 n6 S' A, I- y, p7 D! ?' z* H
  8.   *            @arg USE_EXTERNAL_HSE: 外部高速晶振) _7 M/ g2 P6 B4 c
  9.   *            @arg USE_INTERNAL_HSI: 內部高速晶振
      i8 n. }. d5 L  x2 s4 {/ k6 u
  10.   * @param  maxFreq 芯片最大主频?M,查询对应的数据手册
    ! u$ I$ _1 u$ U, ^& v
  11.   * @return         osc7 y% a3 ]& J( x# v% m) S- @
  12.   * @version                2.0.0.0(20160407)
    " c+ R/ ^: U, \) @
  13.   * <p-2014>实现CM0与CM3兼容完成!5 G9 [( |& n$ G" g
  14.         * <p-2016>對字符串/單詞進行變更。7 `: v" o5 G, p
  15.   * @author             Dylan% H) T, w% P6 e/ R. X+ f
  16.   */
    ' s) M5 p' T+ E% `; {1 e
  17. uint8_t HW_SystemClockMux(uint8_t osc, uint8_t maxFreq)9 ]0 n6 [" I# W, Y, `+ x
  18. {
    , h# {  h. s( l$ x7 |8 ]: ]
  19. #if defined (STM32F100) || defined (STM32F101) || defined (STM32F103)  p& S0 k6 M6 D& L' k5 i' s
  20.         uint8_t errCode = 0xff;4 [% L' `4 D2 c6 i) Y3 f
  21.         uint32_t sTimeCount, sTimeMax = 0xFFF;
    * f; F, _) Y# P6 Y
  22. #endif1 F5 [2 T9 N. d' f8 ?/ W  i
  23.         
    6 `5 R! O$ f+ A
  24.   HW_SystemPowerON();5 V) h/ B2 v; Y: ^9 |5 v. M- x$ U
  25.   . y1 q3 g- q8 r  U, D( {9 g$ M; z( |
  26.         switch(osc)" r7 T1 e* a+ z0 {5 O
  27.         {
    0 x: ?$ J  I/ ?
  28.                 case USE_EXTERNAL_HSE:) f: ~  Z0 e5 g6 \+ p) z7 X) h! {/ x
  29. #if defined (STM32F100) || defined (STM32F101) || defined (STM32F103)4 F/ z/ s8 N$ O$ S, g
  30.                         RCC->CR |= 1<<16;       //HSEON
    , I2 A4 R* H% g; u, P$ ^
  31.                
    7 L7 s% g$ x+ r, {, c" p/ a
  32.                         sTimeCount = sTimeMax;; Q" H- C0 C' F2 H+ D
  33.                         while(((RCC->CR>>17) & 0x1) == 0) //等待HSE就绪
    4 K* B" m: ?& X, K2 ^4 a
  34.                         {! e3 t* t6 ^& a# \2 Y. o
  35.                                 if (sTimeCount--) return errCode;
    * ]$ m# G3 s2 X& z' l# \& L) v  N
  36.                         }( F+ M  z( |8 C* F. F/ ^* F
  37.                         
    , x3 @9 ^1 X5 x/ U9 _
  38.                         RCC->CFGR |= (maxFreq/8-2)<<18; //设置PLL值倍频//HSE 8MHz5 J6 T1 R. Y- E. b
  39.                         6 @& e( `2 {7 y
  40.                         RCC->CFGR |= 1<<16; //切换PLL输入时钟源为0->1:HSI/2(4MHz)->HSE(8MHz)' O! n  g: S! w! O+ C+ a+ M
  41.                         
    . t9 P, t) P( x7 L6 w+ U* v
  42.                         //存在等待状态时,必须先开启预取缓冲区4 o: ?" p8 r7 J# L
  43.                         if (maxFreq <= 24)
    1 b2 h; T: t1 F  o2 {( g" @) ]2 D
  44.                                 FLASH->ACR |= 0x30;//000:零等待状态,当 0 < SYSCLK ≤ 24MHz
    + h+ m% O/ ~( G5 J) O  L
  45.                         else if (maxFreq <= 48)/ g; N( W9 P  F) B3 T$ ^0 q/ R
  46.                                 FLASH->ACR |= 0x31;//001:一个等待状态,当 24MHz < SYSCLK ≤ 48MHz. c+ G0 U& o2 \0 @
  47.                         else5 @0 r* G5 `7 x# U* f
  48.                                 FLASH->ACR |= 0x32;//010:两个等待状态,当 48MHz < SYSCLK ≤ 72MHz; l( V2 o) g* g/ E1 ~1 \4 X
  49.                         
    5 H2 R* r! D* J3 c, k
  50.                         RCC->CR |= 1<<24;                   //PLLON
    . l8 x5 `" Y& _9 ~7 R8 v
  51.                         
      j' }. U1 A% N: {, @1 ]
  52.                         sTimeCount = sTimeMax;
      c  Q- {8 |7 l* N, Y' A
  53.                         while(((RCC->CR>>25) & 0x1) == 0)  //等待PLL就绪/ G( R; R) Z0 v
  54.                         {
    0 e# f$ o$ a& _6 ^5 T
  55.                                 if (sTimeCount--) return errCode;
    . @) |$ s7 I( X) x: F- F' ~
  56.                         }
    ( L' ?9 T- l! y
  57.                         8 i5 J& y* @0 B& P* d- i- R# Y
  58.                         RCC->CFGR |= 0x2;                   //PLL作为sysClk5 b& C& T) E( w! y% X  D
  59.                         2 ^; {* g* o' m; |& U2 C+ R
  60.                         sTimeCount = sTimeMax;
    % s7 E7 f/ X9 g6 r& E$ z7 G
  61.                         while(((RCC->CFGR>>2) & 0x3) != 0x02)  //等待sysClk就绪# S% L# {9 G' F* s- b4 \
  62.                         {( r4 d- h* J% T, \
  63.                                 if (sTimeCount--) return errCode;
    % g* Q* @. E0 B3 S7 B' `
  64.                         }8 s) A5 L2 I1 ~6 e/ t9 U
  65. #elif defined  (STM32F051) || defined  (STM32F042) //none. l; F0 i* K" ?( j$ o, a6 o6 T
  66. #else5 f) q' H5 j9 U
  67.                 #warning "Make sure needn't define STM32Fxxx etc. ?"
    " c! X+ Y& t+ p7 M
  68. #endif
    ) d0 z" g" B/ x' d
  69.                         break;
    ( c2 Z" t- M& v  A( E
  70.                 default:                //case USE_INTERNAL_HSI:% |, Z7 P2 i# e+ D
  71.                         RCC->CFGR &= 0xFFFEFFFF; //HSI 8MHz/2
    ' g( V! u% a2 L7 {0 k6 o2 R
  72.                         RCC->CFGR |= ((maxFreq>>2)-2)<<18; //设置PLL值倍频
    ( P- f; }, n9 k3 l
  73.                         ! A% m- w# Y# E2 Z& @- j5 P
  74.                         //存在等待状态时,必须先开启预取缓冲区! B9 A" U* ^  K( f- e5 k8 {8 \9 N
  75.                         if (maxFreq <= 24)  Y- o9 ~- M) O4 v; R* Y9 E; U
  76.                                 FLASH->ACR |= 0x30;//000:零等待状态,当 0 < SYSCLK ≤ 24MHz/ c4 r, p6 D: |/ [# \+ x! \4 G. P
  77.                         else if (maxFreq <= 48)
    : }  A, F, }- q; \7 X  O# ~
  78.                                 FLASH->ACR |= 0x31;//001:一个等待状态,当 24MHz < SYSCLK ≤ 48MHz6 P+ `5 m4 b" M( d% h. m6 G
  79.                         else2 n" ~' W6 I/ n  C  K% f- ]8 U: Z- m1 s
  80.                                 FLASH->ACR |= 0x32;//010:两个等待状态,当 48MHz < SYSCLK ≤ 72MHz! F% R* P. g2 @7 t& _
  81.                         ! ]! E0 s4 P* D+ ^* ^4 B' s
  82.                         RCC->CR |= 1<<24;                   //PLLON
    # j0 k9 T. j; L' H% p' O: l8 {$ p
  83.                         while(((RCC->CR>>25) & 0x1) != 1);  //等待PLL就绪5 o# Z) t1 F0 |0 g7 i. E
  84.                         RCC->CFGR |= 0x2;                   //PLL作为sysClk4 _2 b3 B3 z" Q# n! Q& \
  85.                         while(((RCC->CFGR>>2)&0x3) != 0x02);  //等待sysClk就绪$ z5 K# j$ y; Z" p$ ]
  86.                         break;
    6 l0 B7 \0 C! D8 V0 |- I
  87.         }
    ! m1 L  N( C" A
  88.         
    6 o, u6 D; d$ C8 L. s0 R
  89.         return 0;, W* s7 V: }7 S# p' F1 K8 m5 c
  90. }
    6 \. }$ m2 ^+ K9 h$ a; x0 y

  91. . x( W/ U# `5 p8 }; V/ p$ ~- |8 `  U8 ?
  92. /**
    6 f, g2 r% i( V5 C1 V5 a
  93.   * <b>芯片上电默认时钟配置。</b>* ]/ c( n+ ~* _6 X* u  T
  94.   * <p>功能:用来恢复时钟系统到上电默认状态。
    . \  b( R7 d5 }9 B
  95.   * @version                1.1.0.0(20140228)$ {1 L; |4 I. X+ T% K8 ]
  96.   * <p-2014>实现CM0与CM3兼容完成!
    7 t, J4 J& _& M( c  W% f
  97.   * @author             Dylan! _" `; A9 P4 h' n) c1 U" Z  m
  98.   */) K# t: ^. z) i5 s
  99. void HW_SystemPowerON(void)) K4 j# k9 a: S, F9 w1 O$ \& l
  100. {* _  F0 `! a; o) [$ w5 m4 e* [5 J
  101. #if defined  (STM32F051) || defined  (STM32F042)
    $ U5 M" ]1 y5 N" I9 c
  102.         RCC->CR |= 0x00000001;//HSION
    2 }, E6 b6 u0 l1 I$ l: j  P

  103.   C4 l. w' C9 H: n4 G% o
  104.         RCC->CR &= 0x0202FFFF;/* Reset HSEON, CSSON and PLLON, HSEBYP bit */
    & p$ a! F7 I. K9 t. s" X' E

  105. 8 M: M* J9 i) M1 g9 I! q1 n; p
  106.         RCC->CFGR &= 0x0000000C;/* Reset SW[1:0], HPRE[3:0], PPRE[2:0], ADCPRE and MCOSEL[2:0],PLLSRC, PLLXTPRE and PLLMUL[3:0] bits */$ x; j8 y: H! O! @4 Q

  107. 5 m" p+ V9 g9 Q$ F6 ~
  108.         RCC->CFGR2 &= 0x00000000;/* Reset PREDIV1[3:0] bits *///与CFGR[17]一起用作HSE-PLL设置! n9 ]& T. J4 E7 t  Q
  109. 3 W1 u; D& E8 x3 C, Q1 L; A6 A  |
  110.         RCC->CFGR3 &= 0x00000000;/* Reset USARTSW[1:0], I2CSW, CECSW and ADCSW bits */
    - W# L* P- {1 R9 I
  111. $ i) K3 k( B: U. N) }
  112.         RCC->CR2 &= 0xFFFFFFFE;/* Reset HSI14 bit */4 H. |/ x6 x! ^( p0 s( C; B
  113. , S) d- }1 M) o5 V
  114.         RCC->CIR = 0x00000000;/* Disable all interrupts */9 F9 m6 Z( A2 O6 R% m  n# @0 q

  115. + B; Y/ N: S! O' ^* J" R
  116. #elif defined (STM32F100) || defined (STM32F101) || defined (STM32F103)* {! H. G5 K3 r7 N# I! G
  117.         RCC->CR &= 0x0000FF83;//把HSI调整到8MHz±1%==》开启HSI==》等待就绪' m7 m. w) V! t& b. k$ P
  118. / X/ _+ @, z% c1 c
  119.         RCC->CFGR = 0x00000400;//限制APB1时钟是HCLK_Div2
    1 X% h  Z; x9 J2 o8 I! D( ]/ H$ h

  120. 7 T' E2 I* l9 i
  121.         RCC->CIR = 0x00BF0000;//清除所有的RCC中断标志
    9 I& F8 L4 G0 k. }

  122. 9 w  e2 }9 [8 e3 x. `2 A3 W
  123.         //配置向量表5 U2 h0 s, n9 k  u9 Q
  124.         #ifdef  VECT_TAB_RAM
    / n( H' O  T. Y$ Q0 P* f
  125.         /* Set the Vector Table base location at 0x20000000 */
    0 r2 E/ U) A2 a& ]
  126.         NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0);& R# w$ Y  ]8 B6 ]" ^4 d! j1 ^
  127.         #else  /* VECT_TAB_FLASH  */
    2 ]# X9 o3 @: Z/ `
  128.         /* Set the Vector Table base location at 0x08000000 */( O4 o& k) g4 Q  P
  129.         NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);
    - q! C9 Z+ X' G2 i- z6 U' [
  130.         #endif
    $ Y! d. Q- b. ~9 Y6 P+ [6 T9 E+ R
  131. #else
    5 Y- ]# |" f# u% {7 V9 L; k
  132.         #warning "Make sure needn't define STM32F051 etc. ?"
    + T; r' u& I$ O5 p  H/ g
  133. #endif0 w' a/ ~" J; \! G+ k8 D
  134. }
复制代码
0 Q% B) s# F" R7 O

% X" y* D0 T% T7 H
赞 收藏 评论1 发布时间:2018-8-9 14:12

举报

1个回答
ld8lk8-282408 回答时间:2018-9-5 08:51:24
不错

所属标签

相似技术帖

官网相关资源

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