请选择 进入手机版 | 继续访问电脑版

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

STM32F030F4P6采用外部时钟改为采用内部RC时钟

[复制链接]
心升明月 发布时间:2018-5-31 10:46
STM32F030F4P6单片机由外部时钟改为内部时钟的步骤
4 \& N+ {& S0 Q
* a# j6 e3 N3 D. J3 ?/ b
一.看程序运行的时候初始化时钟部分:
5 a5 U; V) q  v5 w8 J- k: l 11.jpg
3 }4 q# D  z8 z" K$ A, t4 Y5 g+ m3 u/ \9 z( V
二.查看systeminit定义如下:
8 K1 _0 U+ V& o9 g( R7 z6 F 12.jpg 8 r6 n. p2 ?; B/ D
% }# [5 ^0 a% Y+ `! o: |7 @( c) F+ a
% @5 o* m) F# M  |" _- }1 T5 G
这就是打开的函数内容这就是使用外部时钟的配置,也就是库函数的默认配置):static void SetSysClock(void)1 o$ t3 K* `* s8 {& T; H2 `: Y
{
* T: w+ [7 \' u9 _6 q  __IO uint32_t StartUpCounter = 0, HSEStatus = 0;2 B2 j3 f( D2 F9 O" X
  9 H! z8 w% @9 a, f9 `1 d% Y4 N* m
  /* SYSCLK, HCLK, PCLK configuration ----------------------------------------*/; @% G5 E' i+ u9 U9 Y% F
/* Enable HSE */ //打开外部时钟开关
1 Y' T5 o5 A: {/ u  RCC->CR |= ((uint32_t)RCC_CR_HSEON);% l3 o/ |3 p$ V
- T' @. j4 e) Z, p
  /* Wait till HSE is ready and if Time out is reached exit *///判断外部时钟是否起振1 U0 {" l- H! |; o( l
  do/ a2 ?3 t2 L: _0 \: w
  {
1 y6 Q9 L. W- ]2 X& s( W    HSEStatus = RCC->CR & RCC_CR_HSERDY;/ s" x: e7 P3 i- T+ v( g
    StartUpCounter++;  
& H8 L+ U/ b( S) Z  } while((HSEStatus == 0) && (StartUpCounter != HSE_STARTUP_TIMEOUT));
0 P4 A8 H3 n  |' n/ F) {1 _/ e' G7 C2 q
  if ((RCC->CR & RCC_CR_HSERDY) != RESET)' l, z$ D2 I% [: O% C, Z& I9 q
  {
; O" v* ?* x& X/ ~5 H( P! E    HSEStatus = (uint32_t)0x01;, a6 K! b9 q' {( Q# m3 R7 z
  }
8 F. n& [9 i7 P! _  else" Q- U' \9 o4 x  u
  {* Z1 H( j, w' G; |- ]6 {6 `
    HSEStatus = (uint32_t)0x00;
. V2 i' N) Q' H4 g1 ^, L, f/ O& l; ?5 Z  }  
6 b( t: U  c5 U0 F$ g7 \. H8 W' ~- G: E3 Q$ [4 o
  if (HSEStatus == (uint32_t)0x01); H' Z- w" \( r" ~2 h
  {
8 V9 I( [, Z! D& q/* Enable Prefetch Buffer and set Flash Latency */ //flash总线时钟使能
3 r) n5 n( F$ l    FLASH->ACR = FLASH_ACR_PRFTBE | FLASH_ACR_LATENCY;+ O! }# i$ N( N

. o! _* v  w) o    /* HCLK = SYSCLK *///外设AHB总线时钟等于系统时钟" b8 Y! x, Y- g$ ]- J- N
    RCC->CFGR |= (uint32_t)RCC_CFGR_HPRE_DIV1;4 s' ?4 ^# I9 C2 X3 ]! [
/ Z$ E" i" s+ A- P! [
    /* PCLK = HCLK *///外设APB总线时钟等于系统时钟
" u$ _) y( z5 A2 A( W. @    RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE_DIV1;4 H, b0 p7 i8 V! m
; r) D( u- _; d  P
    /* PLL configuration = HSE * 6 = 48 MHz *///外部时钟6倍频 =系统时钟& ]0 Z5 i) A" H& W( N
    RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_PLLSRC | RCC_CFGR_PLLXTPRE | RCC_CFGR_PLLMULL));
; i. T8 B& q5 F* y    RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLSRC_PREDIV1 | RCC_CFGR_PLLXTPRE_PREDIV1 | RCC_CFGR_PLLMULL6);
" R+ y$ o3 O$ e. e3 M; p" g. ?
    /* Enable PLL *///使能锁相环倍频开关
( s- h0 ^  E3 A    RCC->CR |= RCC_CR_PLLON;6 T4 Y* V: K+ k) M  f  [. J3 `

+ c" k. M; C5 x8 N$ [    /* Wait till PLL is ready *///等待锁相环就绪

9 p1 j3 ~+ N  B% q    while((RCC->CR & RCC_CR_PLLRDY) == 0)) v! l! x0 J5 e/ ]  m3 d
    {
* G8 n* X, w" o& ]. h    }
2 B5 a' _/ r$ O) ^* I9 v! K0 \7 n9 t5 S$ a6 l: z2 n( e& C
/* Select PLL as system clock source *///选择锁相环输出时钟作为系统时钟

  i1 r1 P' u& D: r# k    RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_SW));
* A6 ^4 I& |) Y, k2 {    RCC->CFGR |= (uint32_t)RCC_CFGR_SW_PLL;    ) |3 I* K) ^/ z' E8 Y5 F
. V0 U) \9 i6 x
    /* Wait till PLL is used as system clock source *///等待锁相环输出时钟已经成为系统时钟
  Z1 w3 \. A/ l3 a0 I% v8 L    while ((RCC->CFGR & (uint32_t)RCC_CFGR_SWS) != (uint32_t)RCC_CFGR_SWS_PLL)2 S& b5 q; q: c3 V2 R
    {
# K- r2 d' }/ N5 u$ _2 A6 g3 R    }4 ^: _2 ?7 H# [# S! W
  }
) r* [8 D8 l9 k/ {" E  else
' b/ e' c$ g. k/ Q# s6 x. h  { /* If HSE fails to start-up, the application will have wrong clock
% J8 \5 t. y9 i' D( M* C. a         configuration. User can add here some code to deal with this error */
3 }. b3 f( B; F: j. {  }  1 d' I. n8 Q  P1 Q. q5 E
}+ w$ D( a% ]) F1 R1 u) ]; |4 T
  1. - G. _/ S! b9 b
复制代码
三.接下来我们想将系统时钟改为内部时钟,修改办法依旧是修改  SetSysClock()这个函数中的配置.首先我们要知道单片机内部的时钟到底是怎样一种结构,可以通过芯片文档来查找,另外比较方便的方法就是利用cubemx工具来查看,时钟结构如下:" z0 g1 M8 s, P+ `) L$ \% E
( s; m- r$ D5 q

5 U% k. z6 I5 h5 ^( c四.那么我们就按照上图的结构配置来修改SetSysClock()中的配置即可采用内部RC时钟作为时钟源,蓝色字体为修改关键处):, W  g) D# z1 Z0 e# [$ g
static void SetSysClock(void)
- T0 I5 t- ?3 e2 Y{
6 O. T! a7 W: g3 ?3 ^  __IO uint32_t StartUpCounter = 0, HSIStatus = 0;
6 a+ w2 }& B0 K+ X, q7 y! }& b  `6 ^  : n, e- J* D# y* J* H" j
  /* SYSCLK, HCLK, PCLK configuration ----------------------------------------*/  q/ X. q7 y+ Q' E
/* Enable HSI*/ //使能内部时钟
) ?0 z) D) t) U9 _9 Y0 g2 D  RCC->CR |= ((uint32_t)RCC_CR_HSION;( @  @, O7 q( Z# @1 {1 d

; f" ]/ t' B  \; B5 a  G* i5 J  /* Wait till HSI is ready and if Time out is reached exit */ //等待内部时钟起振
; ?: l8 L4 T( t) n# t( q; _" i  do
  s, S" r- O% `. x5 i  {8 P/ n  C& v$ ~2 _
   HSIStatus = RCC->CR & RCC_CR_HSIRDY;
1 w! r- b3 Z" v! Q' x6 R    StartUpCounter++;  
; g4 p" _# c* Q  } while((HSIStatus== 0) && (StartUpCounter != HSI_STARTUP_TIMEOUT));
7 c. \$ G) G! K- ]+ b3 `

# a* D; L! I0 z$ H8 Y- r2 G! m  if ((RCC->CR & RCC_CR_HSIRDY) != RESET)+ a/ l, s* {! b5 c- h
  {
' z* \( |7 E0 O  HSIStatus = (uint32_t)0x01;' T# e7 x7 ?. C! i8 B; x
  }
$ ?# Y2 Z' Z0 G6 \' V2 M2 p  else  
; U6 A/ @8 y3 A  {
  H" E; m( \# l5 n  HSIStatus = (uint32_t)0x00;
* p, z5 k. ^0 V: I. ?  h& r) y  }  

8 p% T; m( n3 W- Q& S, N$ H& N, Y7 Y: a8 I: y
  if (HSIStatus == (uint32_t)0x01)
& B, |1 B/ I% N  {
# ]  j4 Y. z9 O% P- X/* Enable Prefetch Buffer and set Flash Latency */ //flash总线时钟使能
% B; z  K; I* S' p" w2 i' a& C    FLASH->ACR = FLASH_ACR_PRFTBE | FLASH_ACR_LATENCY;- c5 T8 V  k. c: s) H
, ^" w7 |$ A2 Z; W+ p+ J4 X
/* HCLK = SYSCLK *///外设AHB总线时钟等于系统时钟
5 q! R$ C* p9 r. v  J; Q    RCC->CFGR |= (uint32_t)RCC_CFGR_HPRE_DIV1;8 Q; k  U5 f( @7 t- [$ C: W/ u
      + l4 \0 l8 L: A- E/ |
/* PCLK = HCLK *///外设APB总线时钟等于系统时钟* h7 b9 `1 g2 U8 x$ q+ W" D
    RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE_DIV1;
( Y# K5 b4 P1 j8 [& V4 d' P1 p( ?
   /* PLL configuration = HSI/2 * 12= 48 MHz */# Y# x6 f$ u: j+ t! G$ a0 N
    RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_PLLSRC | RCC_CFGR_PLLSRC | RCC_CFGR_PLLMULL));
, m, c( Y+ t6 o7 x3 C" z5 f    RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLSRC_HSI_Div2 | RCC_CFGR_PLLMULL12); //RC时钟2分频后 进行12倍频</font>
% q4 W# V6 Q, }0 K! C3 k; k! z
            : ?* N9 p( T/ `* Z+ x  r6 _1 K7 F
/* Enable PLL *///使能锁相环倍频开关
- Y0 Z+ c( x" Y9 e$ l    RCC->CR |= RCC_CR_PLLON;
% w6 b1 x1 L$ F& T7 B7 ?# z" l
; y2 m+ n3 u! F/* Wait till PLL is ready *///等待锁相环就绪

  }* s& m* l4 l' M7 @( I8 i9 \    while((RCC->CR & RCC_CR_PLLRDY) == 0)
- n8 ^2 h. Z/ y) h  Z    {+ J* K9 {2 Q; W. B( r
    }, M2 q, Y. P8 l# M( a7 V

6 }" @( h: H/ ?8 _0 \, q  U/* Select PLL as system clock source *///选择锁相环输出时钟作为系统时钟 + d4 p4 T/ x) T4 E" G' C! ^" k
    RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_SW));; s" z9 O6 W9 y- N4 I* Z" o
    RCC->CFGR |= (uint32_t)RCC_CFGR_SW_PLL;   
3 i8 X$ O' C( J/ J1 `2 C9 @) g" ?, d4 L% @
/* Wait till PLL is used as system clock source *///等待锁相环输出时钟已经成为系统时钟

# ^- [: g2 u+ g6 P    while ((RCC->CFGR & (uint32_t)RCC_CFGR_SWS) != (uint32_t)RCC_CFGR_SWS_PLL)2 d* u. l5 j7 @  w' c
    {7 z! Z/ e$ v2 n7 j8 t, C
    }3 ?& t; T' \1 M
  }/ F! y! }: Q- u: M1 p. C# L5 J
  else
+ T8 J: T( k$ Q6 e  { /* If HSI fails to start-up, the application will have wrong clock 2 h0 l9 l' X( L7 R8 Y8 X% W
         configuration. User can add here some code to deal with this error */, I: s3 ~: X' j6 x. N" {1 X
                : Y' H% C2 Y3 _4 o- ]* j9 u6 h% s
  }  
, z, p+ K* Y4 O4 [+ @3 ^2 Z}
. ^" R% e! x" ^, ?2 O
  1. / d' U6 G8 o  [% S$ ]$ f. G! _: A
复制代码
好了,以上就是外部时钟源改为内部时钟源的总结.
; W" |# E: ~6 N: A3 i
& C& S& R# z$ |  `1 A
9 A$ M) v1 Q- }- j, v( D* J

' Q* {2 X' a+ g! G5 ~
+ z: O5 L2 X0 _7 P1 p! u3 Y. q+ B2 y5 i. M( Y% z

评分

参与人数 1 ST金币 +1 收起 理由
zeh123 + 1 很给力!

查看全部评分

收藏 4 评论7 发布时间:2018-5-31 10:46

举报

7个回答
心升明月 回答时间:2018-5-31 10:57:31
用添加代码文字 把自己坑傻了. 为了让修改的代码没明显看出来,添加了不同的颜色,编辑时一切正常,结果提交完成后,一看便傻眼了,什么颜色都没有,反而出现了 font<> ..color<>之类的在我的代码中,好尴尬,好事不成反而多事! 希望管理员看到了,看这个问题能处理不,这个问题很不利于发帖分享!

点评

收到~  发表于 2018-5-31 11:05
zero99 回答时间:2018-5-31 11:06:51
心升明月 发表于 2018-5-31 10:57
5 m8 @  b1 n: a5 u3 G9 ]2 Q/ V用添加代码文字 把自己坑傻了. 为了让修改的代码没明显看出来,添加了不同的颜色,编辑时一切正常,结果提交完 ...

* B8 _& k3 ~/ {0 J加超链确实有问题的,最好的方法是去格式在操作,会反馈给技术部门
心升明月 回答时间:2018-5-31 11:09:04
zero99 发表于 2018-5-31 11:06
" k: C. \0 [! @4 G6 Y! G6 k: L; ]加超链确实有问题的,最好的方法是去格式在操作,会反馈给技术部门

. C6 M# z+ N3 }4 M7 A5 E+ G; b好的!
西点钟灵毓秀 回答时间:2018-9-29 14:38:07
外部时钟源改为内部时钟源的总结. 不错
luris 回答时间:2019-1-14 11:46:25
很详细了,英文也一一标注成中文,谢谢你
bl2019 回答时间:2019-6-26 08:01:58
感谢,正在做这个,谢谢
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版