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

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

[复制链接]
Dylan疾风闪电 发布时间:2018-8-9 14:12
本帖最后由 Dylan疾风闪电 于 2018-8-9 15:39 编辑 , s" r: Q+ b: D  j/ \

4 p1 k, N; W# E使用举例:配置72MHZ时钟作为系统时钟#define SystemClockMHz        72//MHZ
5 \0 q1 \, N% B. [7 Y# J: L. ?8 @8 l2 i
( q0 k6 h! {5 p" Q' z) \$ P) j
HW_SystemClockMux(USE_EXTERNAL_HSE, SystemClockMHz) ;2 `+ F7 `# U# z7 L9 n
HW_SystemClockMux(USE_INTERNAL_HSI, SystemClockMHz);
- j6 {. @# T: U) _
# a2 i4 N. v1 z. `

( V% l( [, `" t* p; O0 d- C6 ?2 j  M/ X* S& t
---------------------------------------------------------------------------------------------# x8 o1 e& A2 l6 K/ g
代码已验证。发个帖子,便于自己移植使用。) F1 R; E( t* `
0 h( i3 t2 b! O3 O. N0 V

. _/ c  b- E# y: o: F
  1. /* Const to source of high speed clock:internal or external. */
    3 L- u: n$ r3 z
  2. #define        USE_EXTERNAL_HSE                                                0
    5 U7 |+ _9 j+ H, H' A9 |) e$ a4 E0 f4 h
  3. #define        USE_INTERNAL_HSI                                                1
    ' h' }8 r$ D+ S/ F0 l0 a
  4. /**6 ], Y7 b/ k; \8 l( y
  5.   * <b>配製系統主時鐘頻率。</b>. O9 m* @+ ]2 C8 _* N) _; I
  6.   * <p>功能:選擇時鐘源,并進行PLL倍頻。
    " M: H" e8 {/ B
  7.   * @param  osc   高速時鐘源的選擇。; p5 a; o( v4 Y
  8.   *            @arg USE_EXTERNAL_HSE: 外部高速晶振
    8 a! }" g) A3 p& x4 C
  9.   *            @arg USE_INTERNAL_HSI: 內部高速晶振
    # e( A/ y' f* m) D0 [: B
  10.   * @param  maxFreq 芯片最大主频?M,查询对应的数据手册! m$ p* @- p: z9 |
  11.   * @return         osc
    4 W. i$ m! k- h; {' X7 a* {8 H0 H
  12.   * @version                2.0.0.0(20160407)* t# s9 w, _" C1 e- |
  13.   * <p-2014>实现CM0与CM3兼容完成!5 |4 F2 F& ?1 p
  14.         * <p-2016>對字符串/單詞進行變更。
    . F8 |# X( r4 I& z& R
  15.   * @author             Dylan) P* v7 Q7 Z' x8 A+ Z
  16.   */5 t4 }$ b& i* a' t3 n) Z
  17. uint8_t HW_SystemClockMux(uint8_t osc, uint8_t maxFreq)9 O% w' O  `9 P+ R  \# L1 X7 u% U
  18. {
    2 c( U$ ^/ w5 `: q8 N/ n* X* H6 O
  19. #if defined (STM32F100) || defined (STM32F101) || defined (STM32F103)
    3 _; N2 {: Q; s6 i
  20.         uint8_t errCode = 0xff;
    0 X* m# g, _$ g" [
  21.         uint32_t sTimeCount, sTimeMax = 0xFFF;
    2 p; r/ b- \4 K6 m1 g5 X2 k
  22. #endif
      e' s* z6 d* \5 N
  23.         4 @9 c; K( B8 B
  24.   HW_SystemPowerON();
    9 d. j* q9 P7 x! e/ `* C
  25.   
    2 g' q  h  }  O" ?9 }4 \
  26.         switch(osc)
    5 U4 ?' C5 j5 I5 b9 ~
  27.         {
    . S. n* j/ x: N/ N" B- v6 J" c
  28.                 case USE_EXTERNAL_HSE:
    + ]# i+ V. O0 A) w% R
  29. #if defined (STM32F100) || defined (STM32F101) || defined (STM32F103)
    , I  z. L8 f) X, X! G3 ^/ w3 E
  30.                         RCC->CR |= 1<<16;       //HSEON& h9 m: C5 I, n
  31.                 : V9 Z0 c* \8 O5 X. Z/ f) L
  32.                         sTimeCount = sTimeMax;
    1 v2 @, ^0 l% A7 f( v. Q
  33.                         while(((RCC->CR>>17) & 0x1) == 0) //等待HSE就绪
    - _* h, Y4 r% d' U
  34.                         {
    . n  y; ?& H( z% q( f2 }: D
  35.                                 if (sTimeCount--) return errCode;
    ! [% F' G! N3 U6 D' M- Z
  36.                         }- h3 I1 |5 L, z
  37.                         ) E4 S, O+ ]) |/ v: X" s2 Z
  38.                         RCC->CFGR |= (maxFreq/8-2)<<18; //设置PLL值倍频//HSE 8MHz# ^0 f: y( P" O
  39.                         ' y- _# P7 G7 `, `+ }& Q+ Q
  40.                         RCC->CFGR |= 1<<16; //切换PLL输入时钟源为0->1:HSI/2(4MHz)->HSE(8MHz)
    7 }' }; B) c, z  V7 R" d! |6 E
  41.                         4 h8 `3 s1 r. F( }
  42.                         //存在等待状态时,必须先开启预取缓冲区% u5 A+ Y" p. w
  43.                         if (maxFreq <= 24)
    * @, r# j* I1 w, F
  44.                                 FLASH->ACR |= 0x30;//000:零等待状态,当 0 < SYSCLK ≤ 24MHz# _7 @' V* A" X/ S# o- v, |- J
  45.                         else if (maxFreq <= 48)& u5 S- d# @' t  m1 b2 S
  46.                                 FLASH->ACR |= 0x31;//001:一个等待状态,当 24MHz < SYSCLK ≤ 48MHz& i9 a, L% V, f
  47.                         else/ m% ^- Q2 s2 M- O4 s% }
  48.                                 FLASH->ACR |= 0x32;//010:两个等待状态,当 48MHz < SYSCLK ≤ 72MHz3 z/ V0 Z: T6 L2 k' I& h( l
  49.                         
    4 r  m% J1 K8 D. f; g4 }
  50.                         RCC->CR |= 1<<24;                   //PLLON0 C" T& v( b1 Y; P
  51.                         
    " |6 {# {0 _6 F( ?/ I
  52.                         sTimeCount = sTimeMax;
    % S' g  i. k# U8 ^' |9 S' X
  53.                         while(((RCC->CR>>25) & 0x1) == 0)  //等待PLL就绪
    3 c- F9 s/ M  y
  54.                         {5 r" z" A8 D# {' e" @
  55.                                 if (sTimeCount--) return errCode;
    % h' _" B3 v) j4 n  @( n" n+ ~9 X
  56.                         }9 `& e9 ~6 z1 O% l; |- H  @5 G
  57.                         
    9 ~; J* |! ], C; |) I
  58.                         RCC->CFGR |= 0x2;                   //PLL作为sysClk
    2 i- _: J9 \7 P% t  l
  59.                         
    % V8 U7 K# D2 E/ b' d& \
  60.                         sTimeCount = sTimeMax;' m5 }4 f2 _9 |4 R
  61.                         while(((RCC->CFGR>>2) & 0x3) != 0x02)  //等待sysClk就绪
    / F; t- h* }2 x' b1 M( P
  62.                         {
    4 k1 w# q7 m. a1 L+ K/ E  n3 o
  63.                                 if (sTimeCount--) return errCode;" O. z) A& B* f: y
  64.                         }
    % \- ^! b# S! i( {$ C. `- D
  65. #elif defined  (STM32F051) || defined  (STM32F042) //none* [( x% h, b& j) a
  66. #else. l& T4 v* q$ r& J" E
  67.                 #warning "Make sure needn't define STM32Fxxx etc. ?"7 s+ [" Q  `9 _
  68. #endif# T; {3 [0 L* I/ }
  69.                         break;
      d+ y7 X/ j  p9 K# v4 H9 X
  70.                 default:                //case USE_INTERNAL_HSI:7 U6 B  I1 k) @1 K& `. N& Y" b
  71.                         RCC->CFGR &= 0xFFFEFFFF; //HSI 8MHz/27 P  t, [1 Q3 H* c
  72.                         RCC->CFGR |= ((maxFreq>>2)-2)<<18; //设置PLL值倍频
    * `# X  Z" s- s; {' |9 P: ]
  73.                         
    5 D9 o! S1 `6 i$ k/ u
  74.                         //存在等待状态时,必须先开启预取缓冲区
    6 Z5 ]( a! ]! A4 F) r# Y+ _
  75.                         if (maxFreq <= 24)" d- c3 w9 n3 m7 @" u
  76.                                 FLASH->ACR |= 0x30;//000:零等待状态,当 0 < SYSCLK ≤ 24MHz0 M" g/ {; P- |2 @( h1 s
  77.                         else if (maxFreq <= 48)
    # p5 L8 x# x* T! v- ?, R$ A+ s( Q
  78.                                 FLASH->ACR |= 0x31;//001:一个等待状态,当 24MHz < SYSCLK ≤ 48MHz
    4 S2 X% ?% r# m& ^- s3 d* y8 L
  79.                         else
    ) c+ L/ z+ G& G, I
  80.                                 FLASH->ACR |= 0x32;//010:两个等待状态,当 48MHz < SYSCLK ≤ 72MHz" h! Z) }7 H3 }' {
  81.                         8 X6 Z6 u  _9 H% A7 i2 T/ v
  82.                         RCC->CR |= 1<<24;                   //PLLON; q4 _2 f2 }* _0 w' q/ i
  83.                         while(((RCC->CR>>25) & 0x1) != 1);  //等待PLL就绪4 d. t) A5 m1 k1 e3 u* m, m; y  x& a
  84.                         RCC->CFGR |= 0x2;                   //PLL作为sysClk: [5 c9 |/ Q1 r7 r' b7 O7 a- g( L
  85.                         while(((RCC->CFGR>>2)&0x3) != 0x02);  //等待sysClk就绪' z$ c" P+ z& s# B0 d5 ?
  86.                         break;) M  S; T( o$ g- x) Y
  87.         }1 C# g" T# A" {; g) g: k
  88.         
    1 D' T7 a' ?, J4 F/ Q/ U5 Y' m
  89.         return 0;8 J; a; x& I/ Y# \! |! ~5 Z8 r8 d, H2 F
  90. }6 t- O( H9 a( w2 w3 S

  91. ) f/ Q7 B3 J# ?8 h2 ]+ a5 `
  92. /**
    % X- l4 H2 k, o+ j
  93.   * <b>芯片上电默认时钟配置。</b>
    * r% {0 A5 ^" D- a5 u, S. w0 ^
  94.   * <p>功能:用来恢复时钟系统到上电默认状态。3 y  D! [2 o4 W+ \6 s; c, ?
  95.   * @version                1.1.0.0(20140228)- h2 [7 N5 r0 V1 s$ V$ [  S% L
  96.   * <p-2014>实现CM0与CM3兼容完成!" x  j7 k; F. |. @. h
  97.   * @author             Dylan
    + B2 }; J0 Q+ y, n
  98.   */
    / f9 D" [9 h  L
  99. void HW_SystemPowerON(void)0 ~% E- f. m, R- D1 h$ _6 n* C4 q
  100. {" @7 f# G, T* B
  101. #if defined  (STM32F051) || defined  (STM32F042)
    4 E5 n9 {, k+ X
  102.         RCC->CR |= 0x00000001;//HSION
    ' K* F# r( [3 m2 E' x: q$ v6 _  G
  103. % Y" x2 b+ J$ U( \) A
  104.         RCC->CR &= 0x0202FFFF;/* Reset HSEON, CSSON and PLLON, HSEBYP bit */( Z& U7 F9 s3 D" N; S9 e+ V

  105. ; M  s! c5 ]5 I4 n' ]; H; j6 ]
  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 */
    , L# r7 w0 Z( v* l

  107. ! v4 a+ j6 n: u( a2 ]% Q. O( V
  108.         RCC->CFGR2 &= 0x00000000;/* Reset PREDIV1[3:0] bits *///与CFGR[17]一起用作HSE-PLL设置
    * m/ i; Z- ^9 M* H( q( n* p. p
  109. ) y( h( q) o+ L, u+ M3 D
  110.         RCC->CFGR3 &= 0x00000000;/* Reset USARTSW[1:0], I2CSW, CECSW and ADCSW bits */3 h& s9 P$ O5 j  O: D

  111. ( ]% t" M9 O: T( D# K7 Y
  112.         RCC->CR2 &= 0xFFFFFFFE;/* Reset HSI14 bit */
    / y8 A% g+ m* v

  113. 8 A8 T% L3 m, u, A9 J9 T% u) g
  114.         RCC->CIR = 0x00000000;/* Disable all interrupts */. \& m# R3 ~5 R2 m( B
  115. - Y) {  k8 w$ P, x1 v3 X
  116. #elif defined (STM32F100) || defined (STM32F101) || defined (STM32F103)% ?2 ^& K% K+ c
  117.         RCC->CR &= 0x0000FF83;//把HSI调整到8MHz±1%==》开启HSI==》等待就绪: J! l! U5 O# T2 W

  118. $ D) W) m8 ?: j7 t/ b
  119.         RCC->CFGR = 0x00000400;//限制APB1时钟是HCLK_Div2
    ( s# g% H8 O# D

  120. # I/ o- S; I/ p5 S! f/ m- f7 Z
  121.         RCC->CIR = 0x00BF0000;//清除所有的RCC中断标志
    # f5 i; Y+ {9 p6 k; P

  122.   z* |# v( l( R7 }
  123.         //配置向量表
    3 u0 p1 `* v2 c; y7 H
  124.         #ifdef  VECT_TAB_RAM
    - Q4 V8 Q( y* R1 ~- D$ ^
  125.         /* Set the Vector Table base location at 0x20000000 */, ~" I8 h: y$ p4 @. x. k" c
  126.         NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0);8 N7 h. T  m4 |) d
  127.         #else  /* VECT_TAB_FLASH  */% i0 l7 z1 }$ t' w0 A9 r( {& Y3 b
  128.         /* Set the Vector Table base location at 0x08000000 */
    6 |% j  t+ a( v! w' w! A0 v. \
  129.         NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);
    / v0 G. ?+ g2 r7 _( L- _# e" ~9 `  K
  130.         #endif/ g. {) Y2 E" N+ M- f2 z
  131. #else
    & H! Z0 F2 V- a6 q) b" I+ d7 Y7 v; a
  132.         #warning "Make sure needn't define STM32F051 etc. ?"
    $ j+ }# m. u6 @( b/ M7 F- a
  133. #endif
    3 _4 F$ Z+ x2 l1 V" Q7 A
  134. }
复制代码

( ?  g0 p5 S( K" e7 Q" f
( p; C9 a7 q- `& v* e
收藏 评论1 发布时间:2018-8-9 14:12

举报

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

所属标签

相似分享

官网相关资源

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