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

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

[复制链接]
STMCU小助手 发布时间:2021-11-25 16:00
STM32F0 单片机使用内部RC振荡器作为系统,软件修改; @+ Z5 G: D! H0 f9 H# J
系统上电复位后,4 J( Y+ g5 E- O& a8 @* q
运行如下
3 ~1 d' b, n. n5 D
  1. ; Reset handler routine! f: ?+ D% F. z. R
  2. Reset_Handler PROC* ?. F4 O% C9 Y# S: F, l9 g! G, U' d
  3. EXPORT Reset_Handler [WEAK]
    * ]2 [8 S6 e/ }, j
  4. IMPORT __main8 E7 u5 C2 e" V: c) D
  5. IMPORT SystemInit
    2 M' s) G  g; B+ Q0 b
  6. LDR R0, =SystemInit0 @) {8 Z- a7 A/ Z
  7. BLX R09 c& ~+ q6 J+ v4 @
  8. LDR R0, =__main
    " t: D; G; E) c  m+ Y5 I
  9. BX R0$ A7 ?4 Q0 y/ Q( T' b, f+ s# z
  10. ENDP
复制代码

- k0 A/ o2 G, B  C- K然后进入 system_stm32f0xx.c 文件
, B! e% f: y/ k在SystemInit函数里有 SetSysClock(); ,我们修改这个函数即可' j; G7 T) J0 Y9 m

* A2 o  P( J  ?  N
  1. void SystemInit (void)$ I! Y/ J- T" i# A
  2. {
    6 s& m  V. c/ {' o
  3. /* Set HSION bit */6 |/ L* S  H& y& K% q) t9 t
  4. RCC->CR |= (uint32_t)0x00000001;2 |! L: j& r& z7 Q1 g
  5. - E% y* v, V3 [( q" U' }* q  }
  6. #if defined (STM32F031) || defined (STM32F072) || defined (STM32F042)
    2 S* h9 o6 S$ w. @0 z2 I
  7. /* Reset SW[1:0], HPRE[3:0], PPRE[2:0], ADCPRE and MCOSEL[2:0] bits /2 h! {. P. ^0 f% f
  8. RCC->CFGR &= (uint32_t)0xF8FFB80C;# A3 r  p$ q6 A: O
  9. #else
    ; y: Z" ?* q$ N) H1 q' ^/ u: D+ v
  10. / Reset SW[1:0], HPRE[3:0], PPRE[2:0], ADCPRE, MCOSEL[2:0], MCOPRE[2:0] and PLLNODIV bits /; l& v* t8 j8 d& c
  11. RCC->CFGR &= (uint32_t)0x08FFB80C;! S2 |* s9 h0 E4 }3 n
  12. #endif / STM32F031*/
    1 [, _- H- E6 Z7 K' W

  13. , u) o. `4 j& C: a1 ^- ^
  14. /* Reset HSEON, CSSON and PLLON bits */
    ) G/ K4 x0 T* P2 x) g  Z+ D- o- u$ b
  15. RCC->CR &= (uint32_t)0xFEF6FFFF; //1111 1110 1111 0110 1111 1111 1111 1111
    " u. L0 I% y+ C/ e, Z; d3 E
  16. 8 h  i/ Y: \* I4 [, j& T$ U* L! k
  17. /* Reset HSEBYP bit */
    4 c, h. g# o: ~  m5 ~0 `' {
  18. RCC->CR &= (uint32_t)0xFFFBFFFF;
    ; L  y% X* U, ]. F' b6 n( T% b& z

  19. , m+ G9 v6 @$ U  J" r
  20. /* Reset PLLSRC, PLLXTPRE and PLLMUL[3:0] bits */
    ! n2 A8 d' H! B& v3 T
  21. RCC->CFGR &= (uint32_t)0xFFC0FFFF;) ~9 i' B5 H2 g9 ^* s
  22. * R. c7 y! d3 @9 U% u& f
  23. /* Reset PREDIV1[3:0] bits */6 [2 i+ A' s* d+ p) q
  24. RCC->CFGR2 &= (uint32_t)0xFFFFFFF0;
    7 I4 ^; N% m4 h

  25. # f. o" p2 c; D. c- w
  26. /* Reset USARTSW[1:0], I2CSW, CECSW and ADCSW bits */
    : p1 T  r7 ^- l3 I9 F* `
  27. RCC->CFGR3 &= (uint32_t)0xFFFFFEAC;  I* N+ M% |1 k
  28. 8 T- |% ~: X7 ~. @4 ]4 b
  29. /* Reset HSI14 bit */" u$ }& A; d& g) @$ |4 ]9 {8 h5 h
  30. RCC->CR2 &= (uint32_t)0xFFFFFFFE;1 T1 G1 R" A$ k2 h, t
  31. " H) L0 z9 _$ L1 A' i
  32. /* Disable all interrupts */5 b5 Q( m3 }7 t0 W( ?  Q
  33. RCC->CIR = 0x00000000;- m& s( y& m6 _- S: d) j

  34. % X/ S1 g7 M' k- M
  35. /* Configure the System clock frequency, AHB/APBx prescalers and Flash settings */8 {, q5 n1 T" S  C7 V. y
  36. SetSysClock();  D4 r) s% {8 n/ S- c- W
  37. }
复制代码

$ B& s7 z% c2 R/ d" i/ R* E在文件system_stm32f0xx.c下修改static void SetSysClock(void)8 h9 E5 T% r) K+ ?
如下:4 x& @9 y) L6 I0 L
  1. static void SetSysClock(void)/ l  {. B1 a) i6 j2 m
  2. {$ {* b+ G2 g3 U+ M
  3. __IO uint32_t StartUpCounter = 0, HSIStatus = 0;
    ( p% [2 `3 T: v. c1 Q/ I7 P

  4. * n7 m, p) B- P4 S2 m( m0 @. k, v4 ?
  5. /* SYSCLK, HCLK, PCLK configuration ----------------------------------------/+ G, z- J! W! B
  6. / Enable HSI*/- L3 c+ _( y& Z( N5 E4 ]8 C% q
  7. RCC->CR |= ((uint32_t)RCC_CR_HSION); //RCC_CR_HSION,RCC_CR_HSEON
    ' t( w7 ]' K8 W/ `4 V/ G8 v6 d
  8. 1 {: `! q* w9 c
  9. /* Wait till HSE is ready and if Time out is reached exit */
    7 \7 _+ o% X7 Y8 @$ O- g
  10. do
    1 h" v1 {2 v6 o
  11. {0 r! O) [. W2 M2 N
  12. HSIStatus = RCC->CR & RCC_CR_HSIRDY;
    # L( }" E! E5 l
  13. StartUpCounter++;
    , B! h6 a7 Y4 V4 h- m
  14. } while((HSIStatus == 0) && (StartUpCounter != HSI_STARTUP_TIMEOUT));
    " O( A# `/ @' o8 q
  15. ) I( ~0 I2 V. k
  16. if ((RCC->CR & RCC_CR_HSIRDY) != RESET)( S: j5 e4 o5 Q; R  f$ U1 B
  17. {
    , A# [7 K  ]1 J
  18. HSIStatus = (uint32_t)0x01;
    : d7 ^3 f0 @& E( U% g- ]1 X
  19. }
    % c/ `, H4 p! U, K; s, ~- }( P
  20. else/ E( k4 c; D- ]% B( ?
  21. {) q& S3 E4 w( o2 ^
  22. HSIStatus = (uint32_t)0x00;& _: e, _! y. r1 o
  23. }) @/ c# |% w( Z  e4 Y& O

  24. & U- ~# Q( N3 B
  25. if (HSIStatus == (uint32_t)0x01): Z4 `' B: R! a, P
  26. {! l' M) ]6 M: t  s* s1 F2 y
  27. /* Enable Prefetch Buffer and set Flash Latency */. ^6 J" t: B8 m1 K. I/ w# T
  28. FLASH->ACR = FLASH_ACR_PRFTBE | FLASH_ACR_LATENCY;
    6 c* B2 o6 V. |* D. W

  29. ( [+ S  @! h0 c; X! p) [( M% d1 Q
  30. /* HCLK = SYSCLK */; S, p; R0 h! L( j$ x9 o
  31. RCC->CFGR |= (uint32_t)RCC_CFGR_HPRE_DIV1;
    2 |8 K9 v0 U! S6 A/ a5 H9 }
  32. & k9 W, ~) m# l/ {% O, T- T
  33. /* PCLK = HCLK */
    1 t% W" j$ M4 v
  34. RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE_DIV1;+ }. M1 U: i6 E4 r& z# }
  35. ' q+ [! P6 z! d9 o9 }1 W  |
  36. /* PLL configuration = HSE * 6 = 48 MHz */
    , H; f% Z$ Y" V  @
  37. RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_PLLSRC | RCC_CFGR_PLLXTPRE | RCC_CFGR_PLLMULL));4 f. u1 W  t9 K3 B; Y
  38. RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLSRC_HSI_Div2  | RCC_CFGR_PLLMULL12);2 x; a2 R3 K; ]% W& U: j* G
  39. $ V, B4 z7 L2 J1 p2 l3 [0 \
  40. /* Enable PLL */
    $ G! T- p; V$ ], U* D" T/ c' c. m. e
  41. RCC->CR |= RCC_CR_PLLON;+ j; ^6 ^( {1 N7 E# v. [

  42. $ o" {) W# f3 ]3 K
  43. /* Wait till PLL is ready */: Y8 u8 m* x: j/ d5 ~$ r" H
  44. while((RCC->CR & RCC_CR_PLLRDY) == 0)
    - r; W/ {! w# O
  45. {5 v2 I1 {3 ~; D- k& h
  46. }; E. a" H( W$ P/ i

  47. % n4 [0 ~1 H! O  j6 E( O* e
  48. /* Select PLL as system clock source */5 ~: H5 A- H: ?# X/ w
  49. RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_SW));
    : n0 P, y* O" `; M, r) }
  50. RCC->CFGR |= (uint32_t)RCC_CFGR_SW_PLL;   
      }: V6 I& t2 ?2 G  e
  51. 0 B3 n5 D: w% ^6 h+ u0 e9 I
  52. /* Wait till PLL is used as system clock source */
    + g7 O( N1 F6 h2 H" w  u& S
  53. while ((RCC->CFGR & (uint32_t)RCC_CFGR_SWS) != (uint32_t)RCC_CFGR_SWS_PLL)
    4 z7 G6 {3 l, m4 \) G: I. I" Q
  54. {
    5 L6 l2 J( _% d' z. X3 v
  55. }$ D- L' Y$ M$ j0 o! d  W; N

  56. 4 }! ]# J# }/ K  |0 E
  57. }
    . q9 Z( g/ E! T3 C( s% m
  58. else
    : z. W* y6 p7 c
  59. { /* If HSE fails to start-up, the application will have wrong clock
    - J! c6 p) x$ f9 O1 [
  60. configuration. User can add here some code to deal with this error */3 p% d" `3 @/ L' J; b, E, x2 S
  61. }
    9 \) X! [3 L5 X1 r' j% ?1 P
  62. }
复制代码
" @/ I  K! x0 d/ I: ?

8 N1 B8 |* |, B5 o8 Y0 o7 ~2 x0 t( b
收藏 评论0 发布时间:2021-11-25 16:00

举报

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