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

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

[复制链接]
STMCU小助手 发布时间:2021-11-25 16:00
STM32F0 单片机使用内部RC振荡器作为系统,软件修改+ ^" z8 w) Z5 Y- F% l( s
系统上电复位后,
$ E) g% R6 \3 O7 M4 n/ X运行如下' q" n2 K7 q) K2 e: n4 T' Z$ e
  1. ; Reset handler routine! a* o% v7 x' @+ l1 j
  2. Reset_Handler PROC
    7 V) @. {; O. I( h
  3. EXPORT Reset_Handler [WEAK]
    : S( |: D- x4 a1 S/ y$ g% `7 k, h' J  C
  4. IMPORT __main
    , Y* R$ j  c8 k% q
  5. IMPORT SystemInit* O  `7 X" t, M( v
  6. LDR R0, =SystemInit- I5 n- i0 s2 r
  7. BLX R09 y2 V; |# k$ J, E1 O, `& N/ y
  8. LDR R0, =__main
    $ P' `+ E6 q: g7 X4 z
  9. BX R0; K0 t) U$ U! y, a* z% e
  10. ENDP
复制代码

2 V! c- O% Y) G然后进入 system_stm32f0xx.c 文件' w. P9 ~3 V2 x4 R5 J4 P
在SystemInit函数里有 SetSysClock(); ,我们修改这个函数即可0 d, e, }! \9 i
# B) k, _' E! n' l  r% B
  1. void SystemInit (void)
    , s( K- \% p9 z2 ?
  2. {; {7 j3 W, i5 Y! A
  3. /* Set HSION bit */$ Z% F6 W" i8 ]0 ?" \. i4 U+ D5 [
  4. RCC->CR |= (uint32_t)0x00000001;
    ' e( a& h* a  T5 B, f: z, F% x/ Z

  5. 5 ]! R# F& F5 K3 C
  6. #if defined (STM32F031) || defined (STM32F072) || defined (STM32F042)
    : G( E8 @- H: K  E" L1 @  v
  7. /* Reset SW[1:0], HPRE[3:0], PPRE[2:0], ADCPRE and MCOSEL[2:0] bits /
    & ]3 n. G. G. [8 C& Q6 ~" B6 U
  8. RCC->CFGR &= (uint32_t)0xF8FFB80C;
    & _: d) H" J5 x1 z% N: u# M3 m
  9. #else
    6 Q) H6 _9 _$ Y, c: \6 D
  10. / Reset SW[1:0], HPRE[3:0], PPRE[2:0], ADCPRE, MCOSEL[2:0], MCOPRE[2:0] and PLLNODIV bits /) O1 N+ P7 I, w# m  J1 q3 C8 _
  11. RCC->CFGR &= (uint32_t)0x08FFB80C;
    : s* E/ W! [- c: i7 w- J4 G
  12. #endif / STM32F031*/% R9 b/ ^0 d6 J% X0 a7 z
  13. % Y* ?3 \4 `4 u8 ?8 O% _! L; E
  14. /* Reset HSEON, CSSON and PLLON bits */# T0 S5 u: q) J
  15. RCC->CR &= (uint32_t)0xFEF6FFFF; //1111 1110 1111 0110 1111 1111 1111 1111
    8 k2 ~+ S: L. d, V+ W% F  S

  16. ) h* c% J1 S  Y# h  p0 o
  17. /* Reset HSEBYP bit */2 ]; r3 U1 V( N, h( u/ ?0 s5 b
  18. RCC->CR &= (uint32_t)0xFFFBFFFF;  h- C* Y$ D; n! o4 ]# X
  19. ) B$ c8 A+ B# z1 A1 F9 g0 C+ w
  20. /* Reset PLLSRC, PLLXTPRE and PLLMUL[3:0] bits */7 Q9 T" v" J+ g' c* D+ }2 i
  21. RCC->CFGR &= (uint32_t)0xFFC0FFFF;% w1 J; g! `$ T" N! s' }# H
  22. & l, C- n8 w" c& _& X! _
  23. /* Reset PREDIV1[3:0] bits */* n! R+ o2 w$ t2 p7 o
  24. RCC->CFGR2 &= (uint32_t)0xFFFFFFF0;: m1 ], }0 q  s6 F8 Q) P

  25. . z' t  v) T4 u4 E7 ]* P1 e
  26. /* Reset USARTSW[1:0], I2CSW, CECSW and ADCSW bits */0 g' f' x$ a7 ^+ Y! V4 M
  27. RCC->CFGR3 &= (uint32_t)0xFFFFFEAC;
    : J$ \: r3 f8 E0 B& F3 ?5 u9 l, z

  28. % f) ~, c3 O; g* F6 O+ I! m
  29. /* Reset HSI14 bit */
    ; U0 p7 c! ^) ^: l' T: L% {  Q+ A- q
  30. RCC->CR2 &= (uint32_t)0xFFFFFFFE;
    3 B! ?" i+ d, h
  31. ' i& c5 S& V, v. m
  32. /* Disable all interrupts */
    8 C; y/ `0 l# E
  33. RCC->CIR = 0x00000000;  t8 r2 U2 E, h

  34. . R# o1 d6 \: _* l; e) \
  35. /* Configure the System clock frequency, AHB/APBx prescalers and Flash settings */
    6 D6 }8 q6 L) ~8 o+ W' |
  36. SetSysClock();
    9 j3 K% p9 j0 N3 r6 J
  37. }
复制代码

: R7 y" A  l, ]' E. G在文件system_stm32f0xx.c下修改static void SetSysClock(void)
" L. }( e- J- w. g( X如下:
' b/ T# k! [! n1 [8 s' ?
  1. static void SetSysClock(void)
    ) B1 d: H- L& P3 L" k
  2. {) |. x& p, Y/ ?7 h( I- W
  3. __IO uint32_t StartUpCounter = 0, HSIStatus = 0;
    # x, V" k: P. s
  4. 6 r" H! c3 v( t6 g8 [! K
  5. /* SYSCLK, HCLK, PCLK configuration ----------------------------------------/
    5 h2 I4 K7 \$ S1 B$ E" B
  6. / Enable HSI*/- W4 c$ s" G" H- l! E2 r5 p
  7. RCC->CR |= ((uint32_t)RCC_CR_HSION); //RCC_CR_HSION,RCC_CR_HSEON
    * ]" A# C! e3 V! w8 c0 a7 \
  8. / W4 L- D+ K' e" D0 w
  9. /* Wait till HSE is ready and if Time out is reached exit */% w: L$ r' _0 ^
  10. do
    $ }* J! r: r& Y' W1 L" T
  11. {: r3 O, y2 y' H: j9 m' g
  12. HSIStatus = RCC->CR & RCC_CR_HSIRDY;! ]7 h8 A$ ~7 s! a1 v
  13. StartUpCounter++;2 q1 z2 L. H8 b2 ~* k7 e" t
  14. } while((HSIStatus == 0) && (StartUpCounter != HSI_STARTUP_TIMEOUT));
    " P( _2 a0 l: {
  15. ; Z% O2 |' @1 m& S9 Q
  16. if ((RCC->CR & RCC_CR_HSIRDY) != RESET)  w( f: u1 T7 m7 w# w6 v$ S
  17. {) e% s9 e! h5 @0 G. Y" Z, @# |1 v
  18. HSIStatus = (uint32_t)0x01;
    7 e) {9 I2 n: Z% ^  V$ s
  19. }0 g8 {( E  _# L$ ?" U" H2 @
  20. else
    : v+ I: F6 H" e
  21. {
    ( k- {7 c! K! b% O/ s+ |5 M7 W; a
  22. HSIStatus = (uint32_t)0x00;% m) ^8 S- f; M& R1 I( X0 R& R! Z
  23. }6 y: r5 y4 E5 p3 _6 e/ _( o+ Q
  24. # Z- L; `9 j. Z6 }3 j7 V( D7 N
  25. if (HSIStatus == (uint32_t)0x01)( d8 Q/ N& {" M3 |
  26. {
      v2 e2 W% ^- j5 ]; H! W  `
  27. /* Enable Prefetch Buffer and set Flash Latency */0 y/ [' D. H! z. x
  28. FLASH->ACR = FLASH_ACR_PRFTBE | FLASH_ACR_LATENCY;1 A  i' Z; v3 Y  B% y" Y# p% i$ F

  29. 0 E' S. N* d. b8 S/ R
  30. /* HCLK = SYSCLK */9 P1 j3 E3 E$ p9 E
  31. RCC->CFGR |= (uint32_t)RCC_CFGR_HPRE_DIV1;
    / P- Z& h1 k5 V! X* @' w# E4 p" {# n

  32. 1 ]  G+ t/ B, k# P5 I6 f
  33. /* PCLK = HCLK */+ _' Z6 X( i, U6 f7 q/ T
  34. RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE_DIV1;
    2 `1 W3 c0 v4 b4 p7 ?
  35.   q! U& ^! T' O% O( Z: R4 _
  36. /* PLL configuration = HSE * 6 = 48 MHz */( B1 m) G( r$ v1 ?9 F: p$ h
  37. RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_PLLSRC | RCC_CFGR_PLLXTPRE | RCC_CFGR_PLLMULL));
    ; t) E8 ^, r' x$ U2 p* W9 g
  38. RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLSRC_HSI_Div2  | RCC_CFGR_PLLMULL12);9 }8 g. f3 y; B) ^* @
  39. 0 s* }. q! I! a6 l
  40. /* Enable PLL */7 y- u# G, W" \  ?% ]
  41. RCC->CR |= RCC_CR_PLLON;
    & y, N) ?; k/ K5 E& R) `
  42. / v4 P. }" v; F
  43. /* Wait till PLL is ready */1 I( B- J' C# ?0 v4 `' g
  44. while((RCC->CR & RCC_CR_PLLRDY) == 0)! E5 r. V% x7 _
  45. {
    + P5 L/ |1 |9 i: A  F" G0 F
  46. }3 v. A. X% O" ?0 R1 [/ m
  47. % K* I' q& ]- h3 j* u
  48. /* Select PLL as system clock source */1 i7 L/ Z8 E  @3 O: x- W
  49. RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_SW));
    % V) t( c' j( S" \* z' |1 N
  50. RCC->CFGR |= (uint32_t)RCC_CFGR_SW_PLL;   
    4 s* I; E9 b4 S4 B5 b

  51. 2 a3 \. R# _6 d9 m/ R
  52. /* Wait till PLL is used as system clock source */
    " l3 r5 B& j+ p6 h, O2 `3 L
  53. while ((RCC->CFGR & (uint32_t)RCC_CFGR_SWS) != (uint32_t)RCC_CFGR_SWS_PLL)
    : g% ~5 n+ W* B% J, G) S9 I
  54. {
    - {& Z; o0 [$ w. i: o  \2 W
  55. }* z% R8 f. Q. U, D6 j- i
  56. : v' R* }- ?- c% q5 ]) o
  57. }3 a; U! T$ L1 J  N
  58. else7 [" K; N, o, u- q/ x* x
  59. { /* If HSE fails to start-up, the application will have wrong clock8 \% {, y3 H, }- i0 s4 Y
  60. configuration. User can add here some code to deal with this error */' j# `) E! x+ K
  61. }& j- i9 @# r- M; T5 r+ ^
  62. }
复制代码
, l& }+ t" L' S
) ^( a6 A9 q# r9 d. X$ B
' Z7 N3 f6 [! Q2 G# V' n1 O
收藏 评论0 发布时间:2021-11-25 16:00

举报

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