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

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

[复制链接]
STMCU小助手 发布时间:2021-11-25 16:00
STM32F0 单片机使用内部RC振荡器作为系统,软件修改0 G! g% f# n" L
系统上电复位后,2 `1 f1 _- A+ W3 J- d/ L, c) e
运行如下* M; W, S9 F" u; q! Y- {* Z
  1. ; Reset handler routine
    * c7 L# z/ A2 L- P# L6 M7 d2 T
  2. Reset_Handler PROC9 ~* U" U$ N& G9 m3 y
  3. EXPORT Reset_Handler [WEAK]" X) V  S. Q3 M) C# b' E
  4. IMPORT __main
    2 F5 H) q0 g, k& ]6 w" T
  5. IMPORT SystemInit
    - j* h# T( w3 _6 k5 O
  6. LDR R0, =SystemInit
    ; S( k! e' V" K1 v* E: L+ G0 b
  7. BLX R0
    8 t$ P) U+ I1 m9 ?$ z; ]% L
  8. LDR R0, =__main" k* H) W" a% H) ~% X- N; I
  9. BX R0
    7 x+ }8 a  B3 a: N
  10. ENDP
复制代码

9 ]9 m. U3 O* |  Y. C) H7 e, H然后进入 system_stm32f0xx.c 文件2 Q" u0 x8 c& q. t4 C/ y0 B
在SystemInit函数里有 SetSysClock(); ,我们修改这个函数即可
8 K( i1 z5 i; k# \' w
! L& h- J+ E, z4 v+ y
  1. void SystemInit (void): c: p' s0 ?6 A1 w( {
  2. {
    6 _" u1 Y8 _5 a: x& s) l' V
  3. /* Set HSION bit */; J: W6 s: x6 d  i6 f: [; P# |1 P! j
  4. RCC->CR |= (uint32_t)0x00000001;) K  |8 j! x* x
  5. & |. T8 Y" S0 f' T( z' [5 T: t
  6. #if defined (STM32F031) || defined (STM32F072) || defined (STM32F042)
    ; f* }3 e/ @% V0 w& P$ B
  7. /* Reset SW[1:0], HPRE[3:0], PPRE[2:0], ADCPRE and MCOSEL[2:0] bits /. X/ l: m, f( w2 C6 H' b" f) O
  8. RCC->CFGR &= (uint32_t)0xF8FFB80C;. M" u: L! |3 {0 H, y: x/ R" x9 M
  9. #else* r$ e% s& u0 ~- z8 s, s
  10. / Reset SW[1:0], HPRE[3:0], PPRE[2:0], ADCPRE, MCOSEL[2:0], MCOPRE[2:0] and PLLNODIV bits /4 _  Q- T0 s: W( b/ ]
  11. RCC->CFGR &= (uint32_t)0x08FFB80C;/ m3 F2 w/ P) x( H7 A8 ^8 F
  12. #endif / STM32F031*/
    $ s" c, T2 |1 r. a" ]

  13. * X" f- p- U/ l9 N6 x6 C
  14. /* Reset HSEON, CSSON and PLLON bits */
    , C/ U# v! A! Z
  15. RCC->CR &= (uint32_t)0xFEF6FFFF; //1111 1110 1111 0110 1111 1111 1111 1111
    & D5 Y8 ]: U. J% C* }+ M

  16. 0 ~2 h5 J9 B! G$ t
  17. /* Reset HSEBYP bit */* w4 w4 D, u6 }. K/ e8 w( o% b  x% |
  18. RCC->CR &= (uint32_t)0xFFFBFFFF;
    8 O3 I2 E* S( T$ b1 m
  19. ' b6 ?! F1 B6 j! _  a
  20. /* Reset PLLSRC, PLLXTPRE and PLLMUL[3:0] bits */
    * a8 I( M9 Y- \9 Y: }* `( e+ {
  21. RCC->CFGR &= (uint32_t)0xFFC0FFFF;
    / W2 @; c5 A2 {0 v" q/ r0 w

  22. 2 B8 h! }8 b* p+ a5 ~0 [7 q7 @# _
  23. /* Reset PREDIV1[3:0] bits */
    - B# P7 u- B0 g5 k
  24. RCC->CFGR2 &= (uint32_t)0xFFFFFFF0;
    : [1 {  b2 M  Y: I) N5 K  J

  25. 7 @8 R+ X/ Y8 {. O# F7 D
  26. /* Reset USARTSW[1:0], I2CSW, CECSW and ADCSW bits */
    6 v" k$ V$ W0 o  x& k5 y& @9 X
  27. RCC->CFGR3 &= (uint32_t)0xFFFFFEAC;8 R9 C% h0 A+ [0 V& E
  28. 3 W  y9 u" [% v& M$ f: K! x
  29. /* Reset HSI14 bit */  W7 k4 _) A  \8 k3 H* H4 f
  30. RCC->CR2 &= (uint32_t)0xFFFFFFFE;
    3 s$ y, \4 R4 L# U: L

  31. & s8 [7 j& d7 }, s, }  g( f
  32. /* Disable all interrupts */8 M5 L/ L5 E& Y3 o  y
  33. RCC->CIR = 0x00000000;
    ) ^  M) Y: y1 t  q  |* ]

  34. 0 b+ W! ?1 _* p
  35. /* Configure the System clock frequency, AHB/APBx prescalers and Flash settings */
    3 m+ U9 L# C- G% \  L$ ^# f
  36. SetSysClock();6 t1 L& o% r; l/ H, j  j
  37. }
复制代码
' V1 c8 V+ n$ _
在文件system_stm32f0xx.c下修改static void SetSysClock(void)1 W; f0 J6 Y0 t" K1 i4 m1 S
如下:" u; V/ e' |7 `# y* o
  1. static void SetSysClock(void)
    ' M- g& J* v0 N0 a# o$ c# a8 X$ B
  2. {( B$ T; z8 Z- e# _3 ?! f
  3. __IO uint32_t StartUpCounter = 0, HSIStatus = 0;3 _8 _" ?) x! Q8 [4 N
  4. . K( y/ q  g/ ^5 q& n( {
  5. /* SYSCLK, HCLK, PCLK configuration ----------------------------------------/; S3 w: w+ d/ x% n( z
  6. / Enable HSI*/7 ?; d( ?1 i0 q
  7. RCC->CR |= ((uint32_t)RCC_CR_HSION); //RCC_CR_HSION,RCC_CR_HSEON
    / _* M9 u4 H; r5 l" T/ P1 S

  8. : [$ n5 s' ~* u6 {( W# }3 z% u
  9. /* Wait till HSE is ready and if Time out is reached exit */2 W3 w/ N  A8 L: {7 p
  10. do
    5 d& B$ `+ X" o7 }. W7 S0 i* R
  11. {
    4 k6 m3 L9 U0 \: _+ P  U6 A+ y
  12. HSIStatus = RCC->CR & RCC_CR_HSIRDY;
    ) M* b$ P" X+ h# o- o
  13. StartUpCounter++;
    / r" m5 l5 \+ D7 W
  14. } while((HSIStatus == 0) && (StartUpCounter != HSI_STARTUP_TIMEOUT));+ Z/ O. D7 E; }# r

  15. ! }0 r' y" V& |9 C  e7 Z6 `( O
  16. if ((RCC->CR & RCC_CR_HSIRDY) != RESET)
    7 h% q. @5 ~1 b/ x1 E( R
  17. {
    / t# J" W, E5 ]5 k- z2 V6 `6 B, U; N
  18. HSIStatus = (uint32_t)0x01;
    3 J2 _* X3 b5 m! W, |
  19. }# O; ?- N& q2 ?
  20. else
    ; f$ k: `# s3 b  I$ Y0 t5 P3 ~% Y
  21. {$ c% q( d7 R9 H7 v( N# V
  22. HSIStatus = (uint32_t)0x00;
    # l5 Z5 X0 G$ V5 @- U. y
  23. }
    + W3 ^& K: [) Y! h( w; J! ~
  24. 8 d) q& [; w' S$ F. v
  25. if (HSIStatus == (uint32_t)0x01)
    5 ^+ D% d) R# m; C% n( m) s
  26. {
    4 ?9 d: j" y/ A  N- d
  27. /* Enable Prefetch Buffer and set Flash Latency */
    $ b9 q5 ~  M6 ^; o
  28. FLASH->ACR = FLASH_ACR_PRFTBE | FLASH_ACR_LATENCY;
    - V  P# U: Z5 j

  29. 6 u" |+ }+ |* i2 R/ m4 N1 W
  30. /* HCLK = SYSCLK */
    " t  P1 a; @0 i) M- b" |# p
  31. RCC->CFGR |= (uint32_t)RCC_CFGR_HPRE_DIV1;) Y! @; Z7 x% h* `0 ^: k( ]* b) O
  32. 1 p% q( e) E: C3 P: y6 g
  33. /* PCLK = HCLK */
    5 {' l  [5 r3 ~+ m8 m$ C+ _
  34. RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE_DIV1;, @$ o! D5 m$ D! u! R

  35. % ?7 N+ q& ~( l5 L
  36. /* PLL configuration = HSE * 6 = 48 MHz */& ^0 X/ H' f- H9 z
  37. RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_PLLSRC | RCC_CFGR_PLLXTPRE | RCC_CFGR_PLLMULL));6 p+ q# ]( u6 ^" `' p# u
  38. RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLSRC_HSI_Div2  | RCC_CFGR_PLLMULL12);0 i7 T. r# R# D3 X9 ^

  39. " Y: ~7 c0 Q' Q- Z; z
  40. /* Enable PLL */
    . v, {8 Z6 p; Q! ]
  41. RCC->CR |= RCC_CR_PLLON;
    " m3 @( v' S3 G" A  s

  42. ! g& K$ ?4 P1 F5 g& v- r
  43. /* Wait till PLL is ready */) w1 B1 z) @( ^7 Y  m% m  \
  44. while((RCC->CR & RCC_CR_PLLRDY) == 0)
    1 J/ P) x8 d5 J
  45. {
    9 o. H2 p0 g$ v, h& ?3 b& ~
  46. }2 |* ^" C! L: T) t6 x
  47. & E& P. _1 [2 x9 Z
  48. /* Select PLL as system clock source */
    $ w* S5 z1 W) }% u/ ?; l
  49. RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_SW));
    & z8 G2 B  x+ @+ V$ g
  50. RCC->CFGR |= (uint32_t)RCC_CFGR_SW_PLL;   
    . y6 ]4 h! P, H) g2 |, x; n

  51. + D* v- H5 K1 l3 t; {9 K+ o
  52. /* Wait till PLL is used as system clock source */
    ! W7 o2 o! x; D' b
  53. while ((RCC->CFGR & (uint32_t)RCC_CFGR_SWS) != (uint32_t)RCC_CFGR_SWS_PLL)
    ( {' @7 r* X) j& f' T+ A* b
  54. {
    5 P) R+ [/ K/ C$ }: [" T3 R
  55. }, T; v# d6 ^8 S9 Z( z% K

  56. ' _1 `7 e3 T6 y& X( I: U% t9 n$ k
  57. }+ o# C6 L1 y* J% e
  58. else, O. n+ x: u; @) y  a: E# }; C
  59. { /* If HSE fails to start-up, the application will have wrong clock
    + i8 U2 f$ l2 t" {$ @# s, U( H
  60. configuration. User can add here some code to deal with this error */
    ; ?. W7 S$ z( L5 \, H
  61. }
    % I7 P; Z: E  v1 |! `
  62. }
复制代码
' `9 }# ^" l* ^" I8 R
! [. `5 n! T( X/ _/ H# f7 o

+ `& p& l  w9 H& c; i' \
收藏 评论0 发布时间:2021-11-25 16:00

举报

0个回答

所属标签

相似技术帖

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