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

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

[复制链接]
Dylan疾风闪电 发布时间:2018-8-9 14:12
本帖最后由 Dylan疾风闪电 于 2018-8-9 15:39 编辑
# N& ], ^1 ~/ A( E) Z7 y! S
/ g5 g7 V+ s' k, p使用举例:配置72MHZ时钟作为系统时钟#define SystemClockMHz        72//MHZ
6 q5 e# z- U) H; f4 U. `) F
3 A$ I" z  [0 q! o+ U3 _* o
HW_SystemClockMux(USE_EXTERNAL_HSE, SystemClockMHz) ;7 L0 X  L1 n0 z, K  Q) p
HW_SystemClockMux(USE_INTERNAL_HSI, SystemClockMHz);
' I# R/ `# `9 O& C
6 L* g% i0 P# J4 q6 P$ k
# Z# E, w& i% g+ o
; K  K+ |5 Q5 {4 P4 Q% R) l
---------------------------------------------------------------------------------------------9 ?0 a$ }! i- T- v
代码已验证。发个帖子,便于自己移植使用。: X: U# V! P+ }' M, {# j* f
3 |. I! R! @% N0 r# a" ?
! B+ v# o, p: K
  1. /* Const to source of high speed clock:internal or external. */
    * m) F; a1 G* b! J9 k
  2. #define        USE_EXTERNAL_HSE                                                0
    & W( W  L/ Q5 L; S  N. y5 F4 ^" D! o( F
  3. #define        USE_INTERNAL_HSI                                                1; m) s1 d/ z& @( ^
  4. /**
    9 P0 R' c6 ]+ _) r1 V
  5.   * <b>配製系統主時鐘頻率。</b>) _. X8 W4 }$ n( q% ~& ?" W
  6.   * <p>功能:選擇時鐘源,并進行PLL倍頻。0 R5 O+ E' f  `: @2 t0 Y% c
  7.   * @param  osc   高速時鐘源的選擇。, x: `! E, q2 `/ {( ]; P1 v0 y# i
  8.   *            @arg USE_EXTERNAL_HSE: 外部高速晶振
    ; l! _' H, A4 {9 v1 ~! {" Y% ~) N
  9.   *            @arg USE_INTERNAL_HSI: 內部高速晶振
    3 w2 ?! s+ P' S5 r( p0 b
  10.   * @param  maxFreq 芯片最大主频?M,查询对应的数据手册4 i" H( P# O% d7 G2 x9 M
  11.   * @return         osc
    2 c+ D2 @$ E$ L, l' @* I& f. c. I
  12.   * @version                2.0.0.0(20160407)
    6 o5 a; q" S2 ]2 t4 `/ s: k/ q
  13.   * <p-2014>实现CM0与CM3兼容完成!
    + H- f2 y2 g# p5 k' m" p) ~
  14.         * <p-2016>對字符串/單詞進行變更。
    & W( N7 ]. a  Y. Z% {
  15.   * @author             Dylan8 V( Y2 J3 g6 H# c3 @3 H
  16.   */" @1 J% u  E) f2 ~4 ~; l" R: }
  17. uint8_t HW_SystemClockMux(uint8_t osc, uint8_t maxFreq)
    # s- d1 ^) i8 |; z! M0 q
  18. {! z# }1 w: M* `; S
  19. #if defined (STM32F100) || defined (STM32F101) || defined (STM32F103)
    8 G! A* y4 o) [) J" G8 ^
  20.         uint8_t errCode = 0xff;
    - |8 P, U; f& y) _* N6 u7 ~; @4 `1 d
  21.         uint32_t sTimeCount, sTimeMax = 0xFFF;: a! n/ H2 g6 {/ b; e) s# E7 Z
  22. #endif, [9 a* F% V* w7 A2 v# y4 I
  23.         # B8 S+ n. s6 G9 }
  24.   HW_SystemPowerON();
    ! ~5 y& F2 j* [4 |& L
  25.   
    , n3 p( N, r7 \9 X- W$ c& b$ N
  26.         switch(osc)8 F  \2 L6 C9 h3 ~. V
  27.         {9 p# ~5 J: n+ b2 }; i' z  x
  28.                 case USE_EXTERNAL_HSE:: S) O- m1 c4 D5 t& c  z
  29. #if defined (STM32F100) || defined (STM32F101) || defined (STM32F103): F: ~! I& i; H) S' x( ]2 g8 _
  30.                         RCC->CR |= 1<<16;       //HSEON
    . `4 W1 P, P/ O  T1 f
  31.                 3 M" _6 @( u  {8 K8 t
  32.                         sTimeCount = sTimeMax;3 r6 f9 s; N0 q$ w
  33.                         while(((RCC->CR>>17) & 0x1) == 0) //等待HSE就绪. n: x% B$ W) x
  34.                         {; x) I" x( V5 n- U
  35.                                 if (sTimeCount--) return errCode;/ R) c7 e9 C# a' F8 s2 ?  ]
  36.                         }4 ]/ W) R! w' N& V
  37.                         
    ) H* G$ V$ D# C7 u
  38.                         RCC->CFGR |= (maxFreq/8-2)<<18; //设置PLL值倍频//HSE 8MHz. D. u- ^( v" Y
  39.                         
    , w( p/ N; [3 M; Y0 p+ H
  40.                         RCC->CFGR |= 1<<16; //切换PLL输入时钟源为0->1:HSI/2(4MHz)->HSE(8MHz)
    " }2 @4 G  [' `) J; I
  41.                         + H2 a9 C) i* I3 A9 O) K) @
  42.                         //存在等待状态时,必须先开启预取缓冲区- u0 Q: O- |5 I) s+ W( `, {
  43.                         if (maxFreq <= 24)
    ) X4 f  b* x" ]9 H' _& e: V7 w
  44.                                 FLASH->ACR |= 0x30;//000:零等待状态,当 0 < SYSCLK ≤ 24MHz
    / S# w7 H! T+ g% ?. k
  45.                         else if (maxFreq <= 48)
    5 }/ E6 \) X# z
  46.                                 FLASH->ACR |= 0x31;//001:一个等待状态,当 24MHz < SYSCLK ≤ 48MHz; u7 E$ Y/ h6 X: l. }! S
  47.                         else5 l) \8 f" u4 l$ d
  48.                                 FLASH->ACR |= 0x32;//010:两个等待状态,当 48MHz < SYSCLK ≤ 72MHz
    & c9 p' d& ~7 Q3 {0 t! l' ~  L- i
  49.                         
    ' t$ d5 n& J# z* T( t# D- k  K
  50.                         RCC->CR |= 1<<24;                   //PLLON
    1 O( R- D, Q; K/ {
  51.                         
      C& r6 I; T: ~
  52.                         sTimeCount = sTimeMax;! U# ^8 H6 G! L( d+ B! \: N( H& E7 [
  53.                         while(((RCC->CR>>25) & 0x1) == 0)  //等待PLL就绪
    0 M+ z2 J) e% D/ c4 {9 U. D% h
  54.                         {
    4 _$ p) q% F7 n  e; J, D% b
  55.                                 if (sTimeCount--) return errCode;
    ; O3 N2 T5 c2 w0 c4 ]' L
  56.                         }  a* @( k, l7 c
  57.                         6 x4 t& s3 }. I+ R! ^- C
  58.                         RCC->CFGR |= 0x2;                   //PLL作为sysClk
    # f3 v, Z2 C& {# T! p4 l9 W
  59.                         
    & y; r; M& I/ ]( Y: D3 J8 K
  60.                         sTimeCount = sTimeMax;
    * ^4 J4 W' g4 b
  61.                         while(((RCC->CFGR>>2) & 0x3) != 0x02)  //等待sysClk就绪
    , J$ Z" A- ]  D: m3 N( `8 }
  62.                         {! U8 ?# `* n( V! E* B9 N, R0 ~/ K$ k
  63.                                 if (sTimeCount--) return errCode;
    ; i6 J8 X0 P- g/ g5 C& J/ @  |
  64.                         }+ i0 e$ W/ Z- q2 a* R
  65. #elif defined  (STM32F051) || defined  (STM32F042) //none* r! H' B" a( M/ i" q
  66. #else& |3 q6 Q( s! Y" a3 y
  67.                 #warning "Make sure needn't define STM32Fxxx etc. ?") m& v) I  Q7 }' w* g
  68. #endif
    $ z0 E/ T' Q: V6 K
  69.                         break;
    " B. L$ U- J0 w! ]5 \8 x; p
  70.                 default:                //case USE_INTERNAL_HSI:
      |3 |$ x$ Y' M* q2 I8 X- ]9 X
  71.                         RCC->CFGR &= 0xFFFEFFFF; //HSI 8MHz/29 o' p- ?4 N+ Z1 O! x: G
  72.                         RCC->CFGR |= ((maxFreq>>2)-2)<<18; //设置PLL值倍频
    ; R+ ?8 ?- s, \& W/ c0 ]  I
  73.                         
    # P/ A. c3 U7 B. u
  74.                         //存在等待状态时,必须先开启预取缓冲区
    ; f. p' C  U' o/ M- g0 Y# j7 X
  75.                         if (maxFreq <= 24)8 Q# Q' o' F8 m
  76.                                 FLASH->ACR |= 0x30;//000:零等待状态,当 0 < SYSCLK ≤ 24MHz0 m8 l) F+ T3 N8 z9 i
  77.                         else if (maxFreq <= 48)
    # y3 \; n' ?# \. T
  78.                                 FLASH->ACR |= 0x31;//001:一个等待状态,当 24MHz < SYSCLK ≤ 48MHz
    , [/ n' w4 p; v1 C+ u
  79.                         else
    0 g" z7 t) o. J+ K! e  x
  80.                                 FLASH->ACR |= 0x32;//010:两个等待状态,当 48MHz < SYSCLK ≤ 72MHz. e1 b! M" ^3 z$ v
  81.                         
    + w) R$ P7 Y( }% \, |' ^! s
  82.                         RCC->CR |= 1<<24;                   //PLLON
    . ?0 u: q' k" E0 J" n
  83.                         while(((RCC->CR>>25) & 0x1) != 1);  //等待PLL就绪
    $ V  _6 u/ T0 B/ K5 |& k; P
  84.                         RCC->CFGR |= 0x2;                   //PLL作为sysClk
    7 A# z  z) c6 {( o: D  w% A
  85.                         while(((RCC->CFGR>>2)&0x3) != 0x02);  //等待sysClk就绪
    2 [6 a3 F3 X3 O! I/ J* ^
  86.                         break;; C5 A2 C: A7 A/ I/ r6 u
  87.         }
      x/ A- T+ Y4 |3 U  j/ k
  88.         
    & s. O6 v' ~% _: j" S
  89.         return 0;
    & E1 Z! V2 b+ q, l
  90. }
    1 T7 K6 E) ~4 O. f& w. e" t
  91. ) E! \8 P1 X/ S& J
  92. /**+ x' M, u, X5 [5 ^2 V
  93.   * <b>芯片上电默认时钟配置。</b>$ K+ N4 ]7 q7 \
  94.   * <p>功能:用来恢复时钟系统到上电默认状态。3 R* \$ j6 |+ h5 k. g
  95.   * @version                1.1.0.0(20140228)8 `: l9 Q- X3 }+ ]
  96.   * <p-2014>实现CM0与CM3兼容完成!( h6 u7 p( a. E. \
  97.   * @author             Dylan; l. }6 ?' a- S, S* |4 V8 F8 j
  98.   */" U3 I3 @+ H7 d6 J
  99. void HW_SystemPowerON(void)
    4 |0 |  Q4 D+ I; Z) j' b
  100. {
    " t' y, [! U5 u8 G7 m6 n  R' I+ B8 n
  101. #if defined  (STM32F051) || defined  (STM32F042)
    % {( O  O/ m% d) ~+ i' ^  w9 ?# y6 N
  102.         RCC->CR |= 0x00000001;//HSION
    . \  {) d9 f( r& Q+ e3 N7 m

  103. , N( j5 E) `. T2 L1 a! @7 A
  104.         RCC->CR &= 0x0202FFFF;/* Reset HSEON, CSSON and PLLON, HSEBYP bit */
      m2 l$ z7 J$ ~8 P! W
  105. - [$ M& V; w0 M; y# _+ M, [/ Y8 ]# X
  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 */) u: I4 L; ^3 Y! Z

  107. 7 r$ `1 Z* u9 p! k9 G. s) r
  108.         RCC->CFGR2 &= 0x00000000;/* Reset PREDIV1[3:0] bits *///与CFGR[17]一起用作HSE-PLL设置
    0 T3 k; o9 R# L3 x

  109. 5 }) ~* u, y: B7 P/ h3 N# \
  110.         RCC->CFGR3 &= 0x00000000;/* Reset USARTSW[1:0], I2CSW, CECSW and ADCSW bits */
    3 \1 Q- q/ Q' v* P/ I+ X2 I, z9 q
  111. - a& q* s" o* N' e3 w* U: A
  112.         RCC->CR2 &= 0xFFFFFFFE;/* Reset HSI14 bit */7 w1 @) K# U9 W5 h7 B% |/ N

  113. 5 y% j* T3 H8 j' U1 }& W5 B% i
  114.         RCC->CIR = 0x00000000;/* Disable all interrupts */
    " {' _' r- \# _8 x  z# s" w
  115. - N$ S1 W& @7 q1 k
  116. #elif defined (STM32F100) || defined (STM32F101) || defined (STM32F103)
    3 c5 E! s* i7 L9 e# O+ D) q
  117.         RCC->CR &= 0x0000FF83;//把HSI调整到8MHz±1%==》开启HSI==》等待就绪; [# D0 G% ], ?* M
  118. $ H$ Z- n+ R" K- O, {* b: n$ C
  119.         RCC->CFGR = 0x00000400;//限制APB1时钟是HCLK_Div20 b3 x7 F: V. e1 A3 b2 U
  120. : _3 W3 `8 W: Z* [: D
  121.         RCC->CIR = 0x00BF0000;//清除所有的RCC中断标志4 Z# Z' u; C% w" ]3 k5 d/ S

  122. 8 s( F1 t# J' D5 T0 l6 B4 P" S
  123.         //配置向量表
    9 W" W. ?+ H7 o/ i, \
  124.         #ifdef  VECT_TAB_RAM; g, }+ U) {0 P, d+ ?' N
  125.         /* Set the Vector Table base location at 0x20000000 */
    / |2 i! x& |/ t. A$ m5 E0 d3 x
  126.         NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0);2 z$ z  W/ I9 g  [& I" M8 v- T
  127.         #else  /* VECT_TAB_FLASH  */6 l, V6 w* Y9 P/ `+ q# u% D
  128.         /* Set the Vector Table base location at 0x08000000 */
    ( i( I* Z1 E2 t/ C1 A* k+ I
  129.         NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);
    6 V* x. i  L4 Z
  130.         #endif
    6 i! y5 i6 n! w6 R
  131. #else
      H8 _/ x. _- |# r4 H: L  _& R
  132.         #warning "Make sure needn't define STM32F051 etc. ?"
    . i4 b" J) ?5 o1 D+ c- k. T6 T
  133. #endif/ S( F/ U/ R7 z4 K5 a& b
  134. }
复制代码

% S7 ~8 H* V' s1 s; C  l$ h4 G" g' ]  W6 N! E
收藏 评论1 发布时间:2018-8-9 14:12

举报

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