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

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

[复制链接]
心升明月 发布时间:2018-5-31 10:46
STM32F030F4P6单片机由外部时钟改为内部时钟的步骤
& |0 d2 B1 t' H6 Y  f: e  m

6 O/ J7 ^" Q8 }一.看程序运行的时候初始化时钟部分:
* h; Q7 u9 f' l: |' Z 11.jpg & w8 K. ~2 {0 Z

# l4 \0 d5 F: D  r二.查看systeminit定义如下:
; ~, G: M- l0 ]1 r 12.jpg
4 X. ^' ^2 K& _1 t% Q
: \( Q* q3 r+ x1 _( L- P, M+ T
7 P3 h2 |1 P1 F/ @这就是打开的函数内容这就是使用外部时钟的配置,也就是库函数的默认配置):static void SetSysClock(void)
& `7 D" Z) I+ s3 T0 j3 G$ g{( w& L6 w! e+ k9 d
  __IO uint32_t StartUpCounter = 0, HSEStatus = 0;% f) m4 Y5 a- J1 i) b
  $ U  x, ]- x6 r7 c
  /* SYSCLK, HCLK, PCLK configuration ----------------------------------------*/; h2 \0 O" C4 ~1 B$ s! f
/* Enable HSE */ //打开外部时钟开关
4 C  {& V" v2 `" w: S) V+ D: l  RCC->CR |= ((uint32_t)RCC_CR_HSEON);2 `1 h( P5 \$ q% X5 R+ Z$ f

% c# \( O) k: o5 d3 R5 `  /* Wait till HSE is ready and if Time out is reached exit *///判断外部时钟是否起振
8 G9 Y# c' r! b, M5 _  do
& ]6 {+ h& x" D+ Q, z9 I  {; t, _" M# ~! g( m5 X- P5 [
    HSEStatus = RCC->CR & RCC_CR_HSERDY;- o- I7 p# P8 V& o
    StartUpCounter++;  
" |  K: H* C$ D* u5 @  } while((HSEStatus == 0) && (StartUpCounter != HSE_STARTUP_TIMEOUT));
+ m( S# i$ \% T( U6 r  J) Z. {& f0 t. A! R9 v3 F. R* ]
  if ((RCC->CR & RCC_CR_HSERDY) != RESET)
. R9 x# R% _1 w3 `. L9 g( {6 Q  {' A8 y- S1 q/ z5 [7 h8 N* B( F  N
    HSEStatus = (uint32_t)0x01;
% }1 G* q/ r" Y9 I% g  }
) U, y; h4 a$ K: R+ W2 n  else
# J6 b8 X1 z7 K: \7 |9 O  {
3 G0 A" \8 T( c9 t" H5 y7 Z/ N    HSEStatus = (uint32_t)0x00;
& ~# e, G2 d+ @7 [! C8 t  }  , B$ s0 {" b* l+ H; [+ R& V

) `9 p5 @9 v- O- u* b7 [  if (HSEStatus == (uint32_t)0x01)
" p& C/ y- k5 h$ V6 I- q, k% O  {5 g8 N' n# v: r" t% T9 A1 r; R4 ^
/* Enable Prefetch Buffer and set Flash Latency */ //flash总线时钟使能% X0 ~+ i$ W' ~4 g. G: t' o# j( z
    FLASH->ACR = FLASH_ACR_PRFTBE | FLASH_ACR_LATENCY;: a5 T3 K4 J/ w( K# n

$ Z% R2 M- M0 [1 X    /* HCLK = SYSCLK *///外设AHB总线时钟等于系统时钟7 M; S1 g- w/ q8 W
    RCC->CFGR |= (uint32_t)RCC_CFGR_HPRE_DIV1;
+ k& ~4 x+ Q  L) f3 Z" M; d3 h4 V  X- {" A' m  M
    /* PCLK = HCLK *///外设APB总线时钟等于系统时钟5 I7 p) Q4 x$ x2 X* K
    RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE_DIV1;
- H5 v+ `; U$ f. k8 q8 s. u; G; K4 O1 z4 n: L5 G# N- `& n
    /* PLL configuration = HSE * 6 = 48 MHz *///外部时钟6倍频 =系统时钟
* o7 C; r9 s" f% {7 F2 K( D  @    RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_PLLSRC | RCC_CFGR_PLLXTPRE | RCC_CFGR_PLLMULL));
; X& L& U* j' E    RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLSRC_PREDIV1 | RCC_CFGR_PLLXTPRE_PREDIV1 | RCC_CFGR_PLLMULL6);' `2 H3 v: b0 I0 D7 \
" D) J4 M8 m  Q
    /* Enable PLL *///使能锁相环倍频开关) c$ a' h# p8 Y1 l. @8 ~
    RCC->CR |= RCC_CR_PLLON;) S/ |, N. N+ m& r( {- j

5 H# e3 P# E; c. G* J- r    /* Wait till PLL is ready *///等待锁相环就绪

5 V& {8 `" q; G# f7 p2 y    while((RCC->CR & RCC_CR_PLLRDY) == 0)6 g+ c7 |* |* r/ g& q( _
    {
) |, k1 T8 N; D9 g    }
0 c* j9 u# T' y9 Q% x$ r
9 E( c/ X" e  m+ ?* K  m/* Select PLL as system clock source *///选择锁相环输出时钟作为系统时钟

! Z1 ?. v- O6 l7 s9 z! M" o( |    RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_SW));
$ r" D# l& ~% a0 V    RCC->CFGR |= (uint32_t)RCC_CFGR_SW_PLL;    0 R- s) S; R4 |& o2 }. {+ ?
, Q; n: s5 e! w) t* z9 ]( T
    /* Wait till PLL is used as system clock source *///等待锁相环输出时钟已经成为系统时钟# q2 \& D* D8 r$ ^/ W8 K; F
    while ((RCC->CFGR & (uint32_t)RCC_CFGR_SWS) != (uint32_t)RCC_CFGR_SWS_PLL)5 R- o1 g5 [9 ]. U6 q, T" |( }/ g6 N
    {
  l3 _- ~2 i. j+ w' d' u  {    }
! c8 C5 _" D* g8 x" R  }4 u; o/ R/ M" T4 M1 A
  else
1 x9 K: W9 ~! M& K2 r5 t( ]  { /* If HSE fails to start-up, the application will have wrong clock
3 e, }( W+ ~! ~& v/ r" H* z         configuration. User can add here some code to deal with this error */
/ d# z* Y& G4 P  }  
, P' B* H! t7 c}
. }" V! l* T0 A$ A) `: i6 H

  1. 8 d6 w( t. e) A( X
复制代码
三.接下来我们想将系统时钟改为内部时钟,修改办法依旧是修改  SetSysClock()这个函数中的配置.首先我们要知道单片机内部的时钟到底是怎样一种结构,可以通过芯片文档来查找,另外比较方便的方法就是利用cubemx工具来查看,时钟结构如下:
& n  J1 K$ x( t" D. {1 `$ p
( S+ N% z4 [/ ?" E" E8 ~$ p  P& V3 a3 {& ~. f+ a4 E
四.那么我们就按照上图的结构配置来修改SetSysClock()中的配置即可采用内部RC时钟作为时钟源,蓝色字体为修改关键处):
6 s+ E# w- u# Lstatic void SetSysClock(void)- F0 A% O9 u; C! I8 Q4 W
{
' X5 W, E1 o- v5 ]  __IO uint32_t StartUpCounter = 0, HSIStatus = 0;
8 {& I+ }) n1 _$ U" Y& \; k% L  ; [9 j7 U8 [/ i4 l0 O
  /* SYSCLK, HCLK, PCLK configuration ----------------------------------------*/" s% R/ ?8 A7 M" G/ d: X
/* Enable HSI*/ //使能内部时钟9 g4 ]+ ?/ g" L5 B
  RCC->CR |= ((uint32_t)RCC_CR_HSION;7 O1 \6 {! j/ W- G7 p! C2 A
& K1 R9 B# S. V7 Z) }2 l
  /* Wait till HSI is ready and if Time out is reached exit */ //等待内部时钟起振
* f' k4 |5 @  X6 r) ]: K& P  do
0 ]# f9 e; k: j# q  {; D5 y& Q) }: o8 V8 S
   HSIStatus = RCC->CR & RCC_CR_HSIRDY;
2 S5 _/ I+ D5 Z  C& P# l    StartUpCounter++;  
. m7 U& ~! \/ H5 k) C3 i  } while((HSIStatus== 0) && (StartUpCounter != HSI_STARTUP_TIMEOUT));

4 d3 q8 m6 J$ D7 l
$ e2 f' g) I6 {7 L3 c* L& U/ E  if ((RCC->CR & RCC_CR_HSIRDY) != RESET)$ J) a* z) K* A
  {! i2 w5 Z% s! R) m# S1 {" T
  HSIStatus = (uint32_t)0x01;
$ D/ i: {9 j9 a% u: e/ R& X2 h( \8 a  }
( _; o1 d9 T+ M6 a" G: M* B1 c  else  1 D1 e0 ^1 W# S7 {, G$ ~8 r3 ~
  {5 h4 p. ~2 d) ]6 t, C" x
  HSIStatus = (uint32_t)0x00;! H, Y5 X# E( R
  }  

+ w) H  R# \7 A& v
# X/ V" x/ x( y9 `) g3 \# r- Y  if (HSIStatus == (uint32_t)0x01)
; `% [9 r9 n8 k. k/ m  {
: N$ S3 E0 z, F2 e/* Enable Prefetch Buffer and set Flash Latency */ //flash总线时钟使能
; c+ q, E* D# |# k, R7 i! f) M" O    FLASH->ACR = FLASH_ACR_PRFTBE | FLASH_ACR_LATENCY;
  ?6 D4 n; W5 B; C% M' X+ s8 E# r
/* HCLK = SYSCLK *///外设AHB总线时钟等于系统时钟% ]' }# Z. N9 o) f, j
    RCC->CFGR |= (uint32_t)RCC_CFGR_HPRE_DIV1;) z( z: x" W1 ^& E
      % N& ]! r: |5 m! \6 V- S
/* PCLK = HCLK *///外设APB总线时钟等于系统时钟
" I9 D! j( l3 M0 }    RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE_DIV1;
7 r+ I  K" g, W/ Y- S9 c& A- ~) O, c" n# G2 c' r: n
   /* PLL configuration = HSI/2 * 12= 48 MHz */
3 M) p* J* N' v6 D% `, H4 H0 g    RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_PLLSRC | RCC_CFGR_PLLSRC | RCC_CFGR_PLLMULL));
" ]- I% z" P3 |$ _3 A( U8 r7 d9 p    RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLSRC_HSI_Div2 | RCC_CFGR_PLLMULL12); //RC时钟2分频后 进行12倍频</font>
7 d2 }% ^& H$ W% Z" k' T
            
; V+ w4 s4 K6 }2 F) h/* Enable PLL *///使能锁相环倍频开关
! {# e* H5 Z/ O5 C$ r3 ^4 b* C- ^+ ?    RCC->CR |= RCC_CR_PLLON;- n! m! S3 c, C0 S  E" S9 v$ @
; _- j* e1 q# X0 T7 w
/* Wait till PLL is ready *///等待锁相环就绪

, R/ U9 x" r; J' Q% z    while((RCC->CR & RCC_CR_PLLRDY) == 0)4 h" w; K0 ]* S6 X" ?% M
    {
7 X) C7 \( P3 }$ L( i    }- J  ?0 g1 K1 O9 m5 k

( M4 h$ D: I0 ]; x3 ]5 g8 u/* Select PLL as system clock source *///选择锁相环输出时钟作为系统时钟 ( t8 v) u7 w( n, ~
    RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_SW));
$ C/ P/ e- }3 X    RCC->CFGR |= (uint32_t)RCC_CFGR_SW_PLL;    ' u9 D+ L. i7 t7 S% ]3 J
. Q. P, s, ]. Q4 c
/* Wait till PLL is used as system clock source *///等待锁相环输出时钟已经成为系统时钟

3 Z$ {/ E8 C, y; R9 q0 t3 A    while ((RCC->CFGR & (uint32_t)RCC_CFGR_SWS) != (uint32_t)RCC_CFGR_SWS_PLL)/ h0 E; P; M* Q. f) U
    {9 l  Q5 B8 q5 T9 t
    }
2 ?8 v- W& C, ^. ]/ X3 b; T  }; K& }( G& S1 t- @
  else3 x& `& e  t0 Q* K3 W. k
  { /* If HSI fails to start-up, the application will have wrong clock ( K* ]/ J, {: I8 a" ]. B$ L
         configuration. User can add here some code to deal with this error */( O" t7 l& z) Z* L1 {! z# C
                & o* l6 h. u: }4 D* K
  }  " c: U2 X. B4 i5 L8 ?1 R8 K
}5 ?* Z! b  t! c2 b( Y8 E( n

  1. ( ]# d3 c9 i! t" p& V- f$ Y+ D
复制代码
好了,以上就是外部时钟源改为内部时钟源的总结.8 j6 I2 w  R( u& [6 n8 V) l
. D' f& X& M: W# j! c3 W0 H, n

# v% C; u  c9 c
4 f, K; H/ [) t: _8 o; }( P7 `5 |$ e& z% P

( Z& q  n+ Z. X3 `" D

评分

参与人数 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
# a4 p9 k" g% V) p" s用添加代码文字 把自己坑傻了. 为了让修改的代码没明显看出来,添加了不同的颜色,编辑时一切正常,结果提交完 ...
) [/ ?. _% j8 Y, `2 g2 g% `3 \% O
加超链确实有问题的,最好的方法是去格式在操作,会反馈给技术部门
心升明月 回答时间:2018-5-31 11:09:04
zero99 发表于 2018-5-31 11:06
1 y" {& w0 O* L$ T加超链确实有问题的,最好的方法是去格式在操作,会反馈给技术部门

+ g- O* h( r6 X1 D好的!
西点钟灵毓秀 回答时间: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 手机版