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

【经验分享】STM32F0 单片机使用内部RC振荡器作为系统,软件修改

[复制链接]
STMCU小助手 发布时间:2021-11-25 16:00
STM32F0 单片机使用内部RC振荡器作为系统,软件修改) Q) w' _' p1 h
系统上电复位后,
' F- a! z+ b7 U运行如下
9 ]- i! z$ P( ]0 [) k
  1. ; Reset handler routine& o5 _; p) d% ~, U9 q- ]. C" |! a
  2. Reset_Handler PROC! |* M7 |) U+ g3 Z8 f2 f
  3. EXPORT Reset_Handler [WEAK]
      p; r/ E+ \$ W: }3 v" J8 @
  4. IMPORT __main
    ! W' ^9 }6 E$ M) |
  5. IMPORT SystemInit- Y6 i: A8 u% g- o7 N
  6. LDR R0, =SystemInit
    5 [9 G& N& Y% E' v- N
  7. BLX R0
    3 \9 Z8 r- Y9 {2 [
  8. LDR R0, =__main; r  Z  R0 _' a0 l" a, r
  9. BX R0
      n6 D; a# H+ ^/ n# E
  10. ENDP
复制代码
2 o3 x6 s7 w' h: a( E7 Q
然后进入 system_stm32f0xx.c 文件
$ n! v4 F3 \1 h0 Q# l* p在SystemInit函数里有 SetSysClock(); ,我们修改这个函数即可
0 K9 U2 T: W) c8 W- t  S/ S9 I+ |
& q: b2 i. ]( ]
  1. void SystemInit (void)
    * X+ m0 W: d7 o2 K
  2. {4 Q% K. I! g$ {; k( Z
  3. /* Set HSION bit */
    7 O2 A8 L7 W; Q# ~- U
  4. RCC->CR |= (uint32_t)0x00000001;5 w5 e" Y5 `4 P& E$ a3 q% ^; l7 d
  5. 1 k$ B5 |5 L; @8 C8 u  r
  6. #if defined (STM32F031) || defined (STM32F072) || defined (STM32F042)/ x& \  U* K  \  `
  7. /* Reset SW[1:0], HPRE[3:0], PPRE[2:0], ADCPRE and MCOSEL[2:0] bits /
    * H  Y5 j' y2 D" w
  8. RCC->CFGR &= (uint32_t)0xF8FFB80C;
    " X1 u+ ]  \- i2 b
  9. #else- W1 J0 n# x9 B! g+ E
  10. / Reset SW[1:0], HPRE[3:0], PPRE[2:0], ADCPRE, MCOSEL[2:0], MCOPRE[2:0] and PLLNODIV bits /
    7 W+ f; z& T6 \  W; X9 O* G
  11. RCC->CFGR &= (uint32_t)0x08FFB80C;
    # S1 O  q! ~5 [& @
  12. #endif / STM32F031*/8 u- s( C8 [1 J
  13. 5 c: o: U& J+ c4 N
  14. /* Reset HSEON, CSSON and PLLON bits */4 s) Q4 ?6 m3 m& i% |8 q& u1 y
  15. RCC->CR &= (uint32_t)0xFEF6FFFF; //1111 1110 1111 0110 1111 1111 1111 1111, ~' j* A9 \7 W  b7 A

  16. 1 v  X* p2 s. {. E6 A% W7 y! i7 l
  17. /* Reset HSEBYP bit */
    . s, O2 t8 q- z1 D
  18. RCC->CR &= (uint32_t)0xFFFBFFFF;
    0 r$ r0 _) Z. v: a- [9 Q1 U0 A

  19. , o7 }# t# K7 q& R# D
  20. /* Reset PLLSRC, PLLXTPRE and PLLMUL[3:0] bits */
    9 g( O6 R& g* K: s; u
  21. RCC->CFGR &= (uint32_t)0xFFC0FFFF;
    5 u9 t& c* i0 H
  22. , `7 k- _6 {2 C! X0 ]
  23. /* Reset PREDIV1[3:0] bits */8 Z. B2 x! T3 g8 _
  24. RCC->CFGR2 &= (uint32_t)0xFFFFFFF0;
    " ]" K0 y, H" J! e% n8 y5 j
  25. 7 w& B' Q& M' ?0 K* {! r0 b
  26. /* Reset USARTSW[1:0], I2CSW, CECSW and ADCSW bits *// V$ N. N  ?: D
  27. RCC->CFGR3 &= (uint32_t)0xFFFFFEAC;
    : m& I' x4 x8 Y, A/ z* u+ \
  28. 3 Q8 f: [5 l% J+ R
  29. /* Reset HSI14 bit */
    8 k6 y; |: M; J" l0 J
  30. RCC->CR2 &= (uint32_t)0xFFFFFFFE;
    + E. }; G; f: t/ `

  31.   z' v7 {/ D2 o& w& Y+ a
  32. /* Disable all interrupts */
    # s2 x% |6 d  J! r* J  H
  33. RCC->CIR = 0x00000000;
    5 F/ I# q. G8 b7 r2 P3 Z
  34. 6 R+ f% D7 v9 s. ]5 _
  35. /* Configure the System clock frequency, AHB/APBx prescalers and Flash settings */
    ; Q& O4 b- y$ Y
  36. SetSysClock();
    % H* G5 u  }( ~
  37. }
复制代码

. k8 y  ?4 p5 |/ @; W/ o在文件system_stm32f0xx.c下修改static void SetSysClock(void)7 H8 Q" J7 V4 D( P2 v
如下:3 \6 N) T2 }: G2 [1 u
  1. static void SetSysClock(void)
    / }6 ?- B" Z5 w  j, Z* h/ b
  2. {  L/ i7 A/ p) f' u
  3. __IO uint32_t StartUpCounter = 0, HSIStatus = 0;
    $ `, u8 s* I" p8 x4 D9 K; E8 w
  4. . E2 x4 d  l" {( q. ?7 T
  5. /* SYSCLK, HCLK, PCLK configuration ----------------------------------------/
    % T& V1 ?% e# ^% k# r
  6. / Enable HSI*/7 l+ i& I5 F) {3 v+ I) u) E
  7. RCC->CR |= ((uint32_t)RCC_CR_HSION); //RCC_CR_HSION,RCC_CR_HSEON
    8 B+ x$ H/ |6 F8 T0 n
  8. - D3 J! ?. e3 X# V7 z) o
  9. /* Wait till HSE is ready and if Time out is reached exit */
    5 W8 S" S8 f; t- }+ R- M. a
  10. do( P6 r9 Q& J6 |* ^8 I4 q
  11. {
    8 N  ~* \4 Q" `8 G
  12. HSIStatus = RCC->CR & RCC_CR_HSIRDY;$ j4 Z. N& n  U. R# B
  13. StartUpCounter++;& ^% j+ d! _4 m! s7 M% c, N
  14. } while((HSIStatus == 0) && (StartUpCounter != HSI_STARTUP_TIMEOUT));' ?  t' T1 E% p* t" X6 O( U

  15. & I0 J3 x! H* l
  16. if ((RCC->CR & RCC_CR_HSIRDY) != RESET)* s# z7 w: Q, E: R7 I( H
  17. {/ F3 D) E" \% c) f# ]0 W
  18. HSIStatus = (uint32_t)0x01;, I5 f/ C) u: p' ?+ C
  19. }
    - q/ Z* x/ h+ g/ D1 d# L
  20. else) S) E  G, z6 @( T; X! q$ q! _
  21. {0 {$ E. v# R0 r: ~
  22. HSIStatus = (uint32_t)0x00;
    ; _' E3 q% T3 R0 o) W
  23. }
    ( R$ z9 G. Q/ o( P- x

  24. . h5 A+ }. p- C! t
  25. if (HSIStatus == (uint32_t)0x01)* o  C$ k6 R: `
  26. {
    $ `2 |' i: J$ P; v/ d' w
  27. /* Enable Prefetch Buffer and set Flash Latency */7 v7 y0 b" Z: u+ ]0 S
  28. FLASH->ACR = FLASH_ACR_PRFTBE | FLASH_ACR_LATENCY;
    / L1 b) S, N2 q# S! h

  29. % s/ y- {" F0 D
  30. /* HCLK = SYSCLK */# W0 Y$ t- O, c& z: K
  31. RCC->CFGR |= (uint32_t)RCC_CFGR_HPRE_DIV1;. N) a, X5 o% p. h- }% j
  32. 2 l* V* r: h5 m0 x2 K( w% c1 Z0 r
  33. /* PCLK = HCLK */
    8 ]* N$ }7 m7 ~( C. U; H# R! U+ W! K5 b/ S
  34. RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE_DIV1;
    0 x+ y, ~3 O$ e) F* W

  35. $ H, b1 ?! c) `, F" ^
  36. /* PLL configuration = HSE * 6 = 48 MHz */; v$ L. L, `7 H: {7 d7 `
  37. RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_PLLSRC | RCC_CFGR_PLLXTPRE | RCC_CFGR_PLLMULL));
    1 T! D* P' B' v- L- P
  38. RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLSRC_HSI_Div2  | RCC_CFGR_PLLMULL12);
    0 q3 ]% X+ ]- e
  39. 0 B# e$ v# S1 Y4 B( k: y
  40. /* Enable PLL */5 c+ u6 H9 e4 W; k0 |6 _/ ]
  41. RCC->CR |= RCC_CR_PLLON;
    0 O6 ~, y' G" e$ ^* D+ [

  42. " R. g  L4 J; `1 o/ i
  43. /* Wait till PLL is ready */7 ~$ Z6 F$ u  X0 u* t% t: ~
  44. while((RCC->CR & RCC_CR_PLLRDY) == 0)
    - P) W7 H% V: {% q& U) h
  45. {
    # z1 a$ N0 {/ \7 G% x7 y6 y
  46. }
    $ Z/ ^* w- @: O- \

  47. ; J7 ^& P0 b7 n3 H; z
  48. /* Select PLL as system clock source */* y, h* i7 S+ z5 f0 ?3 G8 i
  49. RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_SW));
    5 o8 m' O" a5 D$ ?( E4 K
  50. RCC->CFGR |= (uint32_t)RCC_CFGR_SW_PLL;   
    ' L) l( d: `% s1 `6 i1 v
  51. & M6 k" n5 j/ R
  52. /* Wait till PLL is used as system clock source */
    # [3 g8 f! Z) h/ K3 X: C6 K
  53. while ((RCC->CFGR & (uint32_t)RCC_CFGR_SWS) != (uint32_t)RCC_CFGR_SWS_PLL)
    2 ?, V5 \  Z- a1 _6 P/ _) [; t
  54. {. `' o' o9 l$ {
  55. }' s" b5 c: ]5 v2 T9 }
  56. 0 E' y8 `6 v! }8 f8 m4 J% {5 u) @
  57. }
    6 ]" T7 c" ^# n" K* j
  58. else
    ) k6 ]! u. f, P% H$ x$ @* U+ c
  59. { /* If HSE fails to start-up, the application will have wrong clock
    + u' u- U; e) K. \
  60. configuration. User can add here some code to deal with this error */& H5 O% x8 |0 H3 z- ~$ M+ q5 y& H
  61. }
    9 ^+ U/ W7 X2 u% |3 J: w1 [5 W6 S
  62. }
复制代码

* g0 g1 d* i" F  R. `: @
3 B$ k4 u9 s6 A3 ?6 ^7 V" J0 K/ q8 E
收藏 评论0 发布时间:2021-11-25 16:00

举报

0个回答

所属标签

相似技术帖

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