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

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

[复制链接]
心升明月 发布时间:2018-5-31 10:46
STM32F030F4P6单片机由外部时钟改为内部时钟的步骤; {2 M0 Q3 z2 E, n

' [% D1 m1 i, B! v3 a+ r一.看程序运行的时候初始化时钟部分:
2 ?0 O' s1 ]% N* s9 ]" D7 M 11.jpg
3 T6 l3 [8 `7 G: o, P; `  l2 T3 x3 y! [+ A/ V
二.查看systeminit定义如下:
  k, @" k1 P: F" Y' }9 M 12.jpg
2 e1 B! N! G2 E" B. c  \& [- O% h( \' y8 o. z4 S& T, ]  c. Q

0 i' L- }8 D: P; O2 b! ]5 i这就是打开的函数内容这就是使用外部时钟的配置,也就是库函数的默认配置):static void SetSysClock(void)
5 @) g9 T7 J3 p( Y{
+ T, F: I: v2 l. z0 O5 ?+ n  __IO uint32_t StartUpCounter = 0, HSEStatus = 0;, N9 W' p7 g6 f- M
  
, D$ A, I7 p$ J; L  /* SYSCLK, HCLK, PCLK configuration ----------------------------------------*/1 @' n% B0 p6 q
/* Enable HSE */ //打开外部时钟开关
0 S0 [) F" w: o( Y# r7 e7 x+ O  RCC->CR |= ((uint32_t)RCC_CR_HSEON);; F! `; f, v& \  y# O% ?
" h& W! R3 L7 D, f7 ^% g
  /* Wait till HSE is ready and if Time out is reached exit *///判断外部时钟是否起振/ S+ C% d7 k% `2 f! O  [0 E2 Y
  do
+ w* ?& q5 {+ \+ k! c1 F) T7 v  {
- E$ L1 t: ~$ |    HSEStatus = RCC->CR & RCC_CR_HSERDY;
7 q. Z  z/ }  T8 O& [9 Y: _. }    StartUpCounter++;  
# {4 y# Z% Z) }  ~9 o+ \  } while((HSEStatus == 0) && (StartUpCounter != HSE_STARTUP_TIMEOUT));
* J3 i, U# n" q% q; H# c7 Q" v
( S8 X( }6 k, V1 R, D% c. Y  if ((RCC->CR & RCC_CR_HSERDY) != RESET)
0 c! r. H& m- x! `6 i3 l  {- ~7 f7 d- D; {4 T" R) X: m8 Z
    HSEStatus = (uint32_t)0x01;
' a3 P/ v( h/ ?' y  }
! [4 O1 }: S4 g. N) Y+ S% s. M  else
0 a: q1 ?) O0 |. h% w  {; l7 w" k3 F' t1 A9 E! N$ @
    HSEStatus = (uint32_t)0x00;
! _- [2 M1 N+ V5 K  }  
1 Y1 Z, W! @' q% c
: f* T1 `/ q0 A8 w" @, y, W  if (HSEStatus == (uint32_t)0x01): k; H: B$ {& V3 a' j4 Y- S- y
  {" `# }$ p7 Y$ a% M7 _2 @/ O- A
/* Enable Prefetch Buffer and set Flash Latency */ //flash总线时钟使能
7 G( T0 v" c6 X9 V    FLASH->ACR = FLASH_ACR_PRFTBE | FLASH_ACR_LATENCY;' ^7 J: T* j+ k& t
& J6 D# J+ B" z6 F  \* {
    /* HCLK = SYSCLK *///外设AHB总线时钟等于系统时钟$ _, U" J8 v$ B, j& y9 l0 |; ~9 U
    RCC->CFGR |= (uint32_t)RCC_CFGR_HPRE_DIV1;9 O; w" Z, U! V' p1 c7 B

  d+ |/ J8 A; P. `8 r3 T" o    /* PCLK = HCLK *///外设APB总线时钟等于系统时钟
- s: x0 U- ?1 ]' d0 w( w% s- e. _0 \    RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE_DIV1;4 H1 ~* I2 s" y6 w2 z
8 B/ ?; L) w: A
    /* PLL configuration = HSE * 6 = 48 MHz *///外部时钟6倍频 =系统时钟
$ ]7 }) @" A  j' ?( P    RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_PLLSRC | RCC_CFGR_PLLXTPRE | RCC_CFGR_PLLMULL));( W( o7 x; v9 W" L) ^; F0 Y
    RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLSRC_PREDIV1 | RCC_CFGR_PLLXTPRE_PREDIV1 | RCC_CFGR_PLLMULL6);0 i+ [) z' i* x( m

* @, w# b" e. A& B7 Y    /* Enable PLL *///使能锁相环倍频开关# ~) b4 X. e2 ]: H# v, D
    RCC->CR |= RCC_CR_PLLON;
9 V+ |  E+ S% o+ h4 N- A- ?- ?' w
3 y6 ?; p* J5 Y: z1 _    /* Wait till PLL is ready *///等待锁相环就绪

  q3 x, G+ f; f    while((RCC->CR & RCC_CR_PLLRDY) == 0)% [) i4 [! c9 Y* f
    {
) z1 v8 u$ ^' b; x    }) B1 v  I7 U# P* W
+ x( Q; G- ]* k
/* Select PLL as system clock source *///选择锁相环输出时钟作为系统时钟
5 J* D( k0 ^! V
    RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_SW));! c0 r: F+ {; b' O
    RCC->CFGR |= (uint32_t)RCC_CFGR_SW_PLL;    9 y$ f* N8 g6 x
( z6 s- A% C/ r8 l6 _6 B8 a
    /* Wait till PLL is used as system clock source *///等待锁相环输出时钟已经成为系统时钟
" x$ J* O1 }" ?    while ((RCC->CFGR & (uint32_t)RCC_CFGR_SWS) != (uint32_t)RCC_CFGR_SWS_PLL)
3 s3 \5 l2 D/ b" H4 K4 M1 L    {
3 }. a- U" R1 {6 M0 {% H0 w    }
2 J6 S) c" B0 k( n" c  }
+ S# J9 W. U" ^3 y8 x  else
9 B# x' q7 p- i; o1 F8 `/ L  { /* If HSE fails to start-up, the application will have wrong clock   p0 r3 E. G. Q9 J5 A" N! w; x
         configuration. User can add here some code to deal with this error */3 e6 c5 X- C. E  J
  }  7 t9 U$ g2 h, u5 L) l
}
) W: ]/ }4 }8 Z+ C# |4 V) _
  1. ' i( M6 P% p& f* G
复制代码
三.接下来我们想将系统时钟改为内部时钟,修改办法依旧是修改  SetSysClock()这个函数中的配置.首先我们要知道单片机内部的时钟到底是怎样一种结构,可以通过芯片文档来查找,另外比较方便的方法就是利用cubemx工具来查看,时钟结构如下:
2 a. ?8 `, d% f3 F6 k1 w$ V" v$ |

, U7 V; A5 }+ Z5 Q) c. F四.那么我们就按照上图的结构配置来修改SetSysClock()中的配置即可采用内部RC时钟作为时钟源,蓝色字体为修改关键处):' }' A( J3 I" P$ b: u2 Y& g8 K
static void SetSysClock(void)$ d8 Q4 B( r' A2 C3 p
{' W1 d( _' P6 B- [# R3 l
  __IO uint32_t StartUpCounter = 0, HSIStatus = 0;
" t3 L5 c4 u* ^/ p) S8 Y3 S  
- r! H, H' G+ g" H7 E8 e: O  /* SYSCLK, HCLK, PCLK configuration ----------------------------------------*/
& d0 Q; z5 C% {3 u- `$ ]/* Enable HSI*/ //使能内部时钟) M. }  P" \' w: v
  RCC->CR |= ((uint32_t)RCC_CR_HSION;- u% P! O7 F" y% p% w' Q6 I1 e; M, K

$ f9 W$ K' [4 C8 F% l  /* Wait till HSI is ready and if Time out is reached exit */ //等待内部时钟起振. I3 G& R( W. `. C
  do
0 L+ H, d- N! Z" [. {  {) E# B: g7 e: ~: Q
   HSIStatus = RCC->CR & RCC_CR_HSIRDY;  `1 g# G# z  f( H& d
    StartUpCounter++;  
7 b4 u* l9 C- W4 g* Z' C1 x  } while((HSIStatus== 0) && (StartUpCounter != HSI_STARTUP_TIMEOUT));

: |2 [, l' F' V, T& {
$ M; l3 U" T. N( z% M; X  if ((RCC->CR & RCC_CR_HSIRDY) != RESET)6 Q6 @2 _2 V7 a& p1 |; ^: n
  {
4 K8 ?8 W) [4 m  \* P4 s  HSIStatus = (uint32_t)0x01;
3 m% n, Q( m. e4 A  }
2 a- q# I0 v6 D; T( v8 I6 K2 m( X4 _  else  
* t  N; c* ?6 n  e4 m  [  {: f, E1 J, |& `7 s$ s4 v+ {. j! W
  HSIStatus = (uint32_t)0x00;/ l2 }, H9 u* W6 u1 M4 P
  }  
) k: g& V3 T0 Q; q/ O, T, l$ _' _* @
3 _0 N. p( }4 t2 b9 {
  if (HSIStatus == (uint32_t)0x01)
) S; }9 k1 l; ?: o  {- n: {; }8 N3 J1 q9 b
/* Enable Prefetch Buffer and set Flash Latency */ //flash总线时钟使能) [* T- X) L2 l" }  Z
    FLASH->ACR = FLASH_ACR_PRFTBE | FLASH_ACR_LATENCY;
1 F; _! N" a. y4 }
/ u7 w$ G- A. k* c5 |3 `4 d/* HCLK = SYSCLK *///外设AHB总线时钟等于系统时钟! h- V6 P& c  k5 P  G$ s
    RCC->CFGR |= (uint32_t)RCC_CFGR_HPRE_DIV1;7 y8 v8 J0 _& x0 w: F$ J6 J, ]
        I' f; X0 S" O1 S0 L) q
/* PCLK = HCLK *///外设APB总线时钟等于系统时钟
' @, g/ @! m6 n$ G8 e    RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE_DIV1;9 a# o* v1 u6 }
  U* l0 W( W" {- U2 o9 m
   /* PLL configuration = HSI/2 * 12= 48 MHz */
. D$ X4 d/ `4 c: Y6 p* i    RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_PLLSRC | RCC_CFGR_PLLSRC | RCC_CFGR_PLLMULL));
0 B. Q" G! p7 S" q0 W9 |: m    RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLSRC_HSI_Div2 | RCC_CFGR_PLLMULL12); //RC时钟2分频后 进行12倍频</font>

1 [1 ?8 q0 ^2 d& @. U$ G            / a* L+ I7 b2 E8 B( V
/* Enable PLL *///使能锁相环倍频开关 - ^7 l# e. m9 e9 K3 A
    RCC->CR |= RCC_CR_PLLON;
# j2 t7 c- z$ X5 l) Q4 b6 [" a$ j1 N
  {6 H/ F7 E# l) w/* Wait till PLL is ready *///等待锁相环就绪
" B1 K5 r6 a4 y1 u) E& T0 o% m& h
    while((RCC->CR & RCC_CR_PLLRDY) == 0)
/ ~. S" E" H! J( `! ]1 [    {3 y# B5 g' [; }, _. m
    }
- Q! {' H, y" _* z
& O7 [  `5 V5 ~6 r% r. y' t7 D/* Select PLL as system clock source *///选择锁相环输出时钟作为系统时钟
2 \" b" @9 l- s% ]- u. e% C    RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_SW));- D! ?) f1 L  ?7 x& y+ k; ?8 D1 O
    RCC->CFGR |= (uint32_t)RCC_CFGR_SW_PLL;    + X* K  W  w2 ?! s& `

) W& O& C) g( x/* Wait till PLL is used as system clock source *///等待锁相环输出时钟已经成为系统时钟
, Q  V6 d* r1 s
    while ((RCC->CFGR & (uint32_t)RCC_CFGR_SWS) != (uint32_t)RCC_CFGR_SWS_PLL)
+ C' B9 Q- j+ o/ I    {
5 B7 c" c2 Q/ @0 q; ~- l    }! g) Q9 F! p. T
  }4 W6 d: P3 h& P2 F, u8 e. p# F% X
  else
0 y5 L6 g* q6 d* p- c( w  { /* If HSI fails to start-up, the application will have wrong clock # I2 S$ O% i3 D1 l5 }* _
         configuration. User can add here some code to deal with this error */. ~  p$ G5 I* `8 K) t
               
  [6 y! ?$ ^: q" W( G+ I  }  ; k3 C6 v- r1 p) n6 Q' e/ n+ p
}
; K! g' {. R2 g' Y- J  i) f7 |

  1. 3 N; O+ o0 E* l9 j+ s
复制代码
好了,以上就是外部时钟源改为内部时钟源的总结.
3 D2 V; y/ P" B/ F' M! N3 `
4 f. [/ ~3 O  b8 K5 D

& k2 i3 R- P  f+ X7 `7 ?0 j
4 n' [8 ~$ d- d# w$ ^5 G4 Y# K2 @! k1 J9 f; I

: s/ u9 R3 y9 u. w- {( r, D" r

评分

参与人数 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( q- ?( Z3 Y$ X1 t1 p5 f) Z0 Z
用添加代码文字 把自己坑傻了. 为了让修改的代码没明显看出来,添加了不同的颜色,编辑时一切正常,结果提交完 ...

4 P' @7 t' }+ t& l6 J加超链确实有问题的,最好的方法是去格式在操作,会反馈给技术部门
心升明月 回答时间:2018-5-31 11:09:04
zero99 发表于 2018-5-31 11:06; E5 E' a5 _7 g! s! f
加超链确实有问题的,最好的方法是去格式在操作,会反馈给技术部门

; i. M2 Q* P3 d5 V" }9 _好的!
西点钟灵毓秀 回答时间:2018-9-29 14:38:07
外部时钟源改为内部时钟源的总结. 不错
luris 回答时间:2019-1-14 11:46:25
很详细了,英文也一一标注成中文,谢谢你
bl2019 回答时间:2019-6-26 08:01:58
感谢,正在做这个,谢谢

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版