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

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

[复制链接]
STMCU小助手 发布时间:2021-11-25 16:00
STM32F0 单片机使用内部RC振荡器作为系统,软件修改
" n$ m* T! [. e4 S3 h; ?+ A系统上电复位后,6 E; X7 S% M+ n" Q4 i' T7 i
运行如下
+ }4 P: ~. g* P1 N* f9 N
  1. ; Reset handler routine9 i( o& ~; v1 E. t, o; h
  2. Reset_Handler PROC
    / |8 y2 b7 ^  @
  3. EXPORT Reset_Handler [WEAK]
    * t# A1 L& o$ }! n8 A+ a, s. e
  4. IMPORT __main; y5 F- S  o5 o* d
  5. IMPORT SystemInit
    . V% d- r. Z: a: p+ |
  6. LDR R0, =SystemInit
    + f' G! ?6 l- S5 m& i
  7. BLX R0
    + i! q6 ^+ ?8 [: s2 e( R! q
  8. LDR R0, =__main
    ! K6 J3 m3 D+ ]: k6 y
  9. BX R0
    1 [4 }) x: U8 B- J2 M* a
  10. ENDP
复制代码

0 {" G! v$ L) k/ a/ a+ `4 D8 f4 S然后进入 system_stm32f0xx.c 文件
9 h3 q, k# \! ]在SystemInit函数里有 SetSysClock(); ,我们修改这个函数即可7 p8 y  W1 y( e% _+ R. q" \
. c5 [# E/ p. w7 W& R# j
  1. void SystemInit (void)6 d/ E- x9 V7 m6 x  X
  2. {% ~( M7 {$ h2 ~, a
  3. /* Set HSION bit */
    / N! E0 T5 P# O
  4. RCC->CR |= (uint32_t)0x00000001;
    " Q) S7 y4 M3 R  h. C

  5. ( ]$ d, D/ x3 v
  6. #if defined (STM32F031) || defined (STM32F072) || defined (STM32F042)% A7 [( q6 @9 e2 T2 ^
  7. /* Reset SW[1:0], HPRE[3:0], PPRE[2:0], ADCPRE and MCOSEL[2:0] bits /$ Y% ?5 i- c6 R4 q
  8. RCC->CFGR &= (uint32_t)0xF8FFB80C;' Z& |# f" H6 V
  9. #else
    $ q9 N$ o! Y) B, Y2 j& \) a
  10. / Reset SW[1:0], HPRE[3:0], PPRE[2:0], ADCPRE, MCOSEL[2:0], MCOPRE[2:0] and PLLNODIV bits /
    5 u" q5 i# j* ^& m: I- `6 r
  11. RCC->CFGR &= (uint32_t)0x08FFB80C;7 r" I$ I5 L* H% \8 V! _  f
  12. #endif / STM32F031*/3 R) K) {: W6 V2 w  _

  13. ( i5 z( z1 c/ z9 D1 ]% }
  14. /* Reset HSEON, CSSON and PLLON bits */
    : D4 L# [3 k1 t2 u5 A
  15. RCC->CR &= (uint32_t)0xFEF6FFFF; //1111 1110 1111 0110 1111 1111 1111 11119 L: w- I3 |5 v* @4 R3 q

  16. , P) \& h3 r( U5 ~
  17. /* Reset HSEBYP bit */) M. q; i, ~* H
  18. RCC->CR &= (uint32_t)0xFFFBFFFF;$ O0 s2 r" d+ z0 r& ?
  19. * c& s# ~. l) u
  20. /* Reset PLLSRC, PLLXTPRE and PLLMUL[3:0] bits */0 e4 s) n5 |8 w
  21. RCC->CFGR &= (uint32_t)0xFFC0FFFF;3 J$ N' B& ^* Z2 J+ f

  22. & _! F% @) n' @' B
  23. /* Reset PREDIV1[3:0] bits */" X+ R6 k6 \& G: o. R
  24. RCC->CFGR2 &= (uint32_t)0xFFFFFFF0;
    4 {1 u$ l  ]$ m! b* o1 j
  25. - R6 c% C2 X2 ^) Q7 |' N
  26. /* Reset USARTSW[1:0], I2CSW, CECSW and ADCSW bits */2 s+ N: k' O0 `7 S  k. P( w. U
  27. RCC->CFGR3 &= (uint32_t)0xFFFFFEAC;) U5 V" U+ [) X7 P
  28. 4 I7 v/ j+ G9 z4 X
  29. /* Reset HSI14 bit */
    . S. v- b4 m, V' j" f' D
  30. RCC->CR2 &= (uint32_t)0xFFFFFFFE;
    / V3 s+ a+ m  P$ [. S9 e7 q

  31. 2 @5 k& }6 e0 z6 F* E
  32. /* Disable all interrupts */
    ) n4 b, ^; K/ w) e: ?1 j. e
  33. RCC->CIR = 0x00000000;7 M1 z) J  D' L. H

  34. , s% u4 q" d4 B$ s3 k& m# x: I8 o
  35. /* Configure the System clock frequency, AHB/APBx prescalers and Flash settings */
    * V" L! k! x! C
  36. SetSysClock();
    - ?- E' p5 t+ e, i
  37. }
复制代码

5 s1 S$ l1 Y% T5 U# M5 S# [在文件system_stm32f0xx.c下修改static void SetSysClock(void)% g$ A1 c- a( `( B/ y
如下:
& R  Z2 `$ L( r) k7 w
  1. static void SetSysClock(void)
      O) L3 E, _. {. C9 m
  2. {
    & q9 S. q5 N" j$ ?6 o1 g
  3. __IO uint32_t StartUpCounter = 0, HSIStatus = 0;( n- @' Z8 \3 `1 v$ b
  4. , y# |" `: ~  ]4 R$ J9 C
  5. /* SYSCLK, HCLK, PCLK configuration ----------------------------------------/! g5 e: p- `( ]8 ?( j& p- Z
  6. / Enable HSI*/5 O- [- A& V' b+ u
  7. RCC->CR |= ((uint32_t)RCC_CR_HSION); //RCC_CR_HSION,RCC_CR_HSEON# J5 @0 f5 |1 p! D) o
  8. 7 X& C% k$ K( Y/ u6 d
  9. /* Wait till HSE is ready and if Time out is reached exit */1 G7 u, @8 s/ j. ~
  10. do8 l0 i9 x+ I# ?$ K' ]8 ~
  11. {
    # I& |% R, ^6 E" d+ A' A$ v
  12. HSIStatus = RCC->CR & RCC_CR_HSIRDY;
    9 }( k  h6 N' p' V$ [
  13. StartUpCounter++;( w) ^. K) T' s' \9 s4 t
  14. } while((HSIStatus == 0) && (StartUpCounter != HSI_STARTUP_TIMEOUT));# ?, a5 L2 ]2 o  |+ n4 Z

  15. : j9 t. g( Q  ~. S) {- S
  16. if ((RCC->CR & RCC_CR_HSIRDY) != RESET)
    1 W% R$ \8 k9 Y, Z0 H7 j
  17. {# \' a8 p- E* B# ^
  18. HSIStatus = (uint32_t)0x01;
    2 F- L$ p# ^0 G
  19. }) i4 K2 b8 m. N% x
  20. else
    , Z: ~2 D. }6 |* U6 K/ Z( M7 m
  21. {) a0 e+ W* T- }4 g
  22. HSIStatus = (uint32_t)0x00;' f# _/ w: `1 H, O4 J5 N
  23. }2 E9 U& B+ H: ~. ~1 |7 {- ?

  24. ; l. j1 |% S3 {7 @, J& t! d) q. W
  25. if (HSIStatus == (uint32_t)0x01)9 z1 z: E2 ^& T  [" G% l
  26. {
    9 t* L3 d5 q8 [
  27. /* Enable Prefetch Buffer and set Flash Latency */7 w+ s" c9 c8 A# b: j
  28. FLASH->ACR = FLASH_ACR_PRFTBE | FLASH_ACR_LATENCY;
    3 l, s2 U1 ]0 q* f# e7 M
  29. 4 [% e0 ~# o7 E
  30. /* HCLK = SYSCLK */
    3 N! j3 c* E/ C/ k+ K
  31. RCC->CFGR |= (uint32_t)RCC_CFGR_HPRE_DIV1;; S5 ?$ w; w0 i/ D9 B

  32. 8 l8 F5 X0 X8 {' |3 n$ B# b" q
  33. /* PCLK = HCLK */# Z+ u0 k# S- s  h5 N
  34. RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE_DIV1;, T3 O! I5 R& t2 ~1 r" x
  35. ! b" r1 F4 _% R/ F
  36. /* PLL configuration = HSE * 6 = 48 MHz */6 J; E1 v  j* ~1 y: ?6 h
  37. RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_PLLSRC | RCC_CFGR_PLLXTPRE | RCC_CFGR_PLLMULL));* @2 x( C" u* S
  38. RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLSRC_HSI_Div2  | RCC_CFGR_PLLMULL12);
    & U7 C" E: ~2 C7 w. }

  39. * n( D) d% ^' U% J: _
  40. /* Enable PLL */! S1 W9 o* I% Z2 x/ }% R  Z; R! p
  41. RCC->CR |= RCC_CR_PLLON;
    6 z" n# A5 C8 r- z" Y' B

  42. 8 Z2 _6 I8 J$ a" V9 g# y- E
  43. /* Wait till PLL is ready */5 O) b0 R. |4 x
  44. while((RCC->CR & RCC_CR_PLLRDY) == 0)9 k) v6 E" a0 C, X2 ^, e  g
  45. {
    8 H, P8 d2 ]$ J) s! k/ H8 ]
  46. }$ U+ m$ [. F; b/ i

  47. 8 t; B0 L$ I' w3 e  }
  48. /* Select PLL as system clock source */
    ( Z5 N' K  S+ @
  49. RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_SW));: w% e, Q+ e( Y7 Z1 D& f* D$ m6 H
  50. RCC->CFGR |= (uint32_t)RCC_CFGR_SW_PLL;    * b1 |3 G* |5 @0 X+ K' r
  51. ( q7 ]! h' a8 K2 x% X, u
  52. /* Wait till PLL is used as system clock source */0 v( t$ \* q# m) N3 B
  53. while ((RCC->CFGR & (uint32_t)RCC_CFGR_SWS) != (uint32_t)RCC_CFGR_SWS_PLL)
    / M! Y! \5 @7 ^* ^
  54. {& q5 ^) l+ N; v
  55. }4 W6 ^3 C, b# Y9 ?" H! `& j
  56. 8 T+ E' s% C  N4 y, m( d  i
  57. }* g4 Z! n- o( E( u5 |2 |, x0 q- E
  58. else
    , t% H0 ]0 |1 f. G. m
  59. { /* If HSE fails to start-up, the application will have wrong clock
    2 e2 X( y2 R4 a8 X( `
  60. configuration. User can add here some code to deal with this error */
    # k- J) f$ _3 M0 S9 _: `: K
  61. }& s$ g6 i7 a. k' K
  62. }
复制代码

3 B7 R4 s: f* Y7 h
+ P3 a( U+ p( {7 k0 M
8 ~! R; f( z9 Z( h! W
赞 收藏 评论0 发布时间:2021-11-25 16:00

举报

0个回答

所属标签

相似技术帖

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