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

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

[复制链接]
Dylan疾风闪电 发布时间:2018-8-9 14:12
本帖最后由 Dylan疾风闪电 于 2018-8-9 15:39 编辑
1 \2 l6 k% o3 C  @: _
4 j: x" X0 Q5 b使用举例:配置72MHZ时钟作为系统时钟#define SystemClockMHz        72//MHZ
1 N/ Q6 a! w; `7 B2 {. p

" |! t/ j! Z0 A' O* \HW_SystemClockMux(USE_EXTERNAL_HSE, SystemClockMHz) ;
5 c' H. ]4 I4 e& v7 f+ Y: CHW_SystemClockMux(USE_INTERNAL_HSI, SystemClockMHz);
) I+ J; M7 ~% e
, Y( j" w+ j, |
5 v2 o8 K* K5 I3 z8 g+ N4 u! T5 I
; \3 ^8 x* o, W) e+ n8 }
---------------------------------------------------------------------------------------------( {1 {( C( ?, v) j4 L* Z- R3 m
代码已验证。发个帖子,便于自己移植使用。
1 ~$ n5 q- ]: e7 X* x7 @- O( B
. e$ L  L% t! Q5 E: s& h/ u! j; Q% K4 ^2 e# ~" f" g' L) b/ Y& t- Z
  1. /* Const to source of high speed clock:internal or external. */1 T9 G# b( O7 v* l3 q& n7 T0 H" e
  2. #define        USE_EXTERNAL_HSE                                                0
    , g, d$ U+ y& ^6 t! {9 |/ O
  3. #define        USE_INTERNAL_HSI                                                1
    2 @/ ]; P& k- j& O% @
  4. /**
    " e1 ^* W1 h. {' K
  5.   * <b>配製系統主時鐘頻率。</b>  _$ \$ E( f. L' H( `% E
  6.   * <p>功能:選擇時鐘源,并進行PLL倍頻。
    - D6 Y3 t# N6 M+ u- [+ s5 M
  7.   * @param  osc   高速時鐘源的選擇。
    6 ]" {6 q: x4 y& v; |$ E( l) V9 h
  8.   *            @arg USE_EXTERNAL_HSE: 外部高速晶振
    0 m( h9 h: d( O7 w8 n
  9.   *            @arg USE_INTERNAL_HSI: 內部高速晶振
    7 t; L: p9 o/ Q% U. r+ D% X
  10.   * @param  maxFreq 芯片最大主频?M,查询对应的数据手册
    5 R# t1 O% v, L. ~( K6 n4 a  s
  11.   * @return         osc
    ( D$ e( r5 Y6 F9 y
  12.   * @version                2.0.0.0(20160407)1 ^. ~: ~/ Z/ u$ L
  13.   * <p-2014>实现CM0与CM3兼容完成!% H. ?! i* t8 r" Z6 b, z- ^  `
  14.         * <p-2016>對字符串/單詞進行變更。
    , m  P" T3 C5 b
  15.   * @author             Dylan
    0 u( `6 g$ x2 m" c. V4 y, R9 A
  16.   */! a5 Z2 e( l  d( I! }
  17. uint8_t HW_SystemClockMux(uint8_t osc, uint8_t maxFreq)* L$ L9 E5 Y' O+ h1 q
  18. {
    - }8 M' Y, T- [. G% [3 A
  19. #if defined (STM32F100) || defined (STM32F101) || defined (STM32F103)
    / V: G; Y8 w2 f; i, I/ w
  20.         uint8_t errCode = 0xff;
    8 X! c  _  b/ k
  21.         uint32_t sTimeCount, sTimeMax = 0xFFF;% F6 d& r4 J7 {& e' ]% Y5 N
  22. #endif% |7 u0 W5 H& j" Z' F  p5 ]
  23.         1 [7 v( d! y- t* z# H. F& V9 d
  24.   HW_SystemPowerON();  T1 `% p) q; X% V$ q% X
  25.   
    ) Q6 ~: x9 F4 Y4 x' m
  26.         switch(osc)
    # Z! L" h+ R8 ^7 a' z2 b9 S
  27.         {
    ) m9 F0 ~) M5 f: z
  28.                 case USE_EXTERNAL_HSE:6 I, E( |7 _, r5 A
  29. #if defined (STM32F100) || defined (STM32F101) || defined (STM32F103)
      T; s9 u+ `" y8 r
  30.                         RCC->CR |= 1<<16;       //HSEON
    ! T* A' I" v; G0 f5 j# }
  31.                
    2 A" i( G% s4 \/ D: h
  32.                         sTimeCount = sTimeMax;- e# u, I4 [1 y$ P2 q. k
  33.                         while(((RCC->CR>>17) & 0x1) == 0) //等待HSE就绪- [/ F' i# V$ k* }( S/ J
  34.                         {
    % n8 y6 E- Y) R1 C4 U
  35.                                 if (sTimeCount--) return errCode;* k+ R' Q8 i/ h' x$ @* B
  36.                         }
    # w7 P- V3 a  x. |% z" o$ A
  37.                         
    / ~6 v( ~: O& S8 Q
  38.                         RCC->CFGR |= (maxFreq/8-2)<<18; //设置PLL值倍频//HSE 8MHz* u7 u7 Z' I3 a2 M4 k0 S
  39.                         ( }) [3 o1 I' K$ V  p; C1 o& i
  40.                         RCC->CFGR |= 1<<16; //切换PLL输入时钟源为0->1:HSI/2(4MHz)->HSE(8MHz)
    0 f8 X& D$ c, n0 U! {
  41.                         : m5 H0 x+ g$ }$ u8 P, l
  42.                         //存在等待状态时,必须先开启预取缓冲区
    ! R; ~0 d# J& V  i
  43.                         if (maxFreq <= 24)
    ; F" p) T" `  d1 ]# G3 ~& \+ Z0 X/ g
  44.                                 FLASH->ACR |= 0x30;//000:零等待状态,当 0 < SYSCLK ≤ 24MHz
    " q) c! o9 T0 ^
  45.                         else if (maxFreq <= 48)
    9 U' {: R; A' s* a& k" b
  46.                                 FLASH->ACR |= 0x31;//001:一个等待状态,当 24MHz < SYSCLK ≤ 48MHz
    0 e4 ~, f1 `$ ~; \( h; ?/ a
  47.                         else
    ( |  \( _5 x: ^6 F5 w) a
  48.                                 FLASH->ACR |= 0x32;//010:两个等待状态,当 48MHz < SYSCLK ≤ 72MHz
    " {/ i- J% K" E/ ~: P
  49.                         
    4 k; m& B: h8 l$ q8 p. y6 Y) I+ R
  50.                         RCC->CR |= 1<<24;                   //PLLON" j  \1 k: n5 _  ~
  51.                         & |# l6 l% l1 m. E- d( F! B
  52.                         sTimeCount = sTimeMax;
    % ^/ x2 I* M0 {; R- D
  53.                         while(((RCC->CR>>25) & 0x1) == 0)  //等待PLL就绪. F8 S2 w) I' w- q- ]; w) F
  54.                         {
    4 L& A+ y5 y) N' T. ]% p
  55.                                 if (sTimeCount--) return errCode;
    % Q  ~6 I( a( ?8 {) q
  56.                         }0 q2 x4 A* V: g; Z
  57.                         & I& r  W" D+ \$ D) w$ a& g
  58.                         RCC->CFGR |= 0x2;                   //PLL作为sysClk: g" b; i5 Y- g  c7 k  l4 K
  59.                         
    ! ^* q* Y# N, B5 S; f* |
  60.                         sTimeCount = sTimeMax;2 @1 d, j, X7 U+ j+ s1 d
  61.                         while(((RCC->CFGR>>2) & 0x3) != 0x02)  //等待sysClk就绪  v8 i( ]6 g$ b( k3 M3 R, c( V
  62.                         {: z* Q+ y) O9 l" W6 v. ^, p0 H
  63.                                 if (sTimeCount--) return errCode;  X! _' X( v, D6 v: Q
  64.                         }2 H/ d. z$ A# K$ E3 c  @& m
  65. #elif defined  (STM32F051) || defined  (STM32F042) //none7 ?6 u, K& o, O! b; O1 }6 Z' O
  66. #else
    9 u) K8 S6 o" z$ |8 C) }( v2 y* y
  67.                 #warning "Make sure needn't define STM32Fxxx etc. ?"
    4 X% f( n% l" H: y+ J" H3 J) @
  68. #endif
    ( M4 z1 B/ w7 {1 J& o/ p
  69.                         break;2 ^5 D! J9 ?6 f
  70.                 default:                //case USE_INTERNAL_HSI:1 T* T% J- Q. H) @
  71.                         RCC->CFGR &= 0xFFFEFFFF; //HSI 8MHz/24 o$ X( F& d; `% g/ w1 x
  72.                         RCC->CFGR |= ((maxFreq>>2)-2)<<18; //设置PLL值倍频
    0 A5 J+ x0 N8 W/ E( [( c
  73.                         ! z( h1 a# e! p3 u7 J: C- N2 r* S
  74.                         //存在等待状态时,必须先开启预取缓冲区, j! {2 \3 ^! b7 N9 L6 d
  75.                         if (maxFreq <= 24)
    4 R" d( F8 b/ T+ p: ~/ [
  76.                                 FLASH->ACR |= 0x30;//000:零等待状态,当 0 < SYSCLK ≤ 24MHz
    + u1 u5 U3 z8 ]- Q
  77.                         else if (maxFreq <= 48)2 h1 D2 z: t4 V/ V% o8 L
  78.                                 FLASH->ACR |= 0x31;//001:一个等待状态,当 24MHz < SYSCLK ≤ 48MHz, Y- r0 B  d& \$ z; U* f
  79.                         else7 W% m$ G" g3 k8 ^+ t# c8 |. r7 A
  80.                                 FLASH->ACR |= 0x32;//010:两个等待状态,当 48MHz < SYSCLK ≤ 72MHz9 Q; i  m1 M3 V$ V' x
  81.                         ) I' H6 `* q; Y: ?+ K
  82.                         RCC->CR |= 1<<24;                   //PLLON1 B, n3 h# b0 R$ K+ O
  83.                         while(((RCC->CR>>25) & 0x1) != 1);  //等待PLL就绪
    & G2 P+ ?$ X( J2 k5 i
  84.                         RCC->CFGR |= 0x2;                   //PLL作为sysClk; t; E: r7 `( g3 w
  85.                         while(((RCC->CFGR>>2)&0x3) != 0x02);  //等待sysClk就绪
    / J. @1 P% M7 [4 v- ~! x& b0 r4 E
  86.                         break;0 D" K" @1 ^; E2 M+ P
  87.         }/ c* A8 {/ k  G) ?  z9 y
  88.         5 S$ _3 \( |) e) c" X$ ?9 q. \
  89.         return 0;2 x: l: X: ^' n% F' `
  90. }
    ( h- M4 i& I8 I4 m  z
  91. 2 T" O9 I. r- ?/ J& C
  92. /**. l3 @' ~6 H/ @* c: I9 N
  93.   * <b>芯片上电默认时钟配置。</b># z' B) \; Y5 P) x
  94.   * <p>功能:用来恢复时钟系统到上电默认状态。- I$ l. @& V2 n4 p' b* v
  95.   * @version                1.1.0.0(20140228)) X5 h/ i4 O. n3 l. E* d& X
  96.   * <p-2014>实现CM0与CM3兼容完成!% c- f. }% l) e9 L5 N
  97.   * @author             Dylan
    ) E$ m( H: z9 T! f, H. w) N0 d0 U
  98.   */- j: h% }8 [& c: y
  99. void HW_SystemPowerON(void)' n. H& F. d& g5 b6 \
  100. {
    + u$ x5 \4 v/ m4 l7 r
  101. #if defined  (STM32F051) || defined  (STM32F042)) Y/ M5 A/ R/ B, ]1 v# ?& y0 A
  102.         RCC->CR |= 0x00000001;//HSION
    1 m5 f% i. Y* k9 n

  103. ( h' ]5 P! h, ^  Y
  104.         RCC->CR &= 0x0202FFFF;/* Reset HSEON, CSSON and PLLON, HSEBYP bit *// A/ ^* w& X  ~# ~

  105. 3 T$ u5 e7 z, ?$ }' _+ z
  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 */
    % {" `1 o# m: Z8 N# K6 |# E

  107. + s4 W* h6 y$ @
  108.         RCC->CFGR2 &= 0x00000000;/* Reset PREDIV1[3:0] bits *///与CFGR[17]一起用作HSE-PLL设置
    . y+ f& }" R' ?3 K" T( a
  109. / g4 j. C! Z4 Q
  110.         RCC->CFGR3 &= 0x00000000;/* Reset USARTSW[1:0], I2CSW, CECSW and ADCSW bits */8 u8 |1 i% [, w9 i

  111. ' b( M& [& t! K* y1 q
  112.         RCC->CR2 &= 0xFFFFFFFE;/* Reset HSI14 bit */5 n. ~4 E7 c; S# N% L" m2 q
  113. $ V3 f  E7 v# F/ l1 a; t
  114.         RCC->CIR = 0x00000000;/* Disable all interrupts */
    9 p0 B8 V6 f6 U* ]' x4 Z% u
  115. * M# K7 x% w7 b9 L0 d% ]4 N
  116. #elif defined (STM32F100) || defined (STM32F101) || defined (STM32F103)
    % \  Z- k5 q  v1 U. K
  117.         RCC->CR &= 0x0000FF83;//把HSI调整到8MHz±1%==》开启HSI==》等待就绪6 V4 U" H1 |+ e# {5 {8 Y
  118.   o' E4 I2 `% x2 m  c  l& g
  119.         RCC->CFGR = 0x00000400;//限制APB1时钟是HCLK_Div2! t/ y* l2 m* B: u" h3 F

  120. 0 n) U  Z- d0 {8 D. P# v5 m
  121.         RCC->CIR = 0x00BF0000;//清除所有的RCC中断标志; z  f3 W8 ^5 ~
  122. & |3 \1 S: W; {+ O- X+ J
  123.         //配置向量表* a* `: s; R3 d' v
  124.         #ifdef  VECT_TAB_RAM
    9 n9 c5 ^/ e7 k% a' s, Z+ s1 _
  125.         /* Set the Vector Table base location at 0x20000000 */. r. T  X  j3 l* H3 S5 _, Y3 a7 ~  N
  126.         NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0);
    . j% F6 X9 o3 C, m/ v4 U
  127.         #else  /* VECT_TAB_FLASH  */6 x: e  W: ?9 M. D! [
  128.         /* Set the Vector Table base location at 0x08000000 */
      Y6 C" I; P0 T& O
  129.         NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);
    7 G$ \1 N' d# G: Y9 S
  130.         #endif7 x* }2 V0 d% P& b; ^
  131. #else" g! U, U6 V1 T* s0 v' l  ^
  132.         #warning "Make sure needn't define STM32F051 etc. ?"
    , M! S7 K) p5 F# J9 X
  133. #endif
    + ?& y. m, B1 T; I
  134. }
复制代码
, x% V3 Z7 t4 x
( @1 W8 h6 N, k2 f" B! b  T
收藏 评论1 发布时间:2018-8-9 14:12

举报

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