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

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

[复制链接]
STMCU小助手 发布时间:2021-11-25 16:00
STM32F0 单片机使用内部RC振荡器作为系统,软件修改% y, I1 R. A3 j
系统上电复位后,
7 K/ |* H1 D$ i8 F# T' _运行如下
" g7 h  a' l. M+ I
  1. ; Reset handler routine
    - ~4 L, J/ j2 w" f# Y
  2. Reset_Handler PROC9 u) h/ a. g- `8 t+ `; H# R* l
  3. EXPORT Reset_Handler [WEAK], G! v; b3 Q! ]( u. R* @, y
  4. IMPORT __main
    * }1 s9 c" B5 D  Y- H, ]
  5. IMPORT SystemInit: ]0 E) K' W9 J! J0 y, @1 y
  6. LDR R0, =SystemInit, ]# a" P  x+ h& I6 Y0 _1 k% i$ L
  7. BLX R0
    & O! Q/ v( E7 j
  8. LDR R0, =__main6 ~+ N+ _4 f& W* E4 ^8 @2 |& c' u
  9. BX R0
    6 h. L  ^3 M7 i
  10. ENDP
复制代码
3 ^9 N5 C5 k. b, P6 J
然后进入 system_stm32f0xx.c 文件& T6 P' _7 y' q. f3 u
在SystemInit函数里有 SetSysClock(); ,我们修改这个函数即可
2 g- O9 X6 p( P7 h+ [8 ~, ]/ e) ]" W
  1. void SystemInit (void)
    ) C# R9 c+ q/ `! h+ T; v# k
  2. {. H8 v7 q! o5 m; c' Y$ g
  3. /* Set HSION bit */
    5 y; J! @7 d7 S% o: k; ]
  4. RCC->CR |= (uint32_t)0x00000001;4 M* e- v! X) A' Y! a5 V) l

  5. 9 F+ G8 k8 \0 t' |% i
  6. #if defined (STM32F031) || defined (STM32F072) || defined (STM32F042)
    : I6 f1 _& F; Z! m' w" N
  7. /* Reset SW[1:0], HPRE[3:0], PPRE[2:0], ADCPRE and MCOSEL[2:0] bits /. K1 h2 x3 v3 z) H
  8. RCC->CFGR &= (uint32_t)0xF8FFB80C;
    " k2 P; Q3 M) p5 \- e/ f, r
  9. #else
    , t6 r! f5 ^3 q8 s: n
  10. / Reset SW[1:0], HPRE[3:0], PPRE[2:0], ADCPRE, MCOSEL[2:0], MCOPRE[2:0] and PLLNODIV bits /' ^' ^2 K  V- I1 j2 @+ i
  11. RCC->CFGR &= (uint32_t)0x08FFB80C;% b# H' n  X" z9 a0 v( [
  12. #endif / STM32F031*/( D0 M0 ^, y2 A5 C0 W
  13. / w6 `# c( E: a3 H, s+ F5 I
  14. /* Reset HSEON, CSSON and PLLON bits */
    % E* B* C3 E; q0 }0 P% ]" R
  15. RCC->CR &= (uint32_t)0xFEF6FFFF; //1111 1110 1111 0110 1111 1111 1111 11118 g* I% E5 ?: i3 m9 X
  16. & l$ f+ F* d& r8 ]4 w3 o
  17. /* Reset HSEBYP bit */1 ?) Y" [# Z4 A" M' \" k9 }
  18. RCC->CR &= (uint32_t)0xFFFBFFFF;8 a& z$ M6 a. }# O9 U4 d: y

  19. 2 {  t0 x) \& }- W- d
  20. /* Reset PLLSRC, PLLXTPRE and PLLMUL[3:0] bits */) G: x  [# w. t% ]( K
  21. RCC->CFGR &= (uint32_t)0xFFC0FFFF;
    % {( M! n  ?9 J: F9 _* [

  22. ( ?  M/ `2 ~; i% l& i
  23. /* Reset PREDIV1[3:0] bits */
    & [4 s# X( G' T: I
  24. RCC->CFGR2 &= (uint32_t)0xFFFFFFF0;
    5 L* I; x$ p- W; }; e

  25. 0 I0 M! j8 b  b6 o' @
  26. /* Reset USARTSW[1:0], I2CSW, CECSW and ADCSW bits */
    & H  r% f+ ~& Z! {" ]6 u
  27. RCC->CFGR3 &= (uint32_t)0xFFFFFEAC;% l2 g! F! }8 n6 s7 z) R; ~

  28. 3 y8 K4 F; |" w9 v6 k" r6 L! \
  29. /* Reset HSI14 bit */
    4 d4 q! n9 k6 |2 d/ p$ p& R
  30. RCC->CR2 &= (uint32_t)0xFFFFFFFE;
    , x& k' L; k: D* w, [' C

  31. 1 }5 Q7 |4 t2 p& `' a7 `3 n
  32. /* Disable all interrupts */7 j% C2 n# k) `- s) A5 |
  33. RCC->CIR = 0x00000000;
    9 @8 o: D& N! q

  34. ; e7 E. l3 u' S/ P6 J2 u
  35. /* Configure the System clock frequency, AHB/APBx prescalers and Flash settings */& x% f5 k3 O' Y4 q9 _# n2 _
  36. SetSysClock();
    ' p9 z3 B8 Z2 u3 A
  37. }
复制代码
& k" l$ J4 u' [& A$ W1 E, @
在文件system_stm32f0xx.c下修改static void SetSysClock(void)
1 `( u8 Y/ R$ z# Z如下:
+ B8 m7 v; s& E. W/ S# u
  1. static void SetSysClock(void)1 t& \9 I6 `# J3 Y
  2. {
    ( b9 I# {$ F! p2 F
  3. __IO uint32_t StartUpCounter = 0, HSIStatus = 0;
    9 P, l' i4 Q' B' K) A

  4. 5 d0 ]) e! Q% Y$ S
  5. /* SYSCLK, HCLK, PCLK configuration ----------------------------------------/0 M7 ^, ~) n# p. w" F. W
  6. / Enable HSI*/
    ) b/ Y# |* ?& K1 c. Q* [+ K
  7. RCC->CR |= ((uint32_t)RCC_CR_HSION); //RCC_CR_HSION,RCC_CR_HSEON
    5 |6 K3 p- D# I

  8. , s$ Z! |7 R+ v/ j
  9. /* Wait till HSE is ready and if Time out is reached exit */& F& v" n/ A$ ]5 S7 S
  10. do3 N- {  E1 W( m; p& G3 I7 k+ g8 m
  11. {
    4 }+ y# B+ S. ~+ c
  12. HSIStatus = RCC->CR & RCC_CR_HSIRDY;5 r) l8 L# ^, R3 I/ A( k6 \
  13. StartUpCounter++;
    ; \' o% F; V) `
  14. } while((HSIStatus == 0) && (StartUpCounter != HSI_STARTUP_TIMEOUT));: `- i- }1 f+ a# Z$ d
  15. . S& r- ^  J( P: `2 m( {/ `
  16. if ((RCC->CR & RCC_CR_HSIRDY) != RESET)
    . ~  T3 {% y$ Q' n6 y0 k: F
  17. {- \: v$ w( |- }4 m" h+ ?9 f
  18. HSIStatus = (uint32_t)0x01;
    0 |# O, n3 {/ c
  19. }4 w, C, c6 N0 @8 Z/ X/ h
  20. else" o# z, s3 `% i3 q
  21. {
    + Y1 c' M2 P& {, ?5 e
  22. HSIStatus = (uint32_t)0x00;
    # |9 k) W% S" j0 B- O# g' g
  23. }* Q# |& R' Z3 f3 L# j# P, m

  24. + x  ?) s6 F3 N, D6 ~
  25. if (HSIStatus == (uint32_t)0x01)
    3 A& M) e" g8 f' b0 [
  26. {
    ' i& Y9 P5 Y) m
  27. /* Enable Prefetch Buffer and set Flash Latency */  [8 A: V( H" h, p$ H0 s
  28. FLASH->ACR = FLASH_ACR_PRFTBE | FLASH_ACR_LATENCY;
    ; o+ b3 V) ]) j4 H

  29. " h, c/ `' {5 O8 @
  30. /* HCLK = SYSCLK */# I/ `  L* f0 o  _0 r
  31. RCC->CFGR |= (uint32_t)RCC_CFGR_HPRE_DIV1;
    3 j) z" k/ }% y/ m
  32. + ^. Y2 i. e! {: _3 X1 Z
  33. /* PCLK = HCLK */
    - W; o$ K4 \5 G: O6 s* p  P
  34. RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE_DIV1;- ^) N8 |9 E- b( r5 ^1 i! G
  35. & B# F) Z, W! y5 X1 L4 o& ~
  36. /* PLL configuration = HSE * 6 = 48 MHz */
    / K% l  ]* O! h2 l& R: S
  37. RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_PLLSRC | RCC_CFGR_PLLXTPRE | RCC_CFGR_PLLMULL));
    & `  E' |# z: Z
  38. RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLSRC_HSI_Div2  | RCC_CFGR_PLLMULL12);
    8 S$ \4 }! c! {( V
  39. ( J. Y9 ^  |# U' _# s5 p
  40. /* Enable PLL */
    ) y. [1 d, s3 S! ~, v
  41. RCC->CR |= RCC_CR_PLLON;( j( @0 P% l* m# y8 m) w
  42. 9 M/ Z5 Q7 I7 ?' s' V* J* j
  43. /* Wait till PLL is ready */, |! Y% n7 y' ?) \' r" l
  44. while((RCC->CR & RCC_CR_PLLRDY) == 0)( L7 `0 ^/ ^& f; o$ q
  45. {
    % M4 ~/ f( w0 i6 H
  46. }+ q4 U3 E% Q4 \% K4 s- k' }; q
  47. 4 P  R3 o' c3 n4 F6 ]% v; m
  48. /* Select PLL as system clock source */
    ) V( Z5 X+ v$ \, b1 p" C7 N
  49. RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_SW));
    2 S4 P4 n" t1 F9 C5 J* d. [; j6 L
  50. RCC->CFGR |= (uint32_t)RCC_CFGR_SW_PLL;    ! W; ^4 V" w; @

  51. 1 f. q! z  c  s/ R6 Y
  52. /* Wait till PLL is used as system clock source */% v  s# E* X  M" P) f
  53. while ((RCC->CFGR & (uint32_t)RCC_CFGR_SWS) != (uint32_t)RCC_CFGR_SWS_PLL)  t% b/ P+ ^$ G, q. n" H; G
  54. {
    % o- }1 _% J- I4 \7 L
  55. }
    , b2 E& |. j# z- x7 Z

  56. ! z5 j: K& R- L6 `8 p
  57. }$ l3 D" v' T6 m. ~5 h9 p( B4 J
  58. else
    8 H' T- x0 c# ]
  59. { /* If HSE fails to start-up, the application will have wrong clock; X4 i! M( a6 N" s- i5 F
  60. configuration. User can add here some code to deal with this error */
    # P: j. P4 x0 \9 a; d! Z! B4 a7 b
  61. }* ~9 \4 G9 r2 I1 H; Z
  62. }
复制代码
, Y! |/ b5 R8 H/ {  h
6 p) B0 N$ b% F% Q. M

; C7 t' J/ }1 k! Z0 j9 t
收藏 评论0 发布时间:2021-11-25 16:00

举报

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