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

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

[复制链接]
STMCU小助手 发布时间:2021-11-25 16:00
STM32F0 单片机使用内部RC振荡器作为系统,软件修改3 W9 a) X" O: Q& M$ Q/ r
系统上电复位后,0 _+ S: c) }" i5 p9 _6 E- b
运行如下
$ v" n' x* _/ [# x8 G% @& f
  1. ; Reset handler routine
    ' t4 r6 B- t* |6 Z" o% G
  2. Reset_Handler PROC" V8 R' H" N( g$ C: @
  3. EXPORT Reset_Handler [WEAK]+ R* N) I1 G; m# U4 f  Z4 n! h
  4. IMPORT __main
    3 X% N' D" S: R% U1 q6 M9 f
  5. IMPORT SystemInit1 v$ [, r) m3 v, ^3 Z& k
  6. LDR R0, =SystemInit! q3 f# c' z0 k# u
  7. BLX R0
    ; o( c; n! A3 [
  8. LDR R0, =__main
    3 N3 W# u5 D% ~1 U* V
  9. BX R0
    0 S3 `6 H  E# L7 Q2 K
  10. ENDP
复制代码
0 x) l0 R- n* w9 P' p
然后进入 system_stm32f0xx.c 文件
1 E' y4 _! P( P! G' k4 z在SystemInit函数里有 SetSysClock(); ,我们修改这个函数即可
8 M: n2 m+ [6 j1 T
9 e$ v" \6 k8 Z7 ~
  1. void SystemInit (void)$ m# c# L( }) k0 k! X* }
  2. {8 y5 X% O, m$ z
  3. /* Set HSION bit */5 [4 q9 n5 I! J# s7 t3 L
  4. RCC->CR |= (uint32_t)0x00000001;" T# m8 R  S! Q6 C
  5. . D- Q. c  H( t
  6. #if defined (STM32F031) || defined (STM32F072) || defined (STM32F042)3 _" t1 P# d' H. N9 B
  7. /* Reset SW[1:0], HPRE[3:0], PPRE[2:0], ADCPRE and MCOSEL[2:0] bits /% o# q3 K' q0 a* R$ n* I
  8. RCC->CFGR &= (uint32_t)0xF8FFB80C;
    * D+ l6 J# d. P1 y' o3 Y
  9. #else# s% E& J) ]9 T' }2 H. F
  10. / Reset SW[1:0], HPRE[3:0], PPRE[2:0], ADCPRE, MCOSEL[2:0], MCOPRE[2:0] and PLLNODIV bits /
    : H  v' E+ X5 T! i, G
  11. RCC->CFGR &= (uint32_t)0x08FFB80C;( Y' x8 [' x) z0 |6 H3 I) z) x
  12. #endif / STM32F031*/
    ! T6 S7 h+ Q7 P; t
  13. 0 r5 j3 f0 ~' {' w+ {, H7 @$ R' D
  14. /* Reset HSEON, CSSON and PLLON bits */
    - g6 {9 S$ a2 |0 n: }$ C: ?
  15. RCC->CR &= (uint32_t)0xFEF6FFFF; //1111 1110 1111 0110 1111 1111 1111 11118 ~& l! Y! Z" z  V+ G4 b( t9 R8 M
  16. # M6 M( N2 o* Q. D% z. V# v' g: ]
  17. /* Reset HSEBYP bit */
    ) L4 u) S3 j% ]* p& g% w" z; m9 ~
  18. RCC->CR &= (uint32_t)0xFFFBFFFF;
    2 M( y' R; Z2 h  s; a" _

  19. 8 W9 W) H. i$ R3 q  e
  20. /* Reset PLLSRC, PLLXTPRE and PLLMUL[3:0] bits */% H- _% w2 r8 j' D( p3 ~2 H
  21. RCC->CFGR &= (uint32_t)0xFFC0FFFF;# \  ]' \$ K: X1 j' i4 ]
  22. " S8 X6 z& w" j) k. `
  23. /* Reset PREDIV1[3:0] bits */0 J% H% H0 ?  J/ b
  24. RCC->CFGR2 &= (uint32_t)0xFFFFFFF0;
    % w' P- U9 ~4 u9 }9 l

  25. ) a9 {. n5 R/ \7 v% \8 r
  26. /* Reset USARTSW[1:0], I2CSW, CECSW and ADCSW bits */
    % ?5 _% L0 P" x% T- t
  27. RCC->CFGR3 &= (uint32_t)0xFFFFFEAC;) E- @& J4 O! F  g' n# Z
  28. 3 ]; K% Q% E$ ?/ B5 G( Q: d8 o
  29. /* Reset HSI14 bit */
    & j+ O: J4 B, i, W
  30. RCC->CR2 &= (uint32_t)0xFFFFFFFE;. z; n  p3 D2 d2 J/ z

  31. 8 @; N9 v2 l- d5 g& e
  32. /* Disable all interrupts */
    1 B; p3 p2 l" l7 Y7 m; ~4 ^
  33. RCC->CIR = 0x00000000;
    $ ?1 }  r5 G0 ?2 `3 ]9 j

  34. 1 ?8 G) A2 ^: C7 l( O% G! a: p: i( v
  35. /* Configure the System clock frequency, AHB/APBx prescalers and Flash settings */
    . b5 G- k0 u( u* L! r* e' [7 v( u
  36. SetSysClock();
    / `( O$ y+ v: E8 B; B$ V' a8 k
  37. }
复制代码

* e' I' G- O/ @% G9 G6 C( W2 D) r在文件system_stm32f0xx.c下修改static void SetSysClock(void)+ C! Y* @; T" h6 R4 o+ w3 G
如下:: X7 z! s# _+ \7 ^/ B
  1. static void SetSysClock(void)6 D: o7 o  Q- I! G# v
  2. {, O3 v* \5 P! V/ l- R' Y
  3. __IO uint32_t StartUpCounter = 0, HSIStatus = 0;# O7 j% R7 B3 K4 ^! e
  4. 5 R; @( F- g6 g) G+ B$ e
  5. /* SYSCLK, HCLK, PCLK configuration ----------------------------------------/' z! a  O5 e! D
  6. / Enable HSI*/
    1 C- V- p) m4 [6 h
  7. RCC->CR |= ((uint32_t)RCC_CR_HSION); //RCC_CR_HSION,RCC_CR_HSEON0 D8 D8 l8 e& [! ]3 y& {8 I
  8. ! f# y' O. }: ^( h3 P: l. }
  9. /* Wait till HSE is ready and if Time out is reached exit */8 ]+ {3 u4 {' u7 M/ a) v
  10. do
    / O7 ~. Y; C& f- M6 a
  11. {: G% ]% J) Q; |0 G# v2 K) K, S5 p
  12. HSIStatus = RCC->CR & RCC_CR_HSIRDY;0 R7 o* n# v" l
  13. StartUpCounter++;
    ( |; Y: ^9 b  e2 ]1 q
  14. } while((HSIStatus == 0) && (StartUpCounter != HSI_STARTUP_TIMEOUT));! \( s1 w/ V+ T  H3 q4 f: h, Y% e

  15. - i9 {/ m/ ^. X
  16. if ((RCC->CR & RCC_CR_HSIRDY) != RESET)
    1 W7 E, P/ I2 i1 y" H" c; L
  17. {+ {/ I, n5 R; [
  18. HSIStatus = (uint32_t)0x01;- Z" ?' ^2 V2 l
  19. }
    ! x3 G1 M/ U8 J* [2 o2 l
  20. else& h- `0 Y+ p* ^) z# C9 V8 H' q" {
  21. {
    * ^& K' d2 E3 W- f4 Y; J+ ~  v5 h) p
  22. HSIStatus = (uint32_t)0x00;
    9 z0 B" Y0 j4 j* s( P7 @" w
  23. }8 A! Y, H8 {. D' k1 X9 P
  24. # N) p8 F# ~4 |
  25. if (HSIStatus == (uint32_t)0x01); V4 }( q! F; G
  26. {4 U4 Y0 R/ y  G" z- Y
  27. /* Enable Prefetch Buffer and set Flash Latency */
    # j( B* C( b8 R/ N( [; }& u4 |
  28. FLASH->ACR = FLASH_ACR_PRFTBE | FLASH_ACR_LATENCY;
    ( v$ x, g( z  V6 m

  29. : U4 F7 i3 [8 X4 m' X! V5 z
  30. /* HCLK = SYSCLK */8 P& p. S( M2 R$ f, W* N' ]) H
  31. RCC->CFGR |= (uint32_t)RCC_CFGR_HPRE_DIV1;: i' u/ o2 R, }* G0 e$ S3 N! A# R) g; Z' z

  32. : Z0 F3 @  I. c  _2 P0 ~5 S4 L
  33. /* PCLK = HCLK */
    % d! G9 g8 t4 E# J
  34. RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE_DIV1;  x4 O: m% Z$ o( [5 c

  35. 4 o# U: m! ^( m& M
  36. /* PLL configuration = HSE * 6 = 48 MHz */' h) y: t* p% \3 }. i; a
  37. RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_PLLSRC | RCC_CFGR_PLLXTPRE | RCC_CFGR_PLLMULL));- D2 ]3 E# U% B8 K* b/ @( ]. U" b  K
  38. RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLSRC_HSI_Div2  | RCC_CFGR_PLLMULL12);
    + Q* G2 d, L$ v5 G
  39. * f) C& s2 L- i6 m! Y
  40. /* Enable PLL */
    ' j9 c* s- I/ u1 Z! K
  41. RCC->CR |= RCC_CR_PLLON;9 P3 }! K& V% n7 T4 _- Z
  42. 4 |1 ^( K* K, x6 f7 x" x5 U
  43. /* Wait till PLL is ready */2 w3 u+ z6 p( ~
  44. while((RCC->CR & RCC_CR_PLLRDY) == 0)
    4 V9 L3 r; T9 w& c0 p& p3 [
  45. {  G4 m7 P7 S" w$ z
  46. }
    / |/ T2 s( k8 E! B

  47. 9 [: C, v7 N7 `4 R2 y8 |
  48. /* Select PLL as system clock source */
    0 [, v- w/ U3 J* P
  49. RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_SW));2 Y) Y5 b2 \2 k7 z: f6 c/ U. X
  50. RCC->CFGR |= (uint32_t)RCC_CFGR_SW_PLL;   
    % h' B' b) o% Z& _
  51. 9 K7 g6 I" M3 e! r# r
  52. /* Wait till PLL is used as system clock source */. B3 }4 K* ]! A8 @
  53. while ((RCC->CFGR & (uint32_t)RCC_CFGR_SWS) != (uint32_t)RCC_CFGR_SWS_PLL)7 z9 V$ p: D( `: _
  54. {
    % b5 |& n# B) _: t; X0 t0 [
  55. }0 o, N2 r& v5 C
  56.   e$ p  N6 Y, M# i& Q$ `
  57. }1 |6 p/ H3 B6 p2 v3 ]0 [1 M
  58. else
    ; Y5 M+ f! \) v" t* P/ x. v
  59. { /* If HSE fails to start-up, the application will have wrong clock
    1 ]1 A" O/ g: M" H7 u9 z5 _
  60. configuration. User can add here some code to deal with this error */9 i+ @  ?$ x1 u* B) ?6 s7 _% H
  61. }
    ! T" u' r* t+ V8 H2 W
  62. }
复制代码

% V0 y& l, S6 g) r& A. W
) l; }& m0 Z  x0 {! I
& i: `4 u& z9 K, r5 O+ U
收藏 评论0 发布时间:2021-11-25 16:00

举报

0个回答
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版