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

基于STM32F103C8T6内部时钟作为系统时钟经验分享

[复制链接]
攻城狮Melo 发布时间:2023-5-1 17:15
首先说明一下芯片内部并没有时钟, 而是内部振荡。/ x) {) k% u# i7 k$ ?
使用内部振荡的好处是外部无需设计晶振电路 ,再说的简单点 ,不用外部晶振依然可以让单片机正常运转。+ s* v  v$ \# b4 v6 ~
书归正传 直接开始配置
3 d2 E$ c; r# l5 G

7 h# T2 d: w8 J# j4 l打开任意keli工程. m+ Y- ?& |% g. ^

1 }! U' t$ t) y0 ^' N- E- h4 _. @
3abfd84a31744e26becb5fac0ecf553d.png
6 S$ Q4 n# E2 T8 }5 U- N7 R

* E7 G- Z- x1 \# S+ r9 i, A" w: l打开system_stm32f10x.c
+ h( Z% l* y4 T& W" i
( L* k1 n4 w6 r  y; t
15651841425044cfb9c3695a9017a21f.png - {6 F, S8 y7 ^# C* D8 O

! \% W0 ]. V9 H2 S" T* d1 t找到systeminit函数 全部注释掉
7 ~% U: e! |0 S0 @% w" E/ V* J9 k; I- V, R
51791e66d6cb45ddabcd4982bac9425b.png ! ?9 O! o7 D7 S$ Z
* `, P5 K! v; o9 U
然后在下面粘贴以下代码(这段代码来自CSDN的一位大佬,我不是原作者)
* j& b! x+ d7 d, C# h; z2 T- _
9 V7 e4 P8 y& x0 Q8 m
直接替换就可以用了
! c3 ~# a; Q  ]( u  X* @
  1. #define  USE_HSI   1                        // 是否使用内部晶振  0 不使用  1使用
    0 l$ R: {) o  u3 z  E" b5 G  y
  2. void SystemInit ( void )
      N& j6 p) L+ R
  3. {
    : S1 [% a1 l7 U
  4. # f7 ?7 B/ Y% d# I
  5. #if USE_HSI; ]% Y0 d) w( r3 r0 O1 ~
  6.     {
    ) j$ S  C+ _; v( Z0 t8 s
  7. //设置使用内部晶振. X, h. H4 x1 X4 D3 U. g, \; ]
  8.         /* 开启HSI 即内部晶振时钟 */
    9 }9 @. q) J  }7 P8 U
  9.         RCC->CR |= ( uint32_t ) 0x00000001;
    $ s9 k! Z- T3 q; ~& ]% l
  10.         /*选择HSI为PLL的时钟源HSI必须2分频给PLL*/
    ; l4 g! m) v7 S8 ?9 D
  11.         RCC->CFGR |= ( uint32_t ) RCC_CFGR_PLLSRC_HSI_Div2;# F0 v) \% v! J
  12.         /*PLLCLK=8/2*9=36MHz  设置倍频得到时钟源PLL的频率*/
      }4 d- e6 V, a' ]4 S! ^' p8 c$ {
  13.         RCC->CFGR |= ( uint32_t ) RCC_CFGR_PLLMULL6;                         //设置倍频后的频率% U0 {. C4 M3 P7 C" B
  14.         /* PLL不分频输出 ?*/
    $ e9 C5 Q) k+ g- D9 f5 _+ ?
  15.         RCC->CFGR |= ( uint32_t ) RCC_CFGR_HPRE_DIV1;2 O' D- n4 d/ p
  16.         /* 使能 PLL时钟 */
    ! h! O2 ?' i0 e, ^7 ^' s
  17.         RCC->CR |= RCC_CR_PLLON;' t* R; B3 b. P6 ]2 ?
  18.         /* 等待PLL时钟就绪*/4 @/ _1 {* R, O, d8 z* t: ?& m8 b
  19.         while ( ( RCC->CR & RCC_CR_PLLRDY ) == 0 )  @/ B. X7 x  J$ }. y) m% L% I
  20.         {4 v: k' x8 j& k- j6 S
  21.         }; g# T6 w; Z4 F# Q" Z/ I' n
  22.         /* 选择PLL为系统时钟的时钟源 */
    0 G2 |" z7 O( }5 M
  23.         RCC->CFGR &= ( uint32_t ) ( ( uint32_t ) ~ ( RCC_CFGR_SW ) );- V7 S6 u" [! U) a0 G7 T$ ]6 V& C4 l
  24.         RCC->CFGR |= ( uint32_t ) RCC_CFGR_SW_PLL;
    ) ?: }8 [1 z8 r4 o. S
  25.         /* 等到PLL成为系统时钟的时钟源*/
    * V+ G# s4 W; x; ]
  26.         while ( ( RCC->CFGR & ( uint32_t ) RCC_CFGR_SWS ) != ( uint32_t ) 0x08 )
    2 H0 B! [& l- ?# a
  27.         { }0 D& ^8 \% g" U$ a6 R
  28.     }
    & h) @. b5 O6 d( a3 g
  29. #else4 d. }# O- N: ?0 d1 B' b
  30.     {* O! H! z7 k9 x0 d
  31. //设置使用外部8M晶振
    ' y8 x3 Q# Z" d* J9 Q% Y
  32.         /* Reset the RCC clock configuration to the default reset state(for debug purpose) */
      Q" K3 E' ?& E5 `+ e1 O  f/ i" v
  33.         /* Set HSION bit */# @6 @3 H# }% }
  34.         RCC->CR |= ( uint32_t ) 0x00000001;7 O' H9 x/ j$ G7 G

  35. 8 [8 p" X' B- I: d# k+ D
  36.         /* Reset SW, HPRE, PPRE1, PPRE2, ADCPRE and MCO bits */
    3 r1 @/ I( k/ p+ I  Y: h- _1 Y( q
  37. #ifndef STM32F10X_CL
    . f2 R9 c0 E" a8 k# R/ j, G
  38.         RCC->CFGR &= ( uint32_t ) 0xF8FF0000;" j- {) t, m; |& R! F- E
  39. #else% d  r1 f0 V! k1 [; X% y; G
  40.         RCC->CFGR &= ( uint32_t ) 0xF0FF0000;
      X$ v4 j; D9 V4 G
  41. #endif /* STM32F10X_CL */+ H) Q. b3 h3 J! t

  42. 1 _: P+ F: \+ B
  43.         /* Reset HSEON, CSSON and PLLON bits */4 u5 S! G" V9 a- j( x
  44.         RCC->CR &= ( uint32_t ) 0xFEF6FFFF;  r* u/ {5 k: v; }

  45. 1 p' d6 O$ o' h
  46.         /* Reset HSEBYP bit */. k( J1 t; Y7 r: s% I4 W+ C
  47.         RCC->CR &= ( uint32_t ) 0xFFFBFFFF;5 q+ B5 B5 j/ K$ W- i6 W

  48. ( J5 N  {. X# D% U; Z0 X1 U' U
  49.         /* Reset PLLSRC, PLLXTPRE, PLLMUL and USBPRE/OTGFSPRE bits */
    4 J' A' i3 E) i' H+ E- N
  50.         RCC->CFGR &= ( uint32_t ) 0xFF80FFFF;5 C: X1 j2 N, ^/ v

  51. 2 ]9 i1 A- @9 A% t) U" i3 q" f
  52. #ifdef STM32F10X_CL
    / R, U( [) y" t$ }8 b" K
  53.         /* Reset PLL2ON and PLL3ON bits */
    6 O. F: t4 [! @( X1 `
  54.         RCC->CR &= ( uint32_t ) 0xEBFFFFFF;& b6 E/ x0 k* H& [
  55. # O0 Y$ u  \; w) `; q
  56.         /* Disable all interrupts and clear pending bits  */
    $ m$ {* \: \; d' ~7 \
  57.         RCC->CIR = 0x00FF0000;) E. _: L8 p, M% t8 X# ^% w0 o  B0 e

  58. ; I" d4 h  _3 N1 Q! [" q6 _
  59.         /* Reset CFGR2 register */' w7 U5 D, `: A- P
  60.         RCC->CFGR2 = 0x00000000;! {+ \. w$ w. F* ~0 g" ]8 r% G
  61. #elif defined (STM32F10X_LD_VL) || defined (STM32F10X_MD_VL) || (defined STM32F10X_HD_VL)6 j7 R; ^6 ]4 `
  62.         /* Disable all interrupts and clear pending bits  */! \3 t0 e7 f) P1 t% J9 o; D! Z& n
  63.         RCC->CIR = 0x009F0000;
    # F5 V* K0 A- O8 U. J; U( p0 W
  64. 6 Z1 B/ _* ~. F4 V
  65.         /* Reset CFGR2 register */
    2 G; Y, S" b, c; H
  66.         RCC->CFGR2 = 0x00000000;$ ?! O- l, e/ N& Z
  67. #else$ z, y+ Y2 c7 n& p% P& Z' E# i; P
  68.         /* Disable all interrupts and clear pending bits  */
    3 E% e% w- M& S: m* ?; R
  69.         RCC->CIR = 0x009F0000;
    6 W7 M) r* O5 e8 v8 I& s; \
  70. #endif /* STM32F10X_CL */
      Q6 a9 e) I) p0 D- d1 X

  71. / @% c: x0 {# T! Y/ L& ?
  72. #if defined (STM32F10X_HD) || (defined STM32F10X_XL) || (defined STM32F10X_HD_VL)
    ; \  m% R1 U5 x1 _9 z
  73. #ifdef DATA_IN_ExtSRAM1 h5 o8 f' W- e( I% Q8 o( q8 H
  74.         SystemInit_ExtMemCtl();" N& i6 G$ S* I7 K, L9 J! e0 u
  75. #endif /* DATA_IN_ExtSRAM */, d/ [' j  a. x+ J
  76. #endif- X6 F1 `+ [  }# b+ t# N3 L, N

  77. # |. N+ h; V* n: A. X- t; x
  78.         /* Configure the System clock frequency, HCLK, PCLK2 and PCLK1 prescalers */
    1 W4 p/ @& F6 [5 |) j
  79.         /* Configure the Flash Latency cycles and enable prefetch buffer */
    ( y1 x# Q/ m( R6 i9 q, h" U* w
  80.         SetSysClock();
    ! [9 M. K; G  h# Y' b" {/ b
  81. / F2 C1 J- ?0 M! ^6 ^
  82. #ifdef VECT_TAB_SRAM' U  B% y8 m$ x0 a7 e; e7 D: G
  83.         SCB->VTOR = SRAM_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal SRAM. */1 O  E5 N0 y' a( L
  84. #else: n. w: ~0 f- _
  85.         SCB->VTOR = FLASH_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal FLASH. */1 Q2 b* C0 z3 w" J/ p
  86. #endif
    2 S, u# F4 X5 I& N- f! L
  87.     }: w# n" _& L1 ?* M" f8 h9 L+ d

  88. 8 s! T0 t# C( G( _/ K
  89. #endif
    3 q) H/ Q: k. R
  90. }
    4 O3 i9 {% S- [1 {& n6 l
复制代码
! q3 y0 O6 Z: y1 w3 F7 k( `1 t# y1 z
然后我简单拉高/低是试了一下引脚的电压 是正常的 大家可以去试试
8 d& C9 o$ H# ~& _+ {& X————————————————: B: E$ i7 |5 h
版权声明:文某9, ]  {  w2 X9 S
如有侵权请联系删除* R; i" F2 i, s  d" H6 h1 K8 P1 f
; w0 o2 K# a4 i7 U6 t
: f8 r. q% p9 n+ a% r' |
赞 收藏 评论0 发布时间:2023-5-1 17:15

举报

0个回答

所属标签

相似技术帖

官网相关资源

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