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

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

[复制链接]
STMCU小助手 发布时间:2021-11-25 16:00
STM32F0 单片机使用内部RC振荡器作为系统,软件修改
, A2 a2 \0 B3 a1 `$ ?. w& S系统上电复位后,
0 q' `7 |- S9 ^, v+ a4 o  h运行如下0 i2 f/ C! w5 ~
  1. ; Reset handler routine8 a1 D' p8 k: a: |" }
  2. Reset_Handler PROC
    ' L# X# X, C) P5 B2 ^( S2 ~
  3. EXPORT Reset_Handler [WEAK]) p5 X: C2 e0 C5 w' ?
  4. IMPORT __main
    $ b/ E0 }5 B3 j5 E! g
  5. IMPORT SystemInit
    " F$ C" d7 @$ t4 x/ ?* v: d
  6. LDR R0, =SystemInit8 C4 f7 R5 g; E; `+ k9 a
  7. BLX R08 P' O8 g/ m: M, r
  8. LDR R0, =__main( f; V6 h2 h' b1 P6 U
  9. BX R0- C  \8 F+ X) s( E
  10. ENDP
复制代码

* C$ |2 \6 |& [& m- E; c然后进入 system_stm32f0xx.c 文件
1 ?2 d3 \  d; t% e在SystemInit函数里有 SetSysClock(); ,我们修改这个函数即可
( x  F, i$ S( X/ S
  R0 b; M3 }2 a
  1. void SystemInit (void)
    # G' M( G5 u" Z5 p& O" S
  2. {
    : h  |& `. _$ E. o
  3. /* Set HSION bit */
    9 v2 H3 V) \, m1 v! ~7 e
  4. RCC->CR |= (uint32_t)0x00000001;6 Q' P$ @/ q* c0 ^4 H) \: }

  5. + H+ z0 j2 t, t' ]- J! h
  6. #if defined (STM32F031) || defined (STM32F072) || defined (STM32F042)/ R3 a- r) w) W) T' k% v; b
  7. /* Reset SW[1:0], HPRE[3:0], PPRE[2:0], ADCPRE and MCOSEL[2:0] bits /. L5 v# x$ R0 ~
  8. RCC->CFGR &= (uint32_t)0xF8FFB80C;
    : L. ?8 V+ f$ G- B7 N* `3 F
  9. #else1 o6 x9 [; v. Z/ s' G
  10. / Reset SW[1:0], HPRE[3:0], PPRE[2:0], ADCPRE, MCOSEL[2:0], MCOPRE[2:0] and PLLNODIV bits /0 M! k# C; p& ~# ~0 H7 b5 Q
  11. RCC->CFGR &= (uint32_t)0x08FFB80C;
    / O; k5 V, Z  R7 e
  12. #endif / STM32F031*/
    0 Z! a& l' W: H) o6 l0 C- O" m

  13. 2 M! L$ l* W! \0 V% L1 V
  14. /* Reset HSEON, CSSON and PLLON bits */4 r* Z- ^9 {+ Y- ~( O8 Q' ?8 r4 l
  15. RCC->CR &= (uint32_t)0xFEF6FFFF; //1111 1110 1111 0110 1111 1111 1111 11113 V' W/ m" Y+ P, E/ r; y
  16. ( q+ a5 I# M3 f" W" H
  17. /* Reset HSEBYP bit */8 i& t0 t9 H" T* u8 _
  18. RCC->CR &= (uint32_t)0xFFFBFFFF;
    " a' c  y$ m: r( \7 J0 _
  19. 6 a4 g& ~, `$ u* `7 V/ v( i
  20. /* Reset PLLSRC, PLLXTPRE and PLLMUL[3:0] bits */
    # [+ o( w# s5 W/ o% z
  21. RCC->CFGR &= (uint32_t)0xFFC0FFFF;
    / X0 O0 C1 G8 z$ v. G

  22. * y$ g1 ^& V+ D7 s1 s6 b1 c
  23. /* Reset PREDIV1[3:0] bits */
    ! D9 K; G8 [. S
  24. RCC->CFGR2 &= (uint32_t)0xFFFFFFF0;- U# k2 b, O9 U$ ?. L: u
  25. 8 j; G+ F1 f2 z% W5 ^! _' m* T! C
  26. /* Reset USARTSW[1:0], I2CSW, CECSW and ADCSW bits */9 b# i% n7 [$ [
  27. RCC->CFGR3 &= (uint32_t)0xFFFFFEAC;
    " e5 F% J$ n& S: X! _7 x- S
  28. . K5 e/ X) f3 X: S
  29. /* Reset HSI14 bit */
    0 D" t  A* |9 O: b! ~* B
  30. RCC->CR2 &= (uint32_t)0xFFFFFFFE;, O& k7 g: n% m! x2 j1 L% `
  31. 6 G; T7 A+ A5 {+ q9 a
  32. /* Disable all interrupts */" o# y$ i3 e5 Z; l4 o) g* ~1 N
  33. RCC->CIR = 0x00000000;6 x) ~9 k2 E/ d1 Z' T# G) a

  34.   V3 b6 V) M* N9 C& d! z  m
  35. /* Configure the System clock frequency, AHB/APBx prescalers and Flash settings */
    : q) @$ E" A* l* p5 v3 d$ Z
  36. SetSysClock();
    ; m/ V; U/ T+ p
  37. }
复制代码

8 Q& W4 W& \* I! G9 t' B  K在文件system_stm32f0xx.c下修改static void SetSysClock(void)
, W( Q$ z/ ~; R) A0 H6 f8 E如下:' N3 Z: s9 q: j, d. q
  1. static void SetSysClock(void)
    ( w' [% w) q9 m6 f, @, {) j% c/ i
  2. {
    6 O7 k3 \( j+ {: r. H/ f6 V) N
  3. __IO uint32_t StartUpCounter = 0, HSIStatus = 0;, U% C6 k- \( p! e

  4. 4 {' p$ B( K) i9 k9 ^
  5. /* SYSCLK, HCLK, PCLK configuration ----------------------------------------/! ?& c# |1 \) [9 h% P2 z0 }
  6. / Enable HSI*/
    * Y. X* Z7 O# E* r- ]
  7. RCC->CR |= ((uint32_t)RCC_CR_HSION); //RCC_CR_HSION,RCC_CR_HSEON
    8 c3 F$ U9 Z; H' c4 I# x, V
  8. $ r& b+ J6 X6 K( E' X( Y
  9. /* Wait till HSE is ready and if Time out is reached exit */* @/ k7 }8 ]& n" N
  10. do% ^( a: J  p3 F9 I; C
  11. {5 O5 ]1 J2 I7 q, V% r& h
  12. HSIStatus = RCC->CR & RCC_CR_HSIRDY;2 Z8 Y& u* ^( @$ |
  13. StartUpCounter++;# c2 D$ Q8 Q4 L
  14. } while((HSIStatus == 0) && (StartUpCounter != HSI_STARTUP_TIMEOUT));
    ) |0 ^+ h4 z5 y9 N/ H& _

  15. . U2 K5 p+ O; W6 b3 D
  16. if ((RCC->CR & RCC_CR_HSIRDY) != RESET)
    % G+ D6 L& f2 N0 U/ V' L
  17. {
    " E" A+ [* M3 L  k& k: Q
  18. HSIStatus = (uint32_t)0x01;
    - R, C3 o  S* P7 F( `
  19. }
    ! ]" s6 d. _/ W+ C  q! P9 M( R6 C6 U
  20. else: }5 F1 g4 j# m& a# G" y5 v4 _
  21. {
    6 k" K# A+ Q- \  U7 _, D
  22. HSIStatus = (uint32_t)0x00;
    + c7 h: @! e" o8 \
  23. }
    ' X  P& H; e) O$ k4 W: ?

  24. , c8 Q# Z2 d% N1 {7 x7 h' b
  25. if (HSIStatus == (uint32_t)0x01)& j0 C6 U0 G6 c! i; x0 X2 {& e
  26. {" N. h" A, O  c) b% s
  27. /* Enable Prefetch Buffer and set Flash Latency */9 `% Y5 G# C' n- |" U) }8 `
  28. FLASH->ACR = FLASH_ACR_PRFTBE | FLASH_ACR_LATENCY;
    ' P$ ~" x* M$ ~& i

  29. 7 M1 _# E% T1 K' g- m. T' \' X
  30. /* HCLK = SYSCLK */% g0 a! a5 b: i- P9 H; ]
  31. RCC->CFGR |= (uint32_t)RCC_CFGR_HPRE_DIV1;3 Z% J& E7 n' N+ h

  32. 6 C( A) B7 U1 p" k
  33. /* PCLK = HCLK */: u9 J$ L) f. R  f5 e
  34. RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE_DIV1;; J: i9 p9 g; N0 {
  35. ( x6 c! T* g4 T4 l
  36. /* PLL configuration = HSE * 6 = 48 MHz */2 e& _, l1 c! [0 X2 {8 Z
  37. RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_PLLSRC | RCC_CFGR_PLLXTPRE | RCC_CFGR_PLLMULL));( y5 F6 Y/ ?6 U2 U3 F1 w
  38. RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLSRC_HSI_Div2  | RCC_CFGR_PLLMULL12);
    6 `3 c& k) F4 @* g4 j# N
  39. 0 u$ a( z/ ]0 `. M  r7 x4 Z
  40. /* Enable PLL */8 S6 H% A) M0 K" V
  41. RCC->CR |= RCC_CR_PLLON;+ K# [( x  \2 T

  42. * A8 Q3 Q4 K* B7 C8 n; V6 }
  43. /* Wait till PLL is ready */# v: t6 G) b! [
  44. while((RCC->CR & RCC_CR_PLLRDY) == 0)  ^. B" _6 m) d2 C
  45. {
    5 ~) K; Y5 X/ I9 g; u
  46. }' \+ {0 D1 G8 d, c+ g5 }$ F
  47. ' r0 H) U- D' }7 m* h: X; e- m
  48. /* Select PLL as system clock source */, U* j# ]$ u0 `. U) s$ {( z4 Y
  49. RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_SW));
    3 s; B2 |8 ~; ~& Q5 l9 Z6 M- g/ v
  50. RCC->CFGR |= (uint32_t)RCC_CFGR_SW_PLL;   
    ) ^. m5 l3 Z9 E5 K3 N8 g' a) G

  51. 2 s& U/ J" n4 @1 i/ p5 D. b4 A" z
  52. /* Wait till PLL is used as system clock source */
    7 A/ w. W7 C! M5 |! b; w: J/ Q# G
  53. while ((RCC->CFGR & (uint32_t)RCC_CFGR_SWS) != (uint32_t)RCC_CFGR_SWS_PLL)* U/ e5 ]1 t1 i, S7 y  q% G  N0 h' d: {9 ^
  54. {9 z3 l+ P" k7 P
  55. }
    9 `5 f, B8 f* C2 ]7 r0 _; ~

  56. ! Y" F/ _' O  S* A7 d( `$ C/ E! ^2 ~
  57. }
    ( \. x0 m+ G& h
  58. else
    " ~4 q  G; B( d5 g
  59. { /* If HSE fails to start-up, the application will have wrong clock
    & g7 q7 M  e) t( ~' K
  60. configuration. User can add here some code to deal with this error */, N- g$ Q: B$ B& ]8 x
  61. }
    ( I8 @& f( m+ o- w( }' m
  62. }
复制代码
- y# z: W( G( ]$ z8 I
* v& b( m5 a: d

  L5 r- Y7 k+ t5 f1 T: j5 N" u! ^
收藏 评论0 发布时间:2021-11-25 16:00

举报

0个回答

所属标签

相似技术帖

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