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

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

[复制链接]
Dylan疾风闪电 发布时间:2018-8-9 14:12
本帖最后由 Dylan疾风闪电 于 2018-8-9 15:39 编辑
8 E' e: s. V* T8 j- C1 Q+ i2 U* v1 w' X5 ?! f5 k
使用举例:配置72MHZ时钟作为系统时钟#define SystemClockMHz        72//MHZ
2 o9 h1 T0 M. S4 I. c, u; ~. l: a3 y

5 U# n" k0 P) {* [( \2 J  t7 E4 xHW_SystemClockMux(USE_EXTERNAL_HSE, SystemClockMHz) ;
: S; b$ J- q# J" qHW_SystemClockMux(USE_INTERNAL_HSI, SystemClockMHz);
( u% u8 [3 Z; V: A. @) D
) R8 J; K6 y0 m$ c- _: D! x
6 C- h, ~4 P4 T
6 v+ u: E( U$ j& y2 V9 B$ m* Q2 R
---------------------------------------------------------------------------------------------
" l# H+ o6 B% Z% w% C# l代码已验证。发个帖子,便于自己移植使用。4 ?$ k2 S4 T/ Y7 M3 Z; n8 Y

- d9 Y, g( E& T( s1 Z5 U3 j% e  ]7 ]  q4 H
  1. /* Const to source of high speed clock:internal or external. */
    ; y7 T1 W' R3 C- N
  2. #define        USE_EXTERNAL_HSE                                                0
    8 o  d* u( s  J1 M0 _$ a1 m% Z5 u
  3. #define        USE_INTERNAL_HSI                                                1
    , ^0 A8 l; A3 D; x+ ]4 ]# A" f$ F0 `
  4. /**
    $ w. A. u  m5 r9 J- ]9 i( J
  5.   * <b>配製系統主時鐘頻率。</b>
    ' p9 i$ L& G9 c8 r+ l
  6.   * <p>功能:選擇時鐘源,并進行PLL倍頻。
    1 `" ^9 U- u; @2 f8 o
  7.   * @param  osc   高速時鐘源的選擇。" g' @; R  E/ o$ S, m  N
  8.   *            @arg USE_EXTERNAL_HSE: 外部高速晶振, F3 O* y; G0 W1 B) ]( p
  9.   *            @arg USE_INTERNAL_HSI: 內部高速晶振3 T2 g5 w) t/ g# n) P
  10.   * @param  maxFreq 芯片最大主频?M,查询对应的数据手册
    6 k8 H1 J) @/ C" O1 C8 r( J% \9 Z
  11.   * @return         osc1 E0 a1 ]2 _2 i9 V9 Q( O& r
  12.   * @version                2.0.0.0(20160407)
    # W8 J( M% h8 v* m- }
  13.   * <p-2014>实现CM0与CM3兼容完成!
    * C2 R7 ]8 S* w
  14.         * <p-2016>對字符串/單詞進行變更。
    3 V& N8 i( `# V; @9 u. ]* R/ ]5 g
  15.   * @author             Dylan3 V7 M, l' P" G0 q3 t8 M
  16.   */
    9 G" `; `# }( T2 X
  17. uint8_t HW_SystemClockMux(uint8_t osc, uint8_t maxFreq)
    ( Z! z% L6 l' W- v" A# Y
  18. {* b6 [: {# A7 ~5 `3 i7 ]
  19. #if defined (STM32F100) || defined (STM32F101) || defined (STM32F103)
    , o$ B7 ]. ?7 {  Z
  20.         uint8_t errCode = 0xff;
    ' R% R3 G9 n8 k. Y4 E, I! b* V- v
  21.         uint32_t sTimeCount, sTimeMax = 0xFFF;
    5 e- J+ y5 A  Y- i2 |
  22. #endif
    ! M' H: H  ?0 ^/ ]' j' y
  23.         & Y9 {) w0 X( f0 I8 C
  24.   HW_SystemPowerON();, V3 l. ^' r% q0 f- U! m
  25.   ) C& j5 p& ?& }' M4 q# U* t! p# U
  26.         switch(osc)0 O* g" e4 k  m4 D0 o# o
  27.         {* \+ n3 ?9 w% q1 r( ]
  28.                 case USE_EXTERNAL_HSE:7 [4 K/ L! I3 c7 u- Z
  29. #if defined (STM32F100) || defined (STM32F101) || defined (STM32F103); Y# g  N( c: H, A5 C8 \. Q
  30.                         RCC->CR |= 1<<16;       //HSEON
    $ P1 `! t: C2 Z  H% ^* @! e5 V5 p8 i
  31.                 6 E* t+ ~$ q, Z1 S4 C+ `
  32.                         sTimeCount = sTimeMax;
    ) x9 Q! {/ [$ M& `* g
  33.                         while(((RCC->CR>>17) & 0x1) == 0) //等待HSE就绪/ d* j, L6 v# e
  34.                         {5 g. h0 n& D: H
  35.                                 if (sTimeCount--) return errCode;4 \  w/ P& s: r' A* D( w
  36.                         }
    1 F1 y5 q" g5 e) H
  37.                         
    1 ~5 M4 a4 p  J  i" S+ ]
  38.                         RCC->CFGR |= (maxFreq/8-2)<<18; //设置PLL值倍频//HSE 8MHz
    # i0 ?( \$ u% \. N' A! O: G) L
  39.                         
    3 a8 ?( E: w0 l: A% v0 ]3 `
  40.                         RCC->CFGR |= 1<<16; //切换PLL输入时钟源为0->1:HSI/2(4MHz)->HSE(8MHz)2 q) q' ?  s5 w" _6 C( e
  41.                         
    ; f$ Q! D4 Z. _1 E) y
  42.                         //存在等待状态时,必须先开启预取缓冲区  {. v6 P: A+ t& D1 C' D
  43.                         if (maxFreq <= 24), D) b, G* e* u8 q' D
  44.                                 FLASH->ACR |= 0x30;//000:零等待状态,当 0 < SYSCLK ≤ 24MHz
    ( p. ]& O! s" L! X
  45.                         else if (maxFreq <= 48)# x0 T$ e% s! G3 B5 z
  46.                                 FLASH->ACR |= 0x31;//001:一个等待状态,当 24MHz < SYSCLK ≤ 48MHz
    3 v- b8 f' Q% b- n3 q
  47.                         else
    # N: E0 l3 O4 N6 k
  48.                                 FLASH->ACR |= 0x32;//010:两个等待状态,当 48MHz < SYSCLK ≤ 72MHz
    ( M, B+ R3 W+ O/ B0 S* c
  49.                         
    # E" ?% b; _: z
  50.                         RCC->CR |= 1<<24;                   //PLLON
    / h; t( e0 n7 t" P! {
  51.                         1 ^( A$ R4 ~  s& P! k& W) w
  52.                         sTimeCount = sTimeMax;8 L, S* @! h( p3 w
  53.                         while(((RCC->CR>>25) & 0x1) == 0)  //等待PLL就绪
    / l. W! k: ~' A. k( B! e8 U
  54.                         {
      K3 q4 r+ D6 d- T. }! u
  55.                                 if (sTimeCount--) return errCode;
    5 e4 z+ D( L( k7 Y) d0 _* x
  56.                         }
    7 s( D: t: M6 ]# V$ N
  57.                         
    . q7 F* j! [3 a4 Z7 a8 M
  58.                         RCC->CFGR |= 0x2;                   //PLL作为sysClk$ s) ?- O/ h. }- Y7 g" i' E
  59.                         . ]  o, J3 Q$ W3 [( B" g6 i
  60.                         sTimeCount = sTimeMax;3 J, |  o) a7 l0 ?3 [
  61.                         while(((RCC->CFGR>>2) & 0x3) != 0x02)  //等待sysClk就绪
    ( A2 m  n4 D6 W" X0 i; H  G9 p5 H: W
  62.                         {$ x0 v  t# y- [% ]( C
  63.                                 if (sTimeCount--) return errCode;5 j  L3 n) L! i3 z$ `! K% \5 T3 a7 \
  64.                         }/ a0 N! }  I: H
  65. #elif defined  (STM32F051) || defined  (STM32F042) //none+ X) G2 U3 p2 u9 H& o7 }6 l
  66. #else
    + k: J! y. g. v
  67.                 #warning "Make sure needn't define STM32Fxxx etc. ?"6 v) X  S7 A) H% i; s3 q$ l
  68. #endif
    3 r4 Q2 a5 ~7 m) M
  69.                         break;
    . Z3 n$ X8 I1 z3 S% m
  70.                 default:                //case USE_INTERNAL_HSI:
    9 C* R* @8 S& {( u* h
  71.                         RCC->CFGR &= 0xFFFEFFFF; //HSI 8MHz/2
    : p3 j0 s9 I; v: s2 y3 M0 e( q
  72.                         RCC->CFGR |= ((maxFreq>>2)-2)<<18; //设置PLL值倍频
    7 e9 N; R- m5 l3 |0 ~/ W5 a5 ^+ A$ U
  73.                         
    - v* r# I! R) V0 ?# l) @8 S# t
  74.                         //存在等待状态时,必须先开启预取缓冲区
    2 d! `! J9 v' a0 b6 j, m# C
  75.                         if (maxFreq <= 24)
    1 i* T/ m0 C# G6 C% K- S
  76.                                 FLASH->ACR |= 0x30;//000:零等待状态,当 0 < SYSCLK ≤ 24MHz0 `8 O$ Q6 g- c' f; V6 M1 b( H
  77.                         else if (maxFreq <= 48)
    4 e) r& ?1 l3 O# D
  78.                                 FLASH->ACR |= 0x31;//001:一个等待状态,当 24MHz < SYSCLK ≤ 48MHz
      v7 K! u8 z4 s" `6 t+ D
  79.                         else
    7 z  Z- j" @/ ?0 o/ W& M/ v
  80.                                 FLASH->ACR |= 0x32;//010:两个等待状态,当 48MHz < SYSCLK ≤ 72MHz
    2 ]5 }$ ~- y5 U( u  b( t7 x
  81.                         
      O. X% p  j3 H4 u( v: [
  82.                         RCC->CR |= 1<<24;                   //PLLON( y2 M1 I, r; M4 y
  83.                         while(((RCC->CR>>25) & 0x1) != 1);  //等待PLL就绪
    # Z+ H+ Q9 c! a9 T! P& Y4 @
  84.                         RCC->CFGR |= 0x2;                   //PLL作为sysClk. K5 @4 D. z) w$ E3 Z' }& Z- m
  85.                         while(((RCC->CFGR>>2)&0x3) != 0x02);  //等待sysClk就绪( t' ^* |  C8 p- S1 I7 d) \
  86.                         break;
    . X; g; ~$ ?( X# i, r
  87.         }! A) h0 O" e# Q, i" _% q
  88.         
    - m4 L7 ?# z+ m, W- }7 {
  89.         return 0;6 X9 |( C5 \3 j7 C1 M" ~% G: K( @
  90. }
    3 N6 V" b1 p3 Y1 |- k
  91. 4 I! r' r9 s9 h6 `5 B! \
  92. /**3 ~# u3 U7 o# _& D2 G
  93.   * <b>芯片上电默认时钟配置。</b>
    & z. v4 G. z$ J+ k
  94.   * <p>功能:用来恢复时钟系统到上电默认状态。
    , ^" I1 R% \' K) r  W
  95.   * @version                1.1.0.0(20140228)) m6 _9 n  v; B* j
  96.   * <p-2014>实现CM0与CM3兼容完成!) K2 f5 R- ]9 n+ L: f
  97.   * @author             Dylan/ B" H# h  r) J6 n6 t- O
  98.   */6 H/ _0 O0 _6 J$ }
  99. void HW_SystemPowerON(void)
    - o5 x. E! @1 v" P( g( H
  100. {+ L5 X* z. S& v# L0 v: E$ O, f
  101. #if defined  (STM32F051) || defined  (STM32F042)& g( U! W1 t* W
  102.         RCC->CR |= 0x00000001;//HSION
    3 K, e4 m9 ]; z+ u' a7 O

  103. & }; G9 b( ]& ?$ D  x3 D7 S# W
  104.         RCC->CR &= 0x0202FFFF;/* Reset HSEON, CSSON and PLLON, HSEBYP bit */
    0 N- U9 l0 r. F9 z7 Q

  105. $ }8 d7 M) j' Z0 s
  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 */
    # ]# A7 N+ g, }. n

  107. 8 g( i, W5 |0 L  t
  108.         RCC->CFGR2 &= 0x00000000;/* Reset PREDIV1[3:0] bits *///与CFGR[17]一起用作HSE-PLL设置
    / [) ]0 F3 B+ C% `8 A$ j

  109. ( ~6 k1 ^1 |6 i( Y" B
  110.         RCC->CFGR3 &= 0x00000000;/* Reset USARTSW[1:0], I2CSW, CECSW and ADCSW bits */
    2 r6 n& [0 P: o! _

  111. - U( P. {/ b5 ~3 }& _
  112.         RCC->CR2 &= 0xFFFFFFFE;/* Reset HSI14 bit */
    # J5 |7 f. Y! u% p9 }; C

  113. " K" ~) j& K# Y* j# y2 b1 j
  114.         RCC->CIR = 0x00000000;/* Disable all interrupts */0 a/ c& j' H8 Q1 ^6 C

  115. . f$ l: M5 b. M) W4 O& x/ l, Y
  116. #elif defined (STM32F100) || defined (STM32F101) || defined (STM32F103)
    3 G  ~* Q5 Q: J+ A/ {' [- N  \2 D
  117.         RCC->CR &= 0x0000FF83;//把HSI调整到8MHz±1%==》开启HSI==》等待就绪, w$ M2 F$ }% h5 ?4 E7 Z6 f

  118. ) w5 z* F% O; s
  119.         RCC->CFGR = 0x00000400;//限制APB1时钟是HCLK_Div2; T. _( i4 O6 [5 o

  120. 3 j6 o& r* E* V+ M" \5 i
  121.         RCC->CIR = 0x00BF0000;//清除所有的RCC中断标志
    ( M+ I# W* R8 I5 \" Z5 j

  122. # }+ y4 O( B) G; O' |
  123.         //配置向量表3 q6 k, T8 b  ^5 H0 K& I
  124.         #ifdef  VECT_TAB_RAM
    5 T) _- m# ?6 r5 Z3 W1 m& {4 h( `
  125.         /* Set the Vector Table base location at 0x20000000 */) y8 M% |# D. e1 m, U: K
  126.         NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0);" n! Z$ r  @& q* I! y: k5 U
  127.         #else  /* VECT_TAB_FLASH  */; d; }0 `2 n: B
  128.         /* Set the Vector Table base location at 0x08000000 */; A8 Z' I/ j/ A! K
  129.         NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);  r$ ?; N4 M8 \9 m  T
  130.         #endif1 E% {( J1 }3 I' C
  131. #else
    ( \# d, @4 r- n4 @6 P$ y
  132.         #warning "Make sure needn't define STM32F051 etc. ?"5 R! r4 `6 Y% x( J2 j. D' \
  133. #endif
    / k0 M$ A2 B  j$ c
  134. }
复制代码

4 T! Z5 C. b, y. E& H) f' T" i
5 Y$ w5 A% R/ W; z$ |3 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 手机版