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

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

[复制链接]
STMCU小助手 发布时间:2021-10-29 23:26
14.1 初学者重要提示! d4 a1 V$ n; j5 I4 A) n  ^# V
1、  电源管理部分涉及到的各种低功耗方式会在后面章节中为大家讲解,当前阶段仅需了解低功耗属于电源管理部分即可。
9 E& f0 L0 W: I$ d7 S7 S
4 \8 i9 l" Y# i2、  电源管理部分最繁琐的就是CPU,D1,D2,D3域的各种运行,待机,停机状态切换,这部分知识点也放在后面低功耗章节学习。; a& F0 @( M# o8 ?. H2 j8 m1 `
0 u5 o$ P' m8 o7 f1 E
14.2 电源/ I- z, O8 Q& D* |& I2 x
电源是系统稳定运行的根本,主要分为以下几个知识点,电源供电、供电监控、电源管理和低功耗。当前阶段主要了解电源供电和硬件上电时序。
4 N' U: E* M6 Q
+ R$ u" p' C2 H$ P( T14.2.1 电源供电0 _- s. N1 s) V$ U. R* U
学习STM32H7的电源供电,往往被一堆电源标识Vdd,Vdda,Vcap,Vss等搞迷糊,这些标识整明白了,电源供电部分也就理解了,首先看下面的框图:
) n* V( ~+ q' v) S+ R4 c
! ^8 f; m4 F1 A# j
aHR0cHM6Ly9pbWcyMDE4LmNuYmxvZ3MuY29tL2Jsb2cvMTM3OTEwNy8yMDE5MDQvMTM3OTEwNy0yMDE5.png
" O+ G; L$ C2 g* O0 a& \. I
* p  |5 ^7 [; T( i) k1 k
这些常用标识的解释如下:
7 t( t' z+ n. P, |, m( a: V7 T
. F+ A: U! ~1 M
aHR0cHM6Ly9pbWcyMDE4LmNuYmxvZ3MuY29tL2Jsb2cvMTM3OTEwNy8yMDE5MDQvMTM3OTEwNy0yMDE5.png
+ A" `7 }7 Z  O% m
4 ?  ]" Q. d# [0 r; z* W
对于电源供电部分了解了这些知识点就够用。+ ?8 r( _$ X* t+ q! R$ X" o5 Y

1 _8 S* z( k! \3 ^* Y* c& V3 T$ Q14.2.2 系统上电启动
& a; Q' C3 m: H: d$ H系统上电到程序开始运行期间,H7都做哪些工作,一张时序图可以说明问题:
2 o! D9 |' P- J/ l& g( w4 [1 u& }# h" t9 b! P8 n( d
aHR0cHM6Ly9pbWcyMDE4LmNuYmxvZ3MuY29tL2Jsb2cvMTM3OTEwNy8yMDE5MDQvMTM3OTEwNy0yMDE5.png
6 S, @& p! w1 f7 \0 q
" r( Y2 b4 p% l- C0 o( L
对于上面的截图,主要看Operating mode部分,依次是Power down –> Reset -> Wait Oscillator ->HW system init -> Run -> Wait ACTVOS RDY –> Run,即断电状态 -> 复位状态 -> 等待HSI就绪->硬件初始化 -> 运行 -> 等ACTVOS位就绪 -> 正式运行。
2 H1 Q2 k( S8 p8 I2 M  n4 c( j- z2 x2 E% g  U0 M- H
详细些的执行流程如下:
4 B" h; a* U% S9 I! o& j% x. P6 b0 z
  当系统上电后,POR(Power on reset 上电复位)会检测VDD供电,当VDD大于POR设置的阀值时,将使能电压稳压器,注意看VDD那条线的变化。
( R! Y6 L- W* C1 [& Q  看VCORE那条曲线,只要VOSRDY未就绪,就会一直处于复位状态。
9 }4 P7 c& _4 G0 ^: W' ^0 Y9 w7 P  一旦VCORE正常输出,系统将走出复位状态,内部高速RC振荡器HSI将使能。
6 {! X$ o) u# S- Z: \6 j* r  HSI稳定后,将开始系统初始化,主要是Flash和可选字节的加载,这些都是由硬件完成的,CPU也将以受限的方式运行(主要是指不允许对RAM进行写操作)。
8 ]+ v+ O2 S' O  软件程序初始化系统,包括供电配置。当供电配置完成后,等待ACTVOSRDY位置1,完成置1后,CPU就进入正常的运行的模式,允许读写RAM了。7 L) Q' [+ l1 S2 Z
14.2.3 电源管理1 y* M) f+ ?8 T: L1 d8 e! G
关于电源管理部分,H7参考手册中讲解的还挺复杂的,当前阶段我们仅需了解几个重要的工作状态即可,看到这几个单词了要认识,因为官方文档中多处要用这几个标识。
1 S8 ^. K7 ?7 W( A3 S+ G- R, Z
! x! o$ Y1 t- i" _为了实现各种低功耗模式,CPU和D1,D2,D3域支持的各种模式如下:
+ J9 n! P6 d9 n- c1 k( q5 }5 a3 h; L! z3 p% r# h# q
  CPU模式
0 \/ r8 a9 N8 B4 u+ R+ VCRun:运行状态,CPU和CPU子系统外设正常运行。
; q/ N8 x6 X8 S; R( Q7 O# Q5 Q1 r5 I+ g! e  L5 N3 @
CSleep:休眠状态,CPU时钟停止运行,CPU子系统外设正常运行。
  J/ h' n! C# A% `2 ]7 {) D3 L
7 E* t1 G# U# H) r9 b- Y7 h' ]CStop:停止状态,CPU和CPU子系统外设都停止运行。
6 n5 q1 f1 I  a7 R! g  y: m3 @) T# ^6 U6 x+ C
  D1域模式" z/ T. U7 \0 u9 Q
DRun:运行状态,D1域的总线矩阵正常运行,CPU子系统运行在CRun或者CSleep模式。
' n9 V, q: \; k
5 ]& Q3 _, _5 @2 T8 yDStop:停机状态,D1域的总线矩阵时钟停止运行,CPU子系统运行在CStop模式,PDDS_D1位选择DStop模式。
) f% }& K1 G, U
4 J: H. G  g* l) T8 F# u; DDStandby:待机状态,D1域的总线矩阵断电,CPU子系统运行在CStop模式,PDDS_D1位选择DStandby模式。
6 E8 x$ a  [. y. i; r
1 B0 a( T, o1 ~: z+ z; t7 }  D2域模式2 e( w% W' o* _4 q
DRun:运行状态,D2域的总线矩阵正常运行,CPU子系统在D2域中有分配的外设,CPU子系统运行在CRun或者CSleep模式。
, u; C; |' z  z3 k0 Z7 \+ N9 @! l, L, f1 b8 P5 q. \- S
DStop:停机状态,D2域的总线矩阵时钟停止运行,CPU子系统没有在D2域分配外设,PDDS_D1位选择DStop模式。或者CPU子系统在D2域中有分配的外设,CPU子系统运行在CStop模式,PDDS_D1位选择DStop模式。
' l$ r. @4 W- n
. r' m, q; w3 U% KDStandby:待机状态,D2域的总线矩阵断电,CPU子系统没有在D2域分配外设,PDDS_D1位选择DStandby模式。或者CPU子系统在D2域中有分配的外设,CPU子系统运行在CStop模式,PDDS_D1位选择DStandby模式。7 G4 H/ \& \' h1 X
9 J3 E4 c1 V4 O
  系统/D3域模式9 b/ f! N3 q+ Z) E! _8 W' \3 i+ J- {
Run:运行状态,系统时钟和D3域总线矩阵时钟处于运行状态。CPU子系统处于CRun和CSleep模式,或者一个唤醒信号处于激活状态。/ M; z& Y9 H! B8 J
1 b, D. X- x" V3 A1 _
Stop:停止状态,系统时钟和D3域总线矩阵时钟处于停止状态,CPU子系统处于CStop模式。所有的唤醒信号都处于非激活状态,并且至少某个域的一个PDDS_Dn位选择了Stop模式。. a* d5 l6 y6 ^2 _! G& d6 F
# F! [( ~( d1 ~, A, m* j7 B
Standby:待机状态,系统处于断电状态,CPU子系统处于CStop模式,所有的唤醒信号都处于非激活状态,并且所有域的所有PDDS_Dn位选择Standby模式。/ d5 z5 q! l! r  X  f0 D  e

9 M. v! n: h4 |  ]: ?2 e( o$ T4 x14.2.4 电源去耦电容的选择
4 U/ i+ }% R$ p8 S1 O/ L, D/ m每个电源对 (VDD/VSS, VDDA/VSSA ...)必须使用下述的滤波陶瓷电容去耦。这些电容必须尽量靠近芯片引脚,以确保器件正常工作。不建议去掉滤波电容来降低PCB 尺寸或成本,这可能导致器件工作不正常。 $ \0 I' x7 ]/ Q$ d
- B  @0 L* d4 L- G# g3 S% x0 ]9 H, a
aHR0cHM6Ly9pbWcyMDE4LmNuYmxvZ3MuY29tL2Jsb2cvMTM3OTEwNy8yMDE5MDQvMTM3OTEwNy0yMDE5.png
: d2 e4 I3 g  ^* N$ ?
9 g- [7 I. e) D5 u8 P% d
14.3 硬件复位6 K5 L7 D. c; ^) S. j& P7 J" ]% u
所有数字计算机系统都是由某种形式的震荡时钟电路驱动的。这种电路被称为系统的“脉搏”,是系统正确运行的关键。如果振荡器失灵,系统将完全无法运行,如果振荡器运行不规律,系统执行的所有与时间有关的计算都会有误差。
4 u0 K( Z+ l" e/ i2 |4 j. C9 q( R2 ]/ O6 ~6 N
所有微控制器的启动流程都不通用。由于硬件的复杂性,必须运行一段由厂家定义的短小的“复位程序”来使硬件处于一种正确的状态,然后再开始执行用户程序。运行这个复位程序需要时间并且要求微控制器的振荡器已经运行。* j' B/ h/ e% _$ F8 M
/ l7 [% }. h1 G! p- O9 M
当系统由可靠的电源供电时,一旦通电,电源迅速地达到额定输出电压,一旦断电,电源迅速地下降到0V,并且在接通的时候,电压不会降低。这时能够可靠地使用基于一个电容和一个电阻的低成本硬件复位。这种形式的复位电路称为阻容复位。
4 z( I/ }* q$ n* i/ b8 j8 `) U6 a9 O& B2 z8 i5 O
如果电源不够可靠,而涉及安全性,这种简单的阻容解决方案就不合适了。1 Q/ x( V. E, t; u4 U3 r# O
0 b3 T% U1 L. R( Q( ?+ _$ D! w( \! Y
14.3.1 上电复位和手动复位
( h. e7 H% X) u4 aSTM32H7开发板的硬件复位原理图如下:
+ M( z3 J3 ?# C& n& |
( X9 ~) L& _) r. m
aHR0cHM6Ly9pbWcyMDE4LmNuYmxvZ3MuY29tL2Jsb2cvMTM3OTEwNy8yMDE5MDQvMTM3OTEwNy0yMDE5.png
# }% w8 H3 L1 j( ?( t& V- E
, |8 ~' h' R0 L) D
  STM32这款CPU的复位引脚是低电平有效,即NRST为低电平时,CPU处于复位状态。" ?5 z6 i! T7 Q/ G: Y2 b# h
  R173单的RC复位电路。当系统上电瞬间,C114电容两端电压可以认为是0,CPU处于复位状态。3.3V电源通过R173给C114充电,当C114的电压升到CPU的高电平门槛电压时,CPU退出复位状态转入运行状态。* {( r  o7 O# P4 c7 |& i) L5 f" X0 S
  在设计电路时,需要选择适当的R值和C值,以保证NRST低电平持续时间满足CPU复位最小脉宽的要求。
% R' s8 y, y; G) s3 }  当按下S4轻触开关时,C114两端被短路接地,可实现手动复位CPU。
+ M3 b4 z5 V5 Z+ e% S) l& \- w( q. N9 v

; E' m1 m! _+ O1 j6 U: S. B注,根据需要,大家也可以使用STM32H7 NRST引脚的内部上拉
# m4 l: T8 K  {6 k2 _0 T# w8 F& J, u5 K. y: a4 k& G: b" {' f
14.3.2 复位序列3 D& c2 Z7 l& H7 F/ o
前面第11章的13.3.1小节讲解了复位系列的相关知识,再结合本章节的上电复位和下电复位,大家会对其有一个较全面的认识,更多复位序列的知识直接看13.3.1小节即可。
# H$ k: p5 U* j( M: T- r$ B- o2 P; x( _, x
14.4 软件复位
4 L+ J, }7 W% f+ Y除了上电和手动复位,程序设计设置中还经常要用到软件复位,即调用一条函数就可以实现复位功能。此函数已经由CMSIS软件包中的core_cm7.h文件提供,函数如下:# n! e& b: z2 @6 ^* [  p3 t
( T0 y6 Y+ t5 z6 Y1 G9 m# ]$ ]% ?2 Q8 H
  1. /**
    & t: r8 Q$ E% z" F
  2.   \brief   System Reset
    & N9 b5 y' f6 M
  3.   \details Initiates a system reset request to reset the MCU.
    , Y+ K0 {& ]; J: a) u4 x  k0 F
  4. */( w. j9 l" A  ?6 W5 G/ L5 m" N
  5. __STATIC_INLINE void __NVIC_SystemReset(void)
    / @9 X3 l2 ]  {' m$ N
  6. {  K, P) r6 |3 M
  7.   __DSB();                                  /* Ensure all outstanding memory accesses included% ]( v! ^; Y- i: M2 v: t
  8.                                               buffered write are completed before reset */. H) u3 t: p8 i3 _* ]% ]9 J! E
  9.   SCB->AIRCR  = (uint32_t)((0x5FAUL << SCB_AIRCR_VECTKEY_Pos)    |
    ' Q4 Y6 V; I& x, Z. z/ |1 R
  10.                            (SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) |3 I- Q9 c" F; X) u/ p) O( k
  11.                             SCB_AIRCR_SYSRESETREQ_Msk    );        /* Keep priority group unchanged */6 y; l3 B: j, F& ]& I4 D* l
  12.   __DSB();                                                         /* Ensure completion of memory access */! d* e/ [- k4 i0 T. t+ j
  13. # I- \: {! u) r, ?
  14.   for(;;)                                                          /* wait until reset */* \3 ~% U; I3 M+ m
  15.   {
    & r% x+ A( n+ f$ w
  16.     __NOP();9 I9 V' G% d9 A) Y
  17.   }7 z  k# Z1 I, B* s: D- R, }
  18. }
复制代码

3 g4 G+ c( \6 k9 @- ?+ B) i软件复位反映到实际硬件上,就是给硬件复位部分发一个复位信号:
+ ~' |+ b0 H, g7 e7 C/ r- O& V$ C4 }
aHR0cHM6Ly9pbWcyMDE4LmNuYmxvZ3MuY29tL2Jsb2cvMTM3OTEwNy8yMDE5MDQvMTM3OTEwNy0yMDE5.png

' ?5 T, {$ q, g5 E4 f' U1 i' |3 v' Q
14.5 RCC时钟控制
5 E( T1 j4 T5 pSTM32H7有如下六种时钟可供使用:- {6 \) b  q& J0 q4 ~
& a" M- l# v& E" l! H. f3 g
  HSI (High-speed internal oscillator) :: u+ i  e: Q6 Q  M
HSI是内部的高速RC振荡器,频率64MHz,可被用于系统时钟。优势是低成本,无需外部时钟,快速启动(仅需几个微秒),缺点是精度差,即使经过校准。$ |) B7 k8 o( T8 U5 ~1 J3 q" R

) u9 n8 ?4 ?. y/ p6 s2 \  HSE (High-speed external oscillator):- ]- j, \' F6 q3 @  }4 T
HSE是外部的高速振荡器,通过外接时钟源,有源或者无源晶振驱动,时钟范围4-48MHz。优势是精度高,缺点是增加成本。
/ t7 `7 G# a4 R. ~' ?. v2 P, e2 n/ [% ~
  LSE (Low-speed external oscillator)
% U! [- x( M% e: A" ULSE是外部的低速振荡器,通过外接时钟源,有源或者无源晶振驱动,一般接32.768KHz,主要用于RTC实时时钟。
6 \$ D. w9 ~5 H9 C) X7 M) H+ u( S& `% U/ P3 X) }/ |
  LSI (Low-speed internal oscillator)
* P9 a' _+ |  w4 h, ?LSI是内部的低速RC振荡器,频率约是32KHz,主要用于独立看门狗和自动唤醒,也可以用于RTC实时时钟。
, N4 Z% m+ X+ \# B; q, b, e& R1 }: C8 [- n6 ]
  CSI (Low-power internal oscillator)) H/ F+ D- n, I* m. o1 m
CSI是内部的低速振荡器,频率约是4MHz,相比64MHz的HSI,主要用于低功耗。
1 ~# Z4 n+ n4 I' M% P5 P
( \; @8 h$ m6 F9 y3 Q  {  HSI48 (High-speed 48 MHz internal oscillator)1 O# M. k; ?# x. a7 L6 Q2 k. z
HSI48是内部高速振荡器,频率约是48MHz,用于给特定的外设提供时钟,比如USB。
1 l6 I3 s$ K! U; \4 a, @  l& U
  x2 f: ^! v+ Y. P& M& R# ~% w通过下面的时钟树再进一步的认识这几个时钟:1 s; w) U2 \9 ~
, I2 H+ E! W& [7 f0 v6 M6 Q
aHR0cHM6Ly9pbWcyMDE4LmNuYmxvZ3MuY29tL2Jsb2cvMTM3OTEwNy8yMDE5MDQvMTM3OTEwNy0yMDE5.png
' V5 T6 Q2 H! O! k1 g
" m, a/ m% k, P/ s: O/ ~8 p
14.5.1 HSE和LSE硬件设计
: b8 z0 b. H8 f+ d1 [; v# z  HSE时钟
. c3 c, v7 z/ m( @- V当前V7开发板是用的25MHz晶振为HSE提供时钟,硬件设计如下:) n6 W" R+ N$ B

% ?* D- e2 w+ ]# \& f6 ]; }
aHR0cHM6Ly9pbWcyMDE4LmNuYmxvZ3MuY29tL2Jsb2cvMTM3OTEwNy8yMDE5MDQvMTM3OTEwNy0yMDE5.png

- e! m& o, m9 ~; g7 y# Z5 V2 N4 X6 w; ]6 k9 z- X
晶振和负载电容需要尽可能近地靠近H7的晶振引脚,以减小输出失真和启动稳定时间。负载电容值必须根据选定的晶振进行调节。: N: ~; ~1 U8 u8 m! U6 o
. s. o- h) G1 V8 a8 Q8 O
对于C15和C17,我们推荐使用高质量陶瓷电容,这种电容是设计用于需要高频率的场合,并且可以满足晶体或谐振器的需求。C15和C17通常具有相同的值。. W2 m' G3 H# K* C0 h  O

1 m% I6 @0 O+ n, c/ d* v! z5 v这里再额外补充一个知识点,HSE旁路时钟和外置晶振区别:当前V7板子是采用的外置晶振模式,高速外部 (HSE) 时钟可以使用一个4到48MHz 的晶振 / 陶瓷谐振振荡器产生:
0 M6 m1 u! U* h; V3 T% L' A! j8 Y2 |" m9 y. {
aHR0cHM6Ly9pbWcyMDE4LmNuYmxvZ3MuY29tL2Jsb2cvMTM3OTEwNy8yMDE5MDQvMTM3OTEwNy0yMDE5.png

8 N& U5 F6 y" \; ?2 K" G6 h/ k* }# R" |& z
而bypass 旁路的意思就是不使用它,绕过它。具体到HSE旁路的话,用户直接提供4-50MHz的时钟源即可,可以使用有源晶振或者FPGA提供时钟等方式:) U! Z' _# O: U1 _
% R: ~2 {- p$ j& `$ U# P: g
aHR0cHM6Ly9pbWcyMDE4LmNuYmxvZ3MuY29tL2Jsb2cvMTM3OTEwNy8yMDE5MDQvMTM3OTEwNy0yMDE5.png
5 L' ~) }7 g; ?. T

' Y  p' Q5 k: G4 n0 s* ~6 x  LSE时钟
" p" @. A, t6 T" ^当前V7开发板是用的32768Hz晶振为LSE提供时钟,硬件设计如下:
8 N3 l, @, b; @9 \8 a5 u' S
. C" C. n. q+ Y
aHR0cHM6Ly9pbWcyMDE4LmNuYmxvZ3MuY29tL2Jsb2cvMTM3OTEwNy8yMDE5MDQvMTM3OTEwNy0yMDE5.png
4 Y; A- e+ c0 g+ ]. R+ I8 {: L
; ~3 R- @4 \3 `8 @
STM32的LSE晶振起振难(又称RTC起振)是老毛病了,选取晶振和配套电容比较讲究,最好按照ST提供的厂家和配套电容选取。& W0 D( M) }% B* Y+ C
6 I% h- x& m4 `8 L& p! x
14.5.2 时钟配置6 t* B- ?; |; x
STM32H7开发板使用的外部晶振频率是25MHz,下面分步说明如何让其通过这个频率工作到400MHz的主频。& O8 W& u0 b. ^4 u5 C
, V0 F( `4 x$ y1 G; M9 g
  第1步:在stm32h7xx_hal_conf.h文件配置HSE_VALUE
; J3 [5 S/ u: s: J# U1 j配置的大小要跟板子的实际晶振大小匹配。9 m5 }. P7 F6 e# E
3 Z! Z- D* P/ p1 Q- V; o! D
  1. #if !defined (HSE_VALUE)
    8 B' C/ \; i' |& I4 Z$ q* N# v
  2. #define HSE_VALUE ((uint32_t)8000000) /*!< Value of the External oscillator in Hz */ & [. U4 J& G! K. q8 _
  3. #endif /* HSE_VALUE */
复制代码

0 l0 E, w7 ^1 B3 y  第2步:系统上电后,在启动文件startup_stm32h743xx.s的复位中断服务程序里面会调用函数SystemInit。
9 R  \6 }9 ^- B* p! `1 W
  1. Reset_Handler    PROC. a. j) y; s2 L
  2.                  EXPORT  Reset_Handler                    [WEAK]$ I! n+ g  O7 I7 ?! u
  3.         IMPORT  SystemInit
    $ T! E- K5 D1 r! T+ y
  4.         IMPORT  __main
    3 g% ~4 K, Z9 k" Q2 u

  5. ; ^- N, K# h+ X' T0 @# y
  6.                  LDR     R0, =SystemInit5 h0 i5 ~$ V% W* W, A/ L" D+ C
  7.                  BLX     R0
    0 I: R. h$ {3 f( a' {
  8.                  LDR     R0, =__main
    ) w* f$ T$ h4 U2 e# A) ]
  9.                  BX      R0% [% p5 m- p* O9 ~
  10.                  ENDP
复制代码
1 b. P' g* g: _0 b3 S$ v% F, X
以往STM32F1和STM32F4系列都会在函数SystemInit里面配置PLL锁相环,使用了HAL后,需要在main函数里面配置。当前SystemInit函数实现的功能如下:
1 o  x' \7 b8 U$ i3 A$ @; J  ]
' K/ q* ^/ d- ]4 K' }: n
  1. 1.        /**4 T) d3 V* T$ D. Y& H( _( E# w
  2. 2.          * @brief  Setup the microcontroller system. i, G4 y2 A; o4 l- Y2 i
  3. 3.          *         Initialize the FPU setting, vector table location and External memory
    6 N9 M& t) l7 o/ E  F
  4. 4.          *         configuration., y0 w& m; m* F9 d4 R, O; r$ j. Q
  5. 5.          * @param  None
    8 @- w# C! ?! s
  6. 6.          * @retval None4 [2 Q* B# ]# Y+ e; t5 e
  7. 7.          */5 |7 m9 U* l9 j2 A5 f
  8. 8.        void SystemInit (void)6 f  N. C3 {" I. W; w
  9. 9.        {! ~- G6 y, E, p+ d9 K
  10. 10.          /* FPU settings ------------------------------------------------------------*/8 o! P% ~, f! }
  11. 11.          #if (__FPU_PRESENT == 1) && (__FPU_USED == 1)9 _1 c# M9 x3 C# I/ Y4 W* [; }' D# I
  12. 12.            SCB->CPACR |= ((3UL << 10*2)|(3UL << 11*2));  /* set CP10 and CP11 Full Access */, ~  u3 b  q) U, S9 X) h8 J/ `6 N
  13. 13.          #endif6 @9 q" E1 F0 |
  14. 14.          /* Reset the RCC clock configuration to the default reset state ------------*/9 v5 Z$ X- p" f  r6 Z* V
  15. 15.          /* Set HSION bit */
    ) W4 P$ m0 m, f# ]" [3 e
  16. 16.          RCC->CR |= RCC_CR_HSION;
    - a5 \2 z& j; C( L
  17. 17.        
    . [; s: s, b+ U0 S' p, |
  18. 18.          /* Reset CFGR register */; ?. e& F8 y5 p* I! N+ G- @
  19. 19.          RCC->CFGR = 0x00000000;$ m; s" g& G: C$ h% `. L6 ^8 m: O
  20. 20.        
    ' o% v4 e7 h3 j. P
  21. 21.          /* Reset HSEON, CSSON , CSION,RC48ON, CSIKERON PLL1ON, PLL2ON and PLL3ON bits */
    8 ~5 p& S' W# |. k7 x6 X/ L
  22. 22.          RCC->CR &= (uint32_t)0xEAF6ED7F;
    * s8 g2 U" _/ ?* Z
  23. 23.        
    ) U$ c: Z* N- v  c
  24. 24.          /* Reset D1CFGR register */
      Y+ C- W) y# i1 {0 `: `
  25. 25.          RCC->D1CFGR = 0x00000000;
    & }" X. X. s3 [9 |. A' A$ C0 I
  26. 26.        ' ?. L5 A, a  _' [
  27. 27.          /* Reset D2CFGR register */
    8 Z6 }) b! H5 s7 K% `- @
  28. 28.          RCC->D2CFGR = 0x00000000;9 ^- _0 n7 w3 ]5 y  [
  29. 29.        - Q9 @0 o! u) Z
  30. 30.          /* Reset D3CFGR register */
    ( z& S8 G- H$ D0 v) A/ M
  31. 31.          RCC->D3CFGR = 0x00000000;$ o" I! g- c2 k2 L% H6 p, ^
  32. 32.        0 X0 C$ V  ^8 o6 Q$ m  ]
  33. 33.          /* Reset PLLCKSELR register */3 e, H' t8 b$ D3 @
  34. 34.          RCC->PLLCKSELR = 0x00000000;
    ( U! f6 L/ X5 o8 l% N4 h% K
  35. 35.        
    , {7 j- Z* s( I7 \4 V6 H2 Z5 l
  36. 36.          /* Reset PLLCFGR register */& I) a$ Y% X% B: U( }
  37. 37.          RCC->PLLCFGR = 0x00000000;
    ! c0 F  |% w% O/ D+ u( _# t
  38. 38.          /* Reset PLL1DIVR register */9 h6 H3 ?, [' [% k$ u6 a
  39. 39.          RCC->PLL1DIVR = 0x00000000;& Y  J* u" }% [. j5 l2 Y
  40. 40.          /* Reset PLL1FRACR register */; x- T: h5 D7 j( w- Z# M
  41. 41.          RCC->PLL1FRACR = 0x00000000;# g0 T4 ~" l# f2 y' R0 M
  42. 42.        
    1 T$ w6 [# D2 B( g' v
  43. 43.          /* Reset PLL2DIVR register */
    9 C9 [, N0 k2 u$ s
  44. 44.          RCC->PLL2DIVR = 0x00000000;# q/ X+ p5 h% p$ J2 f! C3 q7 j
  45. 45.        
    7 {! \! a0 |. `; x  s5 f2 ~
  46. 46.          /* Reset PLL2FRACR register */
    8 N" l7 g' r9 C! i. U4 e
  47. 47.        
    1 d' M2 Z% }( c+ f- O
  48. 48.          RCC->PLL2FRACR = 0x00000000;
    7 J! j# X5 K/ ^" Z; S
  49. 49.          /* Reset PLL3DIVR register */
    , Q7 @. ^: s4 V$ Z
  50. 50.          RCC->PLL3DIVR = 0x00000000;0 E9 d/ ^/ v, A4 b- j" g
  51. 51.        
    : ?9 ^8 i% s9 a# i/ W
  52. 52.          /* Reset PLL3FRACR register */
    / ~! {- Q9 D% d$ i2 g9 U6 F  Z
  53. 53.          RCC->PLL3FRACR = 0x00000000;7 V6 h( ]' l) n5 k2 P% \
  54. 54.        1 }$ v4 e6 m8 d% }
  55. 55.          /* Reset HSEBYP bit */4 ?" w( x/ h8 ?3 w, P
  56. 56.          RCC->CR &= (uint32_t)0xFFFBFFFF;
    & _  O' `7 a% z) Q
  57. 57.        % ?+ v% F' M0 @
  58. 58.          /* Disable all interrupts */
    : `, q2 m& w' Z& J- h: Q
  59. 59.          RCC->CIER = 0x00000000;
    3 a( ], s; T) H) F
  60. 60.        
    0 y. v' C7 f# n; f' ?- O
  61. 61.          /* Change  the switch matrix read issuing capability to 1 for the AXI SRAM target (Target 7) */0 u: o* T% U1 i% M. A/ m5 [, F
  62. 62.          *((__IO uint32_t*)0x51008108) = 0x00000001;1 f  @# e, `1 `. {# A0 L1 C  X
  63. 63.        
    ; P8 G2 {$ C4 i1 W
  64. 64.        #if defined (DATA_IN_ExtSRAM) || defined (DATA_IN_ExtSDRAM)4 O! g! s7 h# P+ K# T9 X' {* q( }
  65. 65.          SystemInit_ExtMemCtl();0 Y9 X2 g7 F7 R. }2 G
  66. 66.        #endif /* DATA_IN_ExtSRAM || DATA_IN_ExtSDRAM */
    ( M. v: S) H  @9 v8 X/ B
  67. 67.        
    " w: Y6 o; A# b* K. \$ Z. W
  68. 68.          /* Configure the Vector Table location add offset address ------------------*/- B5 L: K! H! z0 w: _; p
  69. 69.        #ifdef VECT_TAB_SRAM6 E3 W' {' A0 W5 P8 Z  f9 Y
  70. 70.          SCB->VTOR = D1_AXISRAM_BASE  | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal ITCMSRAM */
    % G' s" b: {4 q8 T0 S
  71. 71.        #else" f9 S+ \' l, Q9 a) B
  72. 72.          SCB->VTOR = FLASH_BANK1_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal FLASH */
    2 t. J2 i3 z$ t+ a2 W* I
  73. 73.        #endif
    $ Q- X6 b# M# _: W$ g6 s
  74. 74.        
    ' ?7 f3 d. h! e: c( Q
  75. 75.        }
复制代码
( s: K; I' h; o2 t8 i7 J, ~
第12行:使能FPU单元。
4 a$ y: ]+ E1 v- ^( X4 Z+ i7 O' C( `! s9 Y+ Q- _/ _
第16 – 59行:复位RCC相关寄存器。
7 n+ a2 n  M4 q( H: k1 o
0 `; d4 l) W" X+ M, k第62行:这条语句在这里的作用涉及到STM32H7硬件版本Y的一个bug解决方案。$ a: P0 B: `* W: e
9 O& B* r0 E, L
第69 – 73行:设置中断向量表的位置。
0 |8 m1 H9 P2 p2 Z, N  S5 ^0 @7 K2 O! [/ ]6 Q
第3步:在main函数的外设驱动初始化函数里面完成时钟初始化,主要是PLL锁相环,让芯片最终工作到400MHz。
. T6 d) T( L  v& l14.6 总结
8 A) Q2 o8 n5 E6 S本章节就为大家讲解这么多,本章节的知识点相对比较多,比较杂,不容易一下子都掌握了。随着后面章节的进行,还会深入的讲解这些知识点。- l% {% P3 P0 J# R; _( a) l" a, ~7 Y  ]

  U- c2 h2 {4 {
+ A# |& ~  @! r) T, `5 E$ Y. k0 X) H4 I7 E" c, ~7 ~  f* ?

1 R3 t! Y4 @3 [$ ~7 q# t7 H" Q, j
赞 收藏 评论0 发布时间:2021-10-29 23:26

举报

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