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

【经验分享】STM32H7的电源,复位和时钟系统

[复制链接]
STMCU小助手 发布时间:2021-12-20 17:00
14.1 初学者重要提示
- j6 J3 V1 v* U- h1、  电源管理部分涉及到的各种低功耗方式会在后面章节中为大家讲解,当前阶段仅需了解低功耗属于电源管理部分即可。
" L: ?/ S& @: @0 }& s
: V0 _9 w/ J# d) A2、  电源管理部分最繁琐的就是CPU,D1,D2,D3域的各种运行,待机,停机状态切换,这部分知识点也放在后面低功耗章节学习。/ O6 ]5 u+ ^2 P3 V& y

6 E' \- u3 j! W$ V5 R" Y& _  k/ z14.2 电源
! f1 D7 k; ?( @. n+ s电源是系统稳定运行的根本,主要分为以下几个知识点,电源供电、供电监控、电源管理和低功耗。当前阶段主要了解电源供电和硬件上电时序。; S+ G: b& M4 j/ S0 O! c

: K4 o+ R1 w% A+ f# u- K7 f14.2.1 电源供电; L! L$ g# ]& `# D
学习STM32H7的电源供电,往往被一堆电源标识Vdd,Vdda,Vcap,Vss等搞迷糊,这些标识整明白了,电源供电部分也就理解了,首先看下面的框图:4 X3 Q+ \' w' e% k- `1 F
: j4 Q" ?# K+ V
aHR0cHM6Ly9pbWcyMDE4LmNuYmxvZ3MuY29tL2Jsb2cvMTM3OTEwNy8yMDE5MDQvMTM3OTEwNy0yMDE5.png
. b7 M# }8 k: k
8 L2 s" Y/ s& N& r  Z6 V
这些常用标识的解释如下:* }# u% g' f8 |6 L; C
. t& `3 k) }! b/ s3 b
aHR0cHM6Ly9pbWcyMDE4LmNuYmxvZ3MuY29tL2Jsb2cvMTM3OTEwNy8yMDE5MDQvMTM3OTEwNy0yMDE5.png

  k$ f# Q2 W0 q3 b
5 v, Z$ q0 U1 E, l+ Y对于电源供电部分了解了这些知识点就够用。
: \. y9 [+ P- w6 I
6 e+ j4 D1 T+ J* y1 ~14.2.2 系统上电启动
2 \0 j* Q9 P1 _系统上电到程序开始运行期间,H7都做哪些工作,一张时序图可以说明问题:
6 D) l4 S3 {* j, n' \: y; E
0 N! q0 |, C/ H4 ^7 |( y
aHR0cHM6Ly9pbWcyMDE4LmNuYmxvZ3MuY29tL2Jsb2cvMTM3OTEwNy8yMDE5MDQvMTM3OTEwNy0yMDE5.png

3 o! a# X6 k6 H; ^% X9 r) ~6 x# V, G6 N9 {7 w
对于上面的截图,主要看Operating mode部分,依次是Power down –> Reset -> Wait Oscillator ->HW system init -> Run -> Wait ACTVOS RDY –> Run,即断电状态 -> 复位状态 -> 等待HSI就绪->硬件初始化 -> 运行 -> 等ACTVOS位就绪 -> 正式运行。' T0 _2 m2 P0 W: ~

. M9 D) d  d7 v& ?详细些的执行流程如下:+ ^; J  x/ b! R6 g( Y/ C
- d7 H+ j# e8 C) P3 V$ l+ E- w6 Q) j
  当系统上电后,POR(Power on reset 上电复位)会检测VDD供电,当VDD大于POR设置的阀值时,将使能电压稳压器,注意看VDD那条线的变化。
; `" n( y% h% N% j6 W  看VCORE那条曲线,只要VOSRDY未就绪,就会一直处于复位状态。. B; w9 R" b9 D( ~9 ]. ]; L! ]. }5 F7 H
  一旦VCORE正常输出,系统将走出复位状态,内部高速RC振荡器HSI将使能。3 t( s" v/ v9 a" p" M1 l
  HSI稳定后,将开始系统初始化,主要是Flash和可选字节的加载,这些都是由硬件完成的,CPU也将以受限的方式运行(主要是指不允许对RAM进行写操作)。3 s  K2 j1 A  n% R! K" n& x
  软件程序初始化系统,包括供电配置。当供电配置完成后,等待ACTVOSRDY位置1,完成置1后,CPU就进入正常的运行的模式,允许读写RAM了。, g- L  K$ f! ^/ q# i3 {3 Z
14.2.3 电源管理! @5 o$ w4 ]' M) E
关于电源管理部分,H7参考手册中讲解的还挺复杂的,当前阶段我们仅需了解几个重要的工作状态即可,看到这几个单词了要认识,因为官方文档中多处要用这几个标识。
) O0 b1 q5 A0 X7 \% `
0 c. y' N" r6 z8 `8 J为了实现各种低功耗模式,CPU和D1,D2,D3域支持的各种模式如下:2 I& i- H- U9 @1 {+ \8 N

9 p" e3 l) P" J  CPU模式
( Y9 z! z1 `  Q  }CRun:运行状态,CPU和CPU子系统外设正常运行。
+ m6 d& E8 i1 {# [
$ e1 Q7 f7 j9 [CSleep:休眠状态,CPU时钟停止运行,CPU子系统外设正常运行。" J" ^# q# E0 v0 q# e9 n4 C
6 `9 R- D: t4 F$ v6 v7 ~
CStop:停止状态,CPU和CPU子系统外设都停止运行。7 F& u5 K( R3 `# q( W
* P" I1 k. f% r+ {9 G- l
  D1域模式3 u; K& L& m& u, }! z5 k
DRun:运行状态,D1域的总线矩阵正常运行,CPU子系统运行在CRun或者CSleep模式。5 `& j# O9 _% v
- t' P6 s  ~8 Z" B: C1 V  `) Y
DStop:停机状态,D1域的总线矩阵时钟停止运行,CPU子系统运行在CStop模式,PDDS_D1位选择DStop模式。
1 m2 r; s6 D) q5 a, E5 B8 t$ g
* }& L% p; L2 ~DStandby:待机状态,D1域的总线矩阵断电,CPU子系统运行在CStop模式,PDDS_D1位选择DStandby模式。3 h. X, U  e9 _! d

2 T/ c' U& h- n1 D- V  D2域模式
4 I5 r3 Y! R* T: pDRun:运行状态,D2域的总线矩阵正常运行,CPU子系统在D2域中有分配的外设,CPU子系统运行在CRun或者CSleep模式。
7 Z/ C4 h9 p$ C6 H$ g) \7 w, W
' q3 M6 a1 r  }3 ?+ |: R) B- t* {DStop:停机状态,D2域的总线矩阵时钟停止运行,CPU子系统没有在D2域分配外设,PDDS_D1位选择DStop模式。或者CPU子系统在D2域中有分配的外设,CPU子系统运行在CStop模式,PDDS_D1位选择DStop模式。: R8 F7 h. Y; l* \& [: ^1 d

  W& e" s" F6 pDStandby:待机状态,D2域的总线矩阵断电,CPU子系统没有在D2域分配外设,PDDS_D1位选择DStandby模式。或者CPU子系统在D2域中有分配的外设,CPU子系统运行在CStop模式,PDDS_D1位选择DStandby模式。7 q. q/ T% z; }+ G! M& c$ D

: e* t6 |6 }2 w/ t7 t  系统/D3域模式
" j  Y5 W% ]  }6 g; l9 {8 ARun:运行状态,系统时钟和D3域总线矩阵时钟处于运行状态。CPU子系统处于CRun和CSleep模式,或者一个唤醒信号处于激活状态。% p- j5 A' z8 G
) U2 x6 o8 v6 r9 h" M2 a9 x+ ?% i2 ?
Stop:停止状态,系统时钟和D3域总线矩阵时钟处于停止状态,CPU子系统处于CStop模式。所有的唤醒信号都处于非激活状态,并且至少某个域的一个PDDS_Dn位选择了Stop模式。: s% O; d& r! M
8 [/ X) g* X5 _2 h! }
Standby:待机状态,系统处于断电状态,CPU子系统处于CStop模式,所有的唤醒信号都处于非激活状态,并且所有域的所有PDDS_Dn位选择Standby模式。2 n" @1 T& p8 L3 Y; y" N5 j
$ S' H9 u1 t! C$ L
14.2.4 电源去耦电容的选择
9 Y* e5 G4 q7 Q1 d7 H& Z" M, u* ?每个电源对 (VDD/VSS, VDDA/VSSA ...)必须使用下述的滤波陶瓷电容去耦。这些电容必须尽量靠近芯片引脚,以确保器件正常工作。不建议去掉滤波电容来降低PCB 尺寸或成本,这可能导致器件工作不正常。
# C! c) W/ b2 L5 l& ?8 |* a* g
! b5 C4 I2 }' l9 j! v9 Q
9 ~8 o; A. J; X' L- ?4 S  C
+ ~) q, _! Q" u. b5 W  l& i
14.3 硬件复位
* I# R! l, W) f+ \4 s. a所有数字计算机系统都是由某种形式的震荡时钟电路驱动的。这种电路被称为系统的“脉搏”,是系统正确运行的关键。如果振荡器失灵,系统将完全无法运行,如果振荡器运行不规律,系统执行的所有与时间有关的计算都会有误差。( c: w1 M% o, y

3 ~7 W+ I/ a% W所有微控制器的启动流程都不通用。由于硬件的复杂性,必须运行一段由厂家定义的短小的“复位程序”来使硬件处于一种正确的状态,然后再开始执行用户程序。运行这个复位程序需要时间并且要求微控制器的振荡器已经运行。, t' q  f# M1 w3 Y" n

; f* Q( _# u3 z% q' g当系统由可靠的电源供电时,一旦通电,电源迅速地达到额定输出电压,一旦断电,电源迅速地下降到0V,并且在接通的时候,电压不会降低。这时能够可靠地使用基于一个电容和一个电阻的低成本硬件复位。这种形式的复位电路称为阻容复位。
; t, [5 P) ^, Y5 Z" l1 P+ k- `
0 |1 c; b2 N8 y1 O如果电源不够可靠,而涉及安全性,这种简单的阻容解决方案就不合适了。
( j) [- k$ h& D+ ^$ `' `$ Z7 q+ y
& D) O3 w* e6 q0 q) l* @* V2 Y& ~14.3.1 上电复位和手动复位

9 @7 g' k# q: N' ]STM32H7开发板的硬件复位原理图如下:
+ o3 t4 f: @, X* ]  X5 W
2 `4 d( x# U5 I
aHR0cHM6Ly9pbWcyMDE4LmNuYmxvZ3MuY29tL2Jsb2cvMTM3OTEwNy8yMDE5MDQvMTM3OTEwNy0yMDE5.png

+ G$ ~1 k, ?* h& ?1 e* \" l3 u/ \, _9 m4 `9 k3 @( P3 Y. J- x
  STM32这款CPU的复位引脚是低电平有效,即NRST为低电平时,CPU处于复位状态。
, R9 v5 ]* v# W6 X+ f  R173单的RC复位电路。当系统上电瞬间,C114电容两端电压可以认为是0,CPU处于复位状态。3.3V电源通过R173给C114充电,当C114的电压升到CPU的高电平门槛电压时,CPU退出复位状态转入运行状态。) ]% Z/ ?# `' D: I
  在设计电路时,需要选择适当的R值和C值,以保证NRST低电平持续时间满足CPU复位最小脉宽的要求。
. |' J8 T! J4 j! m4 T- ?$ c  当按下S4轻触开关时,C114两端被短路接地,可实现手动复位CPU。
- ~1 M4 B! s/ h( G: X3 N& \
$ n/ l3 v7 t& K2 `& t3 K( j14.3.2 复位序列! z9 Y  R% |& @+ g
前面第11章的13.3.1小节讲解了复位系列的相关知识,再结合本章节的上电复位和下电复位,大家会对其有一个较全面的认识,更多复位序列的知识直接看13.3.1小节即可。2 y* R  G+ c. b" W

2 o' l- `/ N0 `5 I/ h; e14.4 软件复位. U! f5 g! @2 x" }4 Q* y6 k
除了上电和手动复位,程序设计设置中还经常要用到软件复位,即调用一条函数就可以实现复位功能。此函数已经由CMSIS软件包中的core_cm7.h文件提供,函数如下:
" F0 I+ F& j" _9 x6 V6 ?, ?+ v- J5 |, I9 s/ L: y1 p
  1. /**$ i$ H7 ~$ H, O, b( e. |# j
  2.   \brief   System Reset* d: P4 e3 ^/ C3 F+ m" i0 J  C
  3.   \details Initiates a system reset request to reset the MCU.5 G& e+ ~! ^% c0 `9 u3 i
  4. */- s: V  b: m- M) k
  5. __STATIC_INLINE void __NVIC_SystemReset(void)7 k9 `) G1 K' j& [0 z9 P2 x: W) j
  6. {
    7 }' s3 L1 N* P; E
  7.   __DSB();                                  /* Ensure all outstanding memory accesses included
    2 i/ M; x9 h; c# y3 W: @5 p
  8.                                               buffered write are completed before reset */# \/ u& ~" Q: J  g
  9.   SCB->AIRCR  = (uint32_t)((0x5FAUL << SCB_AIRCR_VECTKEY_Pos)    |' l" S7 U" y7 i7 n, v. J
  10.                            (SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) |6 A9 @/ @& @. [9 `" z. l6 v/ v
  11.                             SCB_AIRCR_SYSRESETREQ_Msk    );        /* Keep priority group unchanged */7 J  y. z- ?2 O* o+ M4 w
  12.   __DSB();                                                         /* Ensure completion of memory access */- f# G7 Z% j; n" g7 Z7 J) |. ?

  13. ( m( U6 ~* A. T+ U" V
  14.   for(;;)                                                          /* wait until reset */
    3 _3 {% h% {. w
  15.   {
    9 R3 G7 V; m9 _; _/ q" A! v
  16.     __NOP();
    4 v& X- L& }# W8 _
  17.   }2 x: p7 E. z% j$ W
  18. }
复制代码

  v! Y* Q4 o2 T" `: w6 j9 ~" X软件复位反映到实际硬件上,就是给硬件复位部分发一个复位信号:/ i3 u" M) O! f& Q) s7 P

5 g& J7 R& \  |& |* h1 r) Y) _
aHR0cHM6Ly9pbWcyMDE4LmNuYmxvZ3MuY29tL2Jsb2cvMTM3OTEwNy8yMDE5MDQvMTM3OTEwNy0yMDE5.png

! x( M# `, J4 ?  m+ Z/ l, X' N7 j( i3 F9 Y) G+ |9 v
14.5 RCC时钟控制
! V; e  y, \* ?) W/ X5 |% fSTM32H7有如下六种时钟可供使用:
) i+ e& K) E& L! ^- o1 {
* |& k  C( N7 N8 o  HSI (High-speed internal oscillator) :/ F" N2 N6 Z! F7 ^- N  t
HSI是内部的高速RC振荡器,频率64MHz,可被用于系统时钟。优势是低成本,无需外部时钟,快速启动(仅需几个微秒),缺点是精度差,即使经过校准。
" ?7 K6 @9 \# Z! N. u7 d) Q! f  ?
  HSE (High-speed external oscillator):/ l7 m) f4 n( S; ~9 X  h( v
HSE是外部的高速振荡器,通过外接时钟源,有源或者无源晶振驱动,时钟范围4-48MHz。优势是精度高,缺点是增加成本。
, _; j% {0 O% A1 v' q9 B/ W5 i+ i3 }8 `* ?/ N: V' d$ p2 Z
  LSE (Low-speed external oscillator)* e' W" Z/ |4 a! v/ n
LSE是外部的低速振荡器,通过外接时钟源,有源或者无源晶振驱动,一般接32.768KHz,主要用于RTC实时时钟。! ]2 o1 K, J4 a- m1 Y

2 ^# y3 a, T/ R2 c  LSI (Low-speed internal oscillator)' b! E( Q$ k: {5 V
LSI是内部的低速RC振荡器,频率约是32KHz,主要用于独立看门狗和自动唤醒,也可以用于RTC实时时钟。
% l5 C6 n1 {' {2 |6 D9 @% o- i2 d
  CSI (Low-power internal oscillator)3 F6 S. }3 I9 o
CSI是内部的低速振荡器,频率约是4MHz,相比64MHz的HSI,主要用于低功耗。
% q7 J" C( f2 p9 s/ T
3 m% s! x# c9 n0 [+ J( `, |* F  HSI48 (High-speed 48 MHz internal oscillator)
6 F. T( @( F" T) h& J
HSI48是内部高速振荡器,频率约是48MHz,用于给特定的外设提供时钟,比如USB。& M0 q1 g) S4 r/ U/ M- Z) E. V

6 o/ |$ M4 n; F0 M0 f' N通过下面的时钟树再进一步的认识这几个时钟:
) X/ l7 {9 c; W9 F- A8 D9 P( r
! |8 ~# G6 M& F* A( a
aHR0cHM6Ly9pbWcyMDE4LmNuYmxvZ3MuY29tL2Jsb2cvMTM3OTEwNy8yMDE5MDQvMTM3OTEwNy0yMDE5.png
( @2 d: }/ c8 s" F% e

2 I5 e' I4 ?0 V7 e14.5.1 HSE和LSE硬件设计
1 P' U9 ~- l/ e HSE时钟
& z  q" E% K; i  ?: e% c当前V7开发板是用的25MHz晶振为HSE提供时钟,硬件设计如下:
6 p4 w8 c. e* X+ Q# @6 C
! T1 ?% K. U' W, w6 Z# N. O7 w
aHR0cHM6Ly9pbWcyMDE4LmNuYmxvZ3MuY29tL2Jsb2cvMTM3OTEwNy8yMDE5MDQvMTM3OTEwNy0yMDE5.png
+ B8 C9 s3 w3 G% M$ I( X) B9 Y" O
- l( {# T  }# T2 i* Y7 ~
晶振和负载电容需要尽可能近地靠近H7的晶振引脚,以减小输出失真和启动稳定时间。负载电容值必须根据选定的晶振进行调节。6 U  e. C' K' c

" }, R9 q% z. s. [) Q对于C15和C17,我们推荐使用高质量陶瓷电容,这种电容是设计用于需要高频率的场合,并且可以满足晶体或谐振器的需求。C15和C17通常具有相同的值。& W4 v: |3 ]. B# K

+ p7 {( |2 G% k4 k' ?这里再额外补充一个知识点,HSE旁路时钟和外置晶振区别:当前V7板子是采用的外置晶振模式,高速外部 (HSE) 时钟可以使用一个4到48MHz 的晶振 / 陶瓷谐振振荡器产生:- E. K9 H# x1 }0 ~" F) c

9 D5 V) h. H& [* M: }) {
aHR0cHM6Ly9pbWcyMDE4LmNuYmxvZ3MuY29tL2Jsb2cvMTM3OTEwNy8yMDE5MDQvMTM3OTEwNy0yMDE5.png
! F% T! g6 Y& L# G  t9 X% g/ b, r

+ d1 v* c0 D& w2 n$ X而bypass 旁路的意思就是不使用它,绕过它。具体到HSE旁路的话,用户直接提供4-50MHz的时钟源即可,可以使用有源晶振或者FPGA提供时钟等方式:
8 c; T5 {8 Q- e9 k
9 r& ~! C( J! f4 i8 t( a6 r
aHR0cHM6Ly9pbWcyMDE4LmNuYmxvZ3MuY29tL2Jsb2cvMTM3OTEwNy8yMDE5MDQvMTM3OTEwNy0yMDE5.png

3 Q. z# n1 M! q8 B" S
) K$ P; V) r: h! d3 @* G  F& }  LSE时钟( K: X) A( U  \! R$ I* s
当前V7开发板是用的32768Hz晶振为LSE提供时钟,硬件设计如下:; `9 y6 u- V3 n* }# g$ _

+ R% b; o& m  h  Q  L4 \
aHR0cHM6Ly9pbWcyMDE4LmNuYmxvZ3MuY29tL2Jsb2cvMTM3OTEwNy8yMDE5MDQvMTM3OTEwNy0yMDE5.png
" H; D/ ?* f& S* y/ F, h1 K& b7 W3 E
: U4 R0 w9 d) ]7 {1 n1 {8 D' `

# n3 H# |3 F. B6 \6 d& p8 F14.5.2 时钟配置
) }' E, p+ U/ v: lSTM32H7开发板使用的外部晶振频率是25MHz,下面分步说明如何让其通过这个频率工作到400MHz的主频。
5 ~, u! M# u: q3 W1 \, V: p0 s' K4 i% X3 \* A. @' }& o* @( ]# q
  第1步:在stm32h7xx_hal_conf.h文件配置HSE_VALUE( |' N8 _% p. f/ b: U* j* z
配置的大小要跟板子的实际晶振大小匹配。+ J' O" H" o/ c' l

& ]- z6 K( _7 U# j! R
  1. #if !defined (HSE_VALUE) $ b& Z, C' K; M% U* @
  2. #define HSE_VALUE ((uint32_t)8000000) /*!< Value of the External oscillator in Hz */
    # t7 d# ~' H$ Z2 U3 ~! S; Y* v7 Y: n
  3. #endif /* HSE_VALUE */
复制代码
7 u8 {  w9 G( b, P
  第2步:系统上电后,在启动文件startup_stm32h743xx.s的复位中断服务程序里面会调用函数SystemInit。1 U6 T7 o; E0 [* b6 i" z
  1. Reset_Handler    PROC
    1 W7 p/ I5 C1 V$ r' h( w8 f
  2.                  EXPORT  Reset_Handler                    [WEAK]
    % d4 c# G8 S8 ?4 ], l9 L2 l6 i& P
  3.         IMPORT  SystemInit7 i% F& ~  G0 v4 x" [, R' k4 {! e" K
  4.         IMPORT  __main! g( i4 I2 u& m/ n" m

  5. : t; W, D, I5 i1 R7 R  s! q. e5 X
  6.                  LDR     R0, =SystemInit& l$ t+ R: t& H- ?: v2 N7 a
  7.                  BLX     R0, @2 s! ^6 z7 H* I8 C; d0 v+ P$ v
  8.                  LDR     R0, =__main6 ]# d) n& e& X) M- @  Y$ e$ k
  9.                  BX      R0
    1 |  l% M6 G5 I0 z) u
  10.                  ENDP
复制代码

3 R4 X: }' J' ]9 Z. \0 h以往STM32F1和STM32F4系列都会在函数SystemInit里面配置PLL锁相环,使用了HAL后,需要在main函数里面配置。当前SystemInit函数实现的功能如下:/ t% E( V; v8 Y8 X$ g6 E- S5 l

6 D$ y- R3 n: K& |
  1. 1.        /**) r5 R- ~- C/ {1 b1 L( j6 W9 t7 m
  2. 2.          * @brief  Setup the microcontroller system
    ( j5 y$ b: O3 ^- @% s
  3. 3.          *         Initialize the FPU setting, vector table location and External memory, Y- D9 K3 A0 ?2 Q! Q* z. e3 b
  4. 4.          *         configuration./ V# ]9 m' ?: ]
  5. 5.          * @param  None& }: Z+ n3 c7 m  u' y" @: b
  6. 6.          * @retval None2 ~) L( b# r) G3 i: D# U
  7. 7.          */
    + a' h) j* l% a
  8. 8.        void SystemInit (void)
    $ `4 u' g  f3 t3 h) S
  9. 9.        {
    & O! }* X: l! S
  10. 10.          /* FPU settings ------------------------------------------------------------*/6 F9 K& y  C0 [
  11. 11.          #if (__FPU_PRESENT == 1) && (__FPU_USED == 1)
    ' z7 F9 P6 w* A# a$ @. p
  12. 12.            SCB->CPACR |= ((3UL << 10*2)|(3UL << 11*2));  /* set CP10 and CP11 Full Access */
    % R; z1 [( }, s4 W; u1 q8 p
  13. 13.          #endif# ]" P) Y- k) v. M
  14. 14.          /* Reset the RCC clock configuration to the default reset state ------------*/
      p, ^0 o6 a+ R8 W, L
  15. 15.          /* Set HSION bit */7 F+ Z; `' h6 W
  16. 16.          RCC->CR |= RCC_CR_HSION;
    3 m* x. l* X1 c; C) f
  17. 17.        + ^7 G: x/ h  v* h: ]7 I
  18. 18.          /* Reset CFGR register */  v! S" M+ X) S: m8 B1 A. E
  19. 19.          RCC->CFGR = 0x00000000;% _7 c: f$ K- [: U7 r
  20. 20.        
    # V# W9 |* v+ L7 K
  21. 21.          /* Reset HSEON, CSSON , CSION,RC48ON, CSIKERON PLL1ON, PLL2ON and PLL3ON bits */
    3 E) s* @& x4 Y
  22. 22.          RCC->CR &= (uint32_t)0xEAF6ED7F;6 J5 e6 _, e" g. a
  23. 23.        
    . G; x0 v! B/ q) ]2 F* K
  24. 24.          /* Reset D1CFGR register */6 X" b3 g! C/ h5 X3 R
  25. 25.          RCC->D1CFGR = 0x00000000;
    * V) R6 D. v& f& a: Z$ x! I8 S, X# F
  26. 26.        
    * l! Y7 N- A" q) h; o
  27. 27.          /* Reset D2CFGR register */
    6 G9 O; w8 ?* o; U- t
  28. 28.          RCC->D2CFGR = 0x00000000;* z, R) Q* j" W! v" p3 D1 O
  29. 29.        
    ) T/ |! L" m& [+ c4 o
  30. 30.          /* Reset D3CFGR register */& i1 w# ]+ R% _9 m: W+ @+ n: ?+ p! f
  31. 31.          RCC->D3CFGR = 0x00000000;1 P9 m7 {" p5 J8 m, C- b2 a
  32. 32.        ) r% R3 x8 q% O" v6 `. n. f+ ]
  33. 33.          /* Reset PLLCKSELR register */: e8 J- p; _  g# z" y( ]
  34. 34.          RCC->PLLCKSELR = 0x00000000;
    & y( U2 B3 c0 u
  35. 35.        ( H* L! _0 {7 p
  36. 36.          /* Reset PLLCFGR register */% e1 R' i) a# Y0 D+ g; l& a' _
  37. 37.          RCC->PLLCFGR = 0x00000000;
    7 ^  t& _% @6 z9 H/ k3 D7 {3 v
  38. 38.          /* Reset PLL1DIVR register */
    6 X( P8 ^4 [7 ]' b6 O
  39. 39.          RCC->PLL1DIVR = 0x00000000;3 i/ N& w; @  ~
  40. 40.          /* Reset PLL1FRACR register */0 a: C3 ~5 Z  a$ {& h: x
  41. 41.          RCC->PLL1FRACR = 0x00000000;4 r5 m4 d4 m& L( I# h& c+ x9 [
  42. 42.        
    ( _2 c5 v3 [: E$ P( P* w
  43. 43.          /* Reset PLL2DIVR register */
    ; f/ j, P' `. h$ O8 x6 z# t
  44. 44.          RCC->PLL2DIVR = 0x00000000;6 A# c0 P$ I( Z2 o, `& t! X
  45. 45.        
    7 I% Y' q% J4 b- P3 f3 G
  46. 46.          /* Reset PLL2FRACR register */6 O" a4 n& _# n) r, c/ ~1 `
  47. 47.        
    & u' n. D8 O7 W+ c+ ]. E1 \
  48. 48.          RCC->PLL2FRACR = 0x00000000;
    8 _* c! ]4 i* n9 a7 }1 s9 b( d3 L3 s8 }+ x
  49. 49.          /* Reset PLL3DIVR register */$ w* E; {1 Q/ B" ?
  50. 50.          RCC->PLL3DIVR = 0x00000000;4 [; f% l, K# K" o' r7 F
  51. 51.        . m3 P6 R. y  V' e- H) r7 L/ [; _
  52. 52.          /* Reset PLL3FRACR register */1 n9 u% f9 V* n0 j- W5 f0 x
  53. 53.          RCC->PLL3FRACR = 0x00000000;; {1 Q" j; W( U" z/ d  X; {% d
  54. 54.        . ]1 I4 X9 P# ~/ M. G' C; S0 }1 Y$ Q
  55. 55.          /* Reset HSEBYP bit */
    * u) z0 ~7 V" x8 S/ X8 P8 c
  56. 56.          RCC->CR &= (uint32_t)0xFFFBFFFF;8 O- a3 M+ T( ^  ?9 C# ~
  57. 57.        3 Q- y2 H( B1 K0 v
  58. 58.          /* Disable all interrupts */
    8 D2 ^1 W1 a! A% P& _& E  p
  59. 59.          RCC->CIER = 0x00000000;) `( Z* i" a4 S2 n+ c, V4 R3 S$ A
  60. 60.        ! E1 b4 y7 ]. W5 k) M% e
  61. 61.          /* Change  the switch matrix read issuing capability to 1 for the AXI SRAM target (Target 7) */2 p# Z* _3 G$ C1 _% {7 s
  62. 62.          *((__IO uint32_t*)0x51008108) = 0x00000001;. j0 @' K0 Y" l3 `
  63. 63.        / x+ d) @) R# X% ]; d. v1 K
  64. 64.        #if defined (DATA_IN_ExtSRAM) || defined (DATA_IN_ExtSDRAM)
    ) E& E# E8 {# k
  65. 65.          SystemInit_ExtMemCtl();
    1 Q  {- d# r$ s$ S
  66. 66.        #endif /* DATA_IN_ExtSRAM || DATA_IN_ExtSDRAM */
    & T! k" X  E7 W) r& U; r
  67. 67.        
    6 i0 v3 ^/ A+ M$ B1 b8 I
  68. 68.          /* Configure the Vector Table location add offset address ------------------*/
    2 d; N$ f8 P3 A
  69. 69.        #ifdef VECT_TAB_SRAM
    + J9 B" m; _1 L% F  T9 B
  70. 70.          SCB->VTOR = D1_AXISRAM_BASE  | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal ITCMSRAM */
    7 K1 E# G/ r5 m3 @. q/ ^' p3 D
  71. 71.        #else
    . G/ M/ ?; N- E$ `" X: G$ i& \
  72. 72.          SCB->VTOR = FLASH_BANK1_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal FLASH */+ B: l, w6 [+ Z- \0 ^# f& |( t+ V
  73. 73.        #endif
    + `' n1 c7 ]$ u" |& _$ |0 V
  74. 74.        
    1 x9 ~  q! V. |
  75. 75.        }
复制代码
% K4 d! U- Z2 c6 h! ^; c* H
第12行:使能FPU单元。3 n, s/ `, I& k9 x' E
. u9 j7 U, h& v( k2 w, i, g. i5 E- \$ V
第16 – 59行:复位RCC相关寄存器。
/ E6 K( n) M' ?& e5 y- }
  z5 Q3 `1 m7 G" V3 l+ X8 R) h7 p第69 – 73行:设置中断向量表的位置。* x) ^5 g2 w% w5 D( G
  U* I" \) Z. W: }2 T, s. d
  第3步:在main函数的外设驱动初始化函数里面完成时钟初始化,主要是PLL锁相环,让芯片最终工作到400MHz。3 q5 d% X1 d+ a+ v* d
14.6 总结
9 p" v, f0 J% x, X# H本章节就为大家讲解这么多,本章节的知识点相对比较多,比较杂,不容易一下子都掌握了。随着后面章节的进行,还会深入的讲解这些知识点。
+ ]" w; S0 A5 `4 D; x; P+ m
6 f# I) v. R" E4 s8 Q
2 o* @- f9 z2 ?8 a0 q4 X8 E. K( o2 a. @% ]8 R8 A" e, u
aHR0cHM6Ly9pbWcyMDE4LmNuYmxvZ3MuY29tL2Jsb2cvMTM3OTEwNy8yMDE5MDQvMTM3OTEwNy0yMDE5.png
收藏 1 评论0 发布时间:2021-12-20 17:00

举报

0个回答
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版