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

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

[复制链接]
STMCU小助手 发布时间:2021-11-25 16:00
STM32F0 单片机使用内部RC振荡器作为系统,软件修改
9 x4 |- ~8 @% O% P- b: c; M9 Q系统上电复位后,3 r: f$ e" p' Y
运行如下' I+ w" T3 h( h, B$ q
  1. ; Reset handler routine
    6 E; b: L  b1 f! O2 a) _
  2. Reset_Handler PROC
    ( y* P" i4 J$ c8 Q+ Q9 l: I
  3. EXPORT Reset_Handler [WEAK]+ g# c2 @+ E+ d9 b! L
  4. IMPORT __main
    : \' }  F$ j+ S) t
  5. IMPORT SystemInit
    : ~& t% [3 n7 ^
  6. LDR R0, =SystemInit
    : \! J1 a5 r+ |- \7 d
  7. BLX R0
    $ E: x& R& b- \7 ~( J/ \0 ?3 G
  8. LDR R0, =__main
    2 o, t0 O9 P6 V& s* v
  9. BX R0* m0 B( E: \! A' U7 B
  10. ENDP
复制代码
6 x% V# j/ ~. U& D* U4 S+ d, T* U. i
然后进入 system_stm32f0xx.c 文件3 i9 S/ q' a* ]( K7 Y) K
在SystemInit函数里有 SetSysClock(); ,我们修改这个函数即可
4 Y5 n# u# s7 L8 |* c
; O& H( [% K* s- j
  1. void SystemInit (void)
    % k7 O/ k, k1 Z- c& y; ^% l
  2. {. D& x$ h8 N! R% b. v; m
  3. /* Set HSION bit */
    & B: o! X" V# z2 k+ I
  4. RCC->CR |= (uint32_t)0x00000001;$ f6 N1 O8 ~3 o- l( d

  5. & K( `5 \( [, Q' v( Z
  6. #if defined (STM32F031) || defined (STM32F072) || defined (STM32F042)
    0 U5 c& V& t: Z% z' \& N. u) D
  7. /* Reset SW[1:0], HPRE[3:0], PPRE[2:0], ADCPRE and MCOSEL[2:0] bits /5 ]1 Y' ]( Z! q& v+ ]
  8. RCC->CFGR &= (uint32_t)0xF8FFB80C;) k$ Y6 _1 K: S- Q
  9. #else
    , L* h% E& g% c  |% \
  10. / Reset SW[1:0], HPRE[3:0], PPRE[2:0], ADCPRE, MCOSEL[2:0], MCOPRE[2:0] and PLLNODIV bits /8 `- C  F4 K% c: o; D, ~
  11. RCC->CFGR &= (uint32_t)0x08FFB80C;  o5 o$ w5 i2 X1 Y$ T( N
  12. #endif / STM32F031*/9 y2 _3 P8 J  W3 A

  13. . _  L1 S9 x( Y0 O; _4 _
  14. /* Reset HSEON, CSSON and PLLON bits */
    7 s% s3 c- d% `  E& h  C: X* n
  15. RCC->CR &= (uint32_t)0xFEF6FFFF; //1111 1110 1111 0110 1111 1111 1111 1111% j7 v8 q: `. R. Y; L9 c$ B
  16. 7 h8 O* C& J$ b" s4 M1 J" w) K0 [" {
  17. /* Reset HSEBYP bit */+ ^3 O8 S, t. b  s
  18. RCC->CR &= (uint32_t)0xFFFBFFFF;
    8 |5 T% j" K' u# v0 z2 L
  19. ( C- x- ^, _' m( _* C/ Z
  20. /* Reset PLLSRC, PLLXTPRE and PLLMUL[3:0] bits */3 v+ d( _; v7 f8 A$ O2 I( H
  21. RCC->CFGR &= (uint32_t)0xFFC0FFFF;' k" P( w) O+ o0 C$ C7 r3 j
  22. 1 }4 v4 r, d( n: R  X; f' B4 x  y
  23. /* Reset PREDIV1[3:0] bits */
    0 ^* Z7 g; M) a" n+ ^! ^6 l( B
  24. RCC->CFGR2 &= (uint32_t)0xFFFFFFF0;8 @) L8 j2 i; I: W7 o
  25. & Y' I6 G0 M( Q9 J- w% V3 A" G
  26. /* Reset USARTSW[1:0], I2CSW, CECSW and ADCSW bits */- \% Y' c$ |6 r; Z' y8 {
  27. RCC->CFGR3 &= (uint32_t)0xFFFFFEAC;" P& r! k0 d9 w, ?6 q9 l
  28. ) d8 T% U8 v7 j, u
  29. /* Reset HSI14 bit */
    3 \* F) |# o! h# w7 D
  30. RCC->CR2 &= (uint32_t)0xFFFFFFFE;) N: o  n1 N5 M
  31. 7 C5 [0 C( H1 b. J4 e; e
  32. /* Disable all interrupts */: l- ^0 u* a! G( Y! Y) {3 x: X" q
  33. RCC->CIR = 0x00000000;
    - j- p# N. e4 y. y" k; K/ \

  34. 5 u' U/ Z7 I  }1 A2 `' X( m
  35. /* Configure the System clock frequency, AHB/APBx prescalers and Flash settings */
    # _( K+ ?: M2 i9 w8 J
  36. SetSysClock();
    . Z. T: I' F6 x; e4 N
  37. }
复制代码

" ?- W2 y, M, Z; b5 Q在文件system_stm32f0xx.c下修改static void SetSysClock(void)
( S! W4 N4 u. _- y如下:) Q/ s7 x% A: H' \  T+ p# E
  1. static void SetSysClock(void)
    % |8 W  `: x4 u1 F/ ^
  2. {8 ^: i) F+ Y% n+ p
  3. __IO uint32_t StartUpCounter = 0, HSIStatus = 0;) Z/ k& w- o; {5 A2 x; _

  4. " S% b6 H3 c  J( D
  5. /* SYSCLK, HCLK, PCLK configuration ----------------------------------------/
    $ @" j+ O+ ]4 Y1 @
  6. / Enable HSI*/; V0 A# J8 o( N
  7. RCC->CR |= ((uint32_t)RCC_CR_HSION); //RCC_CR_HSION,RCC_CR_HSEON
    - t' T; X- A6 |3 I# ?

  8. 6 s/ F% |6 r& g, L- r4 K  b2 b
  9. /* Wait till HSE is ready and if Time out is reached exit */$ R( y9 w4 P. t( x: t6 @/ e5 _
  10. do: ~8 _6 H3 O$ a+ a# B& b: d: x/ q
  11. {
    " g9 N7 g2 |" V, ]
  12. HSIStatus = RCC->CR & RCC_CR_HSIRDY;$ a3 ~1 ]* n" N
  13. StartUpCounter++;
      U! t9 e0 Q  o; e0 H( E. Z8 m
  14. } while((HSIStatus == 0) && (StartUpCounter != HSI_STARTUP_TIMEOUT));
    . H. p( X& X9 T) N* K* E

  15. + x9 D* J3 l8 g
  16. if ((RCC->CR & RCC_CR_HSIRDY) != RESET)1 f" q/ z  j! r* I+ J$ [
  17. {
    ) _# r1 A. ~2 C( @1 C( m+ S1 `
  18. HSIStatus = (uint32_t)0x01;+ g, U6 {9 @& H6 }* h
  19. }' ?3 O3 C0 _8 ]1 e6 g
  20. else# \+ @! d8 R! s' _
  21. {7 A( [! G  c, J& R3 G
  22. HSIStatus = (uint32_t)0x00;
    ' x( a  H4 q7 ]& u
  23. }1 A% y! w4 L' E- k0 `5 C$ R1 e7 l% V

  24. $ k( S: N( V4 a
  25. if (HSIStatus == (uint32_t)0x01). h! h' K* k( j% _
  26. {
    1 ]0 c3 u1 b' s) M4 s$ u
  27. /* Enable Prefetch Buffer and set Flash Latency */& ^! {3 l0 F8 }# w0 Y
  28. FLASH->ACR = FLASH_ACR_PRFTBE | FLASH_ACR_LATENCY;) w' K9 i; t% e- A) u0 m3 f

  29.   w+ m4 S0 l5 E+ G# H
  30. /* HCLK = SYSCLK *// j- ]3 z; h- \" D! J
  31. RCC->CFGR |= (uint32_t)RCC_CFGR_HPRE_DIV1;, N# n/ H% V+ Y

  32. , f- C" z4 a, ^, B
  33. /* PCLK = HCLK */
    # T; r& q2 B. O+ C; _( t  m
  34. RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE_DIV1;
    7 r( o, a$ |% }8 x

  35. % f# a. w- i$ l
  36. /* PLL configuration = HSE * 6 = 48 MHz */
    : Q- p$ `/ f  @8 H  n: \
  37. RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_PLLSRC | RCC_CFGR_PLLXTPRE | RCC_CFGR_PLLMULL));
    ; u) M/ M6 \% @( w
  38. RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLSRC_HSI_Div2  | RCC_CFGR_PLLMULL12);
    1 B0 `+ z2 m6 r& B

  39. 2 v+ p+ G8 K- L- q% B$ z# W+ i1 H! M9 @
  40. /* Enable PLL */
    % m; W% E+ O+ z" F' |& d* s+ _
  41. RCC->CR |= RCC_CR_PLLON;
    , B4 Q8 A* g) l1 k

  42. 5 F3 W0 d: }# S5 D
  43. /* Wait till PLL is ready */1 @* t# H# J# b  a
  44. while((RCC->CR & RCC_CR_PLLRDY) == 0)
    1 d$ H9 F( J% i: R6 [# x7 _: ?
  45. {9 O7 ]! @5 e$ N' n+ X" q& d
  46. }
    6 g  p* N+ Z# b9 V
  47. ! }# @! D& G+ X, r9 C
  48. /* Select PLL as system clock source */
    6 ]1 m  t% a3 W) m
  49. RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_SW));3 t+ }  x/ z) e/ l
  50. RCC->CFGR |= (uint32_t)RCC_CFGR_SW_PLL;   
    ; @& W/ W# D2 Z( c
  51. ' W0 O: H0 {, g. L. ^3 j' L
  52. /* Wait till PLL is used as system clock source */
    ) U3 u" ~9 v1 w% \2 @7 G) W
  53. while ((RCC->CFGR & (uint32_t)RCC_CFGR_SWS) != (uint32_t)RCC_CFGR_SWS_PLL)
    $ R! c$ E) m- b% G
  54. {
    / H0 w" V- f/ n, B% |
  55. }
    ) a) l5 ?# r0 Y% e" R3 t, X4 l
  56.   h6 y4 j7 _5 {7 O7 o. L
  57. }$ A9 V; w, U- F
  58. else
    5 K  ^, K, z( S% m4 D( I! r& ]* Y) _
  59. { /* If HSE fails to start-up, the application will have wrong clock# X& _! @$ a1 @. K$ @9 ~) F/ Z1 x, t/ A
  60. configuration. User can add here some code to deal with this error */) v9 x' R6 z5 v3 |
  61. }5 J% `1 s: o8 ^
  62. }
复制代码
! y7 f1 C3 y: m+ N

9 x. {4 L- A6 s. u9 V, W, y5 E" j; Z( Y& B' l/ _! f
收藏 评论0 发布时间:2021-11-25 16:00

举报

0个回答

所属标签

相似技术帖

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