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

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

[复制链接]
STMCU小助手 发布时间:2021-12-20 17:00
14.1 初学者重要提示2 C  v9 n( N( E5 t
1、  电源管理部分涉及到的各种低功耗方式会在后面章节中为大家讲解,当前阶段仅需了解低功耗属于电源管理部分即可。
4 e; n$ ]$ {: r& y
& u+ o5 X* Z0 e2、  电源管理部分最繁琐的就是CPU,D1,D2,D3域的各种运行,待机,停机状态切换,这部分知识点也放在后面低功耗章节学习。
% h0 F2 q" G6 o) A; p8 h! g
/ l6 R4 I. A6 I+ N14.2 电源
1 t% _9 _3 n) K# \0 z电源是系统稳定运行的根本,主要分为以下几个知识点,电源供电、供电监控、电源管理和低功耗。当前阶段主要了解电源供电和硬件上电时序。
9 z3 M1 ^/ `8 M) ]& t( Z3 m. p
/ w8 t6 ^4 N, q9 x0 `- _( P% }; R14.2.1 电源供电
3 `/ G$ V% T5 B. }# ?学习STM32H7的电源供电,往往被一堆电源标识Vdd,Vdda,Vcap,Vss等搞迷糊,这些标识整明白了,电源供电部分也就理解了,首先看下面的框图:$ o# F! X& M8 v, ]6 [# \
. J& u- Y; q! P4 m* S
aHR0cHM6Ly9pbWcyMDE4LmNuYmxvZ3MuY29tL2Jsb2cvMTM3OTEwNy8yMDE5MDQvMTM3OTEwNy0yMDE5.png
# Z2 }7 h% H* A
2 G/ m' j+ D: ^8 e9 v
这些常用标识的解释如下:' O& ~. E( X8 \% F

; V0 j7 {' m, |6 B
aHR0cHM6Ly9pbWcyMDE4LmNuYmxvZ3MuY29tL2Jsb2cvMTM3OTEwNy8yMDE5MDQvMTM3OTEwNy0yMDE5.png
0 V* ]1 B$ }9 b5 a3 I6 A( \

4 f# C# l3 E% Z) N对于电源供电部分了解了这些知识点就够用。
: `4 Y( b. k4 `  x* {* h1 X- T( W% E: j% w
14.2.2 系统上电启动
4 [# @  U" C" d系统上电到程序开始运行期间,H7都做哪些工作,一张时序图可以说明问题:! N) U/ ]7 ~* O' c' o- W

, L' c3 W3 c/ ^
aHR0cHM6Ly9pbWcyMDE4LmNuYmxvZ3MuY29tL2Jsb2cvMTM3OTEwNy8yMDE5MDQvMTM3OTEwNy0yMDE5.png

8 ^5 s- E' ~+ Z( `
  i9 k# M- q& t' A# w# n对于上面的截图,主要看Operating mode部分,依次是Power down –> Reset -> Wait Oscillator ->HW system init -> Run -> Wait ACTVOS RDY –> Run,即断电状态 -> 复位状态 -> 等待HSI就绪->硬件初始化 -> 运行 -> 等ACTVOS位就绪 -> 正式运行。3 E# ~; W3 W7 A: u0 ^' ]! b

( `! x) O( A( R" D; ~详细些的执行流程如下:+ q4 w, l; b9 c" K! L
" r$ D, h: e, |0 C* `, P0 w. v
  当系统上电后,POR(Power on reset 上电复位)会检测VDD供电,当VDD大于POR设置的阀值时,将使能电压稳压器,注意看VDD那条线的变化。  I4 J5 n3 `6 ]& {0 O+ d: c1 U
  看VCORE那条曲线,只要VOSRDY未就绪,就会一直处于复位状态。6 M. t3 A4 r& K) c8 Y
  一旦VCORE正常输出,系统将走出复位状态,内部高速RC振荡器HSI将使能。
7 B9 A* \' V' Y. ^  HSI稳定后,将开始系统初始化,主要是Flash和可选字节的加载,这些都是由硬件完成的,CPU也将以受限的方式运行(主要是指不允许对RAM进行写操作)。* G! x" J& o! s/ n. w
  软件程序初始化系统,包括供电配置。当供电配置完成后,等待ACTVOSRDY位置1,完成置1后,CPU就进入正常的运行的模式,允许读写RAM了。7 w. X1 q( X2 F
14.2.3 电源管理; }( {/ ]" {8 p8 `* S7 z
关于电源管理部分,H7参考手册中讲解的还挺复杂的,当前阶段我们仅需了解几个重要的工作状态即可,看到这几个单词了要认识,因为官方文档中多处要用这几个标识。2 t5 E4 e8 I; D2 N. t8 M" c

$ O% o: _2 W- W. `3 F为了实现各种低功耗模式,CPU和D1,D2,D3域支持的各种模式如下:) f/ |1 I6 m6 T
4 B* A- l5 I* D0 O% X4 g2 a
  CPU模式
. _. U0 R2 i& W% [! a5 yCRun:运行状态,CPU和CPU子系统外设正常运行。1 U7 T6 G2 q  B; N7 ^* M" y

% V2 R9 V/ s- f* W3 E5 H1 W% yCSleep:休眠状态,CPU时钟停止运行,CPU子系统外设正常运行。
( ^. J$ V( F2 _4 Q5 X4 z; O$ y# k* I
CStop:停止状态,CPU和CPU子系统外设都停止运行。, ?% K# C/ V3 G- k& Q
5 }) i+ \- O6 X- i
  D1域模式
! K1 `1 F$ l$ e. M6 S9 Y3 QDRun:运行状态,D1域的总线矩阵正常运行,CPU子系统运行在CRun或者CSleep模式。+ `' P6 y8 l. ]: i: w3 w  a

% c1 R* V( M: V. |( nDStop:停机状态,D1域的总线矩阵时钟停止运行,CPU子系统运行在CStop模式,PDDS_D1位选择DStop模式。4 V6 A( e7 _% X
9 F9 S' r/ k# S3 A
DStandby:待机状态,D1域的总线矩阵断电,CPU子系统运行在CStop模式,PDDS_D1位选择DStandby模式。. k3 C0 c/ f4 a9 E- P
) a, |. b+ Z3 E$ J& Y( L* X6 P2 R
  D2域模式
9 J, t8 {, U3 {8 p4 lDRun:运行状态,D2域的总线矩阵正常运行,CPU子系统在D2域中有分配的外设,CPU子系统运行在CRun或者CSleep模式。: @) s9 Q7 j- Q; ]; s' t2 O

7 [4 f* Y: z3 k. Z; ADStop:停机状态,D2域的总线矩阵时钟停止运行,CPU子系统没有在D2域分配外设,PDDS_D1位选择DStop模式。或者CPU子系统在D2域中有分配的外设,CPU子系统运行在CStop模式,PDDS_D1位选择DStop模式。
: I$ N5 h. {( B8 d5 F1 {8 D. {' w* u' e( s/ I
DStandby:待机状态,D2域的总线矩阵断电,CPU子系统没有在D2域分配外设,PDDS_D1位选择DStandby模式。或者CPU子系统在D2域中有分配的外设,CPU子系统运行在CStop模式,PDDS_D1位选择DStandby模式。
: c) i# V8 N; n2 S  C( _7 m
) E" g" ^7 {6 V8 Q  系统/D3域模式
$ W8 {% F4 E4 V9 MRun:运行状态,系统时钟和D3域总线矩阵时钟处于运行状态。CPU子系统处于CRun和CSleep模式,或者一个唤醒信号处于激活状态。
( g' j/ L9 W& [9 f1 f1 A* P
8 z9 \2 H& V& L% q6 d+ ZStop:停止状态,系统时钟和D3域总线矩阵时钟处于停止状态,CPU子系统处于CStop模式。所有的唤醒信号都处于非激活状态,并且至少某个域的一个PDDS_Dn位选择了Stop模式。
/ }9 s4 N  J6 M! d
( G2 H8 j) v+ x( A7 m8 hStandby:待机状态,系统处于断电状态,CPU子系统处于CStop模式,所有的唤醒信号都处于非激活状态,并且所有域的所有PDDS_Dn位选择Standby模式。) T' y6 o7 V6 h2 c5 [& T) P) S

0 C( F+ Z1 {1 K: L14.2.4 电源去耦电容的选择
, J" d" c1 K  C' J每个电源对 (VDD/VSS, VDDA/VSSA ...)必须使用下述的滤波陶瓷电容去耦。这些电容必须尽量靠近芯片引脚,以确保器件正常工作。不建议去掉滤波电容来降低PCB 尺寸或成本,这可能导致器件工作不正常。
; i/ B1 j: h& {/ Y0 V/ U9 [: I1 j* \- k

' X. G* o6 [, m6 b/ k( x' _6 C. [2 \! @3 ]: z
14.3 硬件复位
2 e7 G" v; Z& r+ B所有数字计算机系统都是由某种形式的震荡时钟电路驱动的。这种电路被称为系统的“脉搏”,是系统正确运行的关键。如果振荡器失灵,系统将完全无法运行,如果振荡器运行不规律,系统执行的所有与时间有关的计算都会有误差。
: [* C0 f1 z, a( Q
/ g  N; C! h  `  `) M所有微控制器的启动流程都不通用。由于硬件的复杂性,必须运行一段由厂家定义的短小的“复位程序”来使硬件处于一种正确的状态,然后再开始执行用户程序。运行这个复位程序需要时间并且要求微控制器的振荡器已经运行。8 r2 `' ?: Z9 @% Z/ A8 e% ^, ?
$ u2 j6 R& L5 S7 J4 D
当系统由可靠的电源供电时,一旦通电,电源迅速地达到额定输出电压,一旦断电,电源迅速地下降到0V,并且在接通的时候,电压不会降低。这时能够可靠地使用基于一个电容和一个电阻的低成本硬件复位。这种形式的复位电路称为阻容复位。
5 d2 r7 S0 o9 o+ d
& k1 c2 d$ k- I如果电源不够可靠,而涉及安全性,这种简单的阻容解决方案就不合适了。
; i0 S0 ^. g* Y8 s
4 s& B8 R4 H( B; M) u' ?14.3.1 上电复位和手动复位
5 r$ q5 [5 a+ ^2 g7 W+ n- T- H7 T; u; S. Z
STM32H7开发板的硬件复位原理图如下:
1 J4 H6 p9 {7 R8 t* h* l
: @, w! C+ B& v$ t3 B- B
aHR0cHM6Ly9pbWcyMDE4LmNuYmxvZ3MuY29tL2Jsb2cvMTM3OTEwNy8yMDE5MDQvMTM3OTEwNy0yMDE5.png

) W0 \, x* U. d& U% c0 `. i' Z2 x1 d6 r
  STM32这款CPU的复位引脚是低电平有效,即NRST为低电平时,CPU处于复位状态。
  B; m% y, ?3 F, L  R173单的RC复位电路。当系统上电瞬间,C114电容两端电压可以认为是0,CPU处于复位状态。3.3V电源通过R173给C114充电,当C114的电压升到CPU的高电平门槛电压时,CPU退出复位状态转入运行状态。) @* X) D6 E5 e. |/ C8 n
  在设计电路时,需要选择适当的R值和C值,以保证NRST低电平持续时间满足CPU复位最小脉宽的要求。' Y# J- }4 o0 t/ J, M2 U
  当按下S4轻触开关时,C114两端被短路接地,可实现手动复位CPU。
8 |7 |) q" x+ S* B) W
+ h9 m* m* b7 f. c/ _7 E14.3.2 复位序列( e' U$ m" v5 _2 b: b" \
前面第11章的13.3.1小节讲解了复位系列的相关知识,再结合本章节的上电复位和下电复位,大家会对其有一个较全面的认识,更多复位序列的知识直接看13.3.1小节即可。+ @( e# \% {1 b

4 g  }6 b9 E. h: A$ U6 h) w14.4 软件复位
7 d* O- J; }/ t  Z( F" L2 @除了上电和手动复位,程序设计设置中还经常要用到软件复位,即调用一条函数就可以实现复位功能。此函数已经由CMSIS软件包中的core_cm7.h文件提供,函数如下:5 t( H- S" ~/ o, P3 K  A

# K, O/ W) u" G) G
  1. /**0 A% s! B  e/ J
  2.   \brief   System Reset6 H3 I; {' b; }* Z; K1 H
  3.   \details Initiates a system reset request to reset the MCU.9 C" a; O9 @" u7 s
  4. */
    2 _$ ~2 C, c& |  S  B! `3 T. _
  5. __STATIC_INLINE void __NVIC_SystemReset(void)
    ( B( L9 [9 M; z8 X. H
  6. {5 T$ U% N9 M4 S/ |; }% D, y
  7.   __DSB();                                  /* Ensure all outstanding memory accesses included5 n3 Y- X& {, v' ^
  8.                                               buffered write are completed before reset */
    # W9 d. W# ]" d& O) ~6 s5 |: }7 n
  9.   SCB->AIRCR  = (uint32_t)((0x5FAUL << SCB_AIRCR_VECTKEY_Pos)    |
    7 U. A9 Q2 [- ?3 o
  10.                            (SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) |3 k$ r, G$ I' q; u5 \, g6 l
  11.                             SCB_AIRCR_SYSRESETREQ_Msk    );        /* Keep priority group unchanged */5 b1 f+ m" I# \1 C  A; |  o
  12.   __DSB();                                                         /* Ensure completion of memory access */* @& ^2 ~, Q6 G1 w8 K- S6 {

  13. / A5 A+ {4 _$ b9 n9 w
  14.   for(;;)                                                          /* wait until reset */
    ) t) C/ I& n* \) v
  15.   {' D$ ]/ p. V# Y" V' [& K
  16.     __NOP();1 a1 a7 `: j( `* a) m
  17.   }" R) f7 K+ H7 M" k7 [. c7 b+ f- _
  18. }
复制代码
' \+ c' ^: @- [' z* ]( m
软件复位反映到实际硬件上,就是给硬件复位部分发一个复位信号:
- s  E- e. k6 m8 C# G' [
/ o7 M) {+ j6 Z7 u
aHR0cHM6Ly9pbWcyMDE4LmNuYmxvZ3MuY29tL2Jsb2cvMTM3OTEwNy8yMDE5MDQvMTM3OTEwNy0yMDE5.png

' R9 j8 ~: X* u' x/ h0 j/ Z  `) P9 [: ^
14.5 RCC时钟控制
5 ~) }% x4 n) T$ w: d4 P: @STM32H7有如下六种时钟可供使用:6 ]5 k9 U# h4 N2 ^
. w. c& P6 F' g+ u8 k
  HSI (High-speed internal oscillator) :
% h% ~& J& }. b. g& \HSI是内部的高速RC振荡器,频率64MHz,可被用于系统时钟。优势是低成本,无需外部时钟,快速启动(仅需几个微秒),缺点是精度差,即使经过校准。# M+ d* h! M6 u" g

- m8 U' A- i0 d2 s( B( ], F& G2 N  HSE (High-speed external oscillator):
/ T9 L) A# t3 h# t. ]) T' \4 eHSE是外部的高速振荡器,通过外接时钟源,有源或者无源晶振驱动,时钟范围4-48MHz。优势是精度高,缺点是增加成本。
- P7 K7 w* d+ C; m( X& q2 d) u/ D) r2 d. h
  LSE (Low-speed external oscillator)  f# w$ H# }/ v8 ]
LSE是外部的低速振荡器,通过外接时钟源,有源或者无源晶振驱动,一般接32.768KHz,主要用于RTC实时时钟。
0 |9 o! X. Y6 M; O
# m- k3 E# v; i( s+ j5 ^  LSI (Low-speed internal oscillator)
% A* }0 ^: H# P8 V! z. C: NLSI是内部的低速RC振荡器,频率约是32KHz,主要用于独立看门狗和自动唤醒,也可以用于RTC实时时钟。& g2 ]$ ?. d+ h* X. s. t

7 {$ b8 T! _* q; E4 }5 a" z+ Y  CSI (Low-power internal oscillator)" ~5 g$ ?$ a+ y" p/ ^0 s
CSI是内部的低速振荡器,频率约是4MHz,相比64MHz的HSI,主要用于低功耗。
3 S$ O$ ]9 ^: P8 l- l' A
3 h. j; B4 Y& k% p& Q" V' ^4 z: D9 N. y  HSI48 (High-speed 48 MHz internal oscillator)
. U5 M1 N4 a3 V( ~) g7 B1 w$ Z
HSI48是内部高速振荡器,频率约是48MHz,用于给特定的外设提供时钟,比如USB。1 b; K: A3 A6 Z8 k3 h

. z7 [1 d( N2 i0 @# J- X! A# y通过下面的时钟树再进一步的认识这几个时钟:
' O- S! [1 l9 _* @% q
- s: L- Q+ Y, _
aHR0cHM6Ly9pbWcyMDE4LmNuYmxvZ3MuY29tL2Jsb2cvMTM3OTEwNy8yMDE5MDQvMTM3OTEwNy0yMDE5.png
4 @- D4 J2 _+ L+ V8 r2 X

3 ^9 t4 r0 X% q6 N: f) G; ?14.5.1 HSE和LSE硬件设计
6 \1 J1 ^- w' m HSE时钟
* t5 }( H; E% C! ^当前V7开发板是用的25MHz晶振为HSE提供时钟,硬件设计如下:: X% o0 |( R. j9 n) G6 d

# x  \5 N% G8 P
aHR0cHM6Ly9pbWcyMDE4LmNuYmxvZ3MuY29tL2Jsb2cvMTM3OTEwNy8yMDE5MDQvMTM3OTEwNy0yMDE5.png
4 H' @) U, D, x2 c
$ F( t1 _1 S9 |$ _8 {8 h7 A' \
晶振和负载电容需要尽可能近地靠近H7的晶振引脚,以减小输出失真和启动稳定时间。负载电容值必须根据选定的晶振进行调节。
7 t3 H) J' O/ O* e
9 I, G6 [" X; ~/ @对于C15和C17,我们推荐使用高质量陶瓷电容,这种电容是设计用于需要高频率的场合,并且可以满足晶体或谐振器的需求。C15和C17通常具有相同的值。; j- [8 U9 Q( X* O' q: d
+ _4 S0 u9 K+ X' i; K
这里再额外补充一个知识点,HSE旁路时钟和外置晶振区别:当前V7板子是采用的外置晶振模式,高速外部 (HSE) 时钟可以使用一个4到48MHz 的晶振 / 陶瓷谐振振荡器产生:
1 ^* V  g) s8 I- R+ R1 Z
# @% l0 W9 I" E0 j7 a# _
aHR0cHM6Ly9pbWcyMDE4LmNuYmxvZ3MuY29tL2Jsb2cvMTM3OTEwNy8yMDE5MDQvMTM3OTEwNy0yMDE5.png

# Q9 Z" A8 j4 E% z6 ], g5 K7 r+ q6 k4 ?6 [
而bypass 旁路的意思就是不使用它,绕过它。具体到HSE旁路的话,用户直接提供4-50MHz的时钟源即可,可以使用有源晶振或者FPGA提供时钟等方式:! p4 Y% ?  o# X
' J( F4 }0 C% q$ F  w
aHR0cHM6Ly9pbWcyMDE4LmNuYmxvZ3MuY29tL2Jsb2cvMTM3OTEwNy8yMDE5MDQvMTM3OTEwNy0yMDE5.png

+ ~# R+ f! F- Z( I& l3 X7 Z& q' h# R: F( f( [! H4 W
  LSE时钟: w( W; I3 V4 a# |7 W
当前V7开发板是用的32768Hz晶振为LSE提供时钟,硬件设计如下:
* W  ]5 Y; ^( }+ _
4 s+ `2 F; g" ~& k+ s
aHR0cHM6Ly9pbWcyMDE4LmNuYmxvZ3MuY29tL2Jsb2cvMTM3OTEwNy8yMDE5MDQvMTM3OTEwNy0yMDE5.png
4 J8 R$ W* o( t
) g, V  c% g, i/ [8 q% a, o" l
5 D  X) X3 e1 t( h0 g
14.5.2 时钟配置
; y: {! r# f. K+ v& hSTM32H7开发板使用的外部晶振频率是25MHz,下面分步说明如何让其通过这个频率工作到400MHz的主频。$ U* u+ J; z. ~; ~$ N

6 _2 b) N. k; K- @) j. O: E  第1步:在stm32h7xx_hal_conf.h文件配置HSE_VALUE
# ^: F* u0 B/ e2 F* m4 r0 V配置的大小要跟板子的实际晶振大小匹配。/ C* ]) f  X; E4 b

& e* H, U9 J. C' [8 d3 b) x5 M% Y( n
  1. #if !defined (HSE_VALUE) 9 B. s- |6 V& e: Z# v
  2. #define HSE_VALUE ((uint32_t)8000000) /*!< Value of the External oscillator in Hz */
    4 s7 f9 O# x4 b3 L) z+ y
  3. #endif /* HSE_VALUE */
复制代码

# [4 n4 J) t8 P0 X% k9 u5 @  第2步:系统上电后,在启动文件startup_stm32h743xx.s的复位中断服务程序里面会调用函数SystemInit。
( p2 I( \1 u) ?$ c+ Z0 E$ a/ @* `. ?
  1. Reset_Handler    PROC+ k9 c3 k. M$ L- y+ Z
  2.                  EXPORT  Reset_Handler                    [WEAK]
    7 U" y+ [8 v) w8 c, o% Q- y6 U
  3.         IMPORT  SystemInit
    2 Q6 m+ M$ V8 u4 ^
  4.         IMPORT  __main" `' B, [# T7 b0 P0 F  @
  5. $ @& f  z0 Y7 [  S+ g" _
  6.                  LDR     R0, =SystemInit5 ^+ Y, Y+ y3 H  J; C1 @( h
  7.                  BLX     R04 \4 b6 L" X; N
  8.                  LDR     R0, =__main) o) c$ U2 \- B8 k) q0 T0 n, A
  9.                  BX      R03 j/ D8 k0 R1 m5 x* ~# P3 E% A
  10.                  ENDP
复制代码

4 v" j3 e( K: N8 M" \. ^以往STM32F1和STM32F4系列都会在函数SystemInit里面配置PLL锁相环,使用了HAL后,需要在main函数里面配置。当前SystemInit函数实现的功能如下:0 y5 N" X; [5 S- k6 P  P- }

  K: A* f+ q+ F! H2 i7 j
  1. 1.        /**/ [% R4 d4 g6 P- I/ V; r( @
  2. 2.          * @brief  Setup the microcontroller system: Q0 s$ y' j2 }+ q, l. B9 ?
  3. 3.          *         Initialize the FPU setting, vector table location and External memory: q2 k# v1 R5 ~5 h4 e. `
  4. 4.          *         configuration.
    1 i2 K! Z7 G8 m3 x
  5. 5.          * @param  None
    / c" p, h- T% U$ ]& f) @, E2 K% J9 \
  6. 6.          * @retval None
    : |0 b6 p. ^- @
  7. 7.          */# Z6 `" \* s2 s! M0 {& V
  8. 8.        void SystemInit (void)
    : {: ^& e  Z# ?4 C
  9. 9.        {! N. {& N/ e9 z" g5 L- N5 {
  10. 10.          /* FPU settings ------------------------------------------------------------*/
    - `! W9 H, v' w/ l
  11. 11.          #if (__FPU_PRESENT == 1) && (__FPU_USED == 1)
    3 t' ]4 G$ f0 l
  12. 12.            SCB->CPACR |= ((3UL << 10*2)|(3UL << 11*2));  /* set CP10 and CP11 Full Access */
    % T  p3 r+ a, h5 k( l
  13. 13.          #endif
      ?, v& [1 P5 t% F5 j
  14. 14.          /* Reset the RCC clock configuration to the default reset state ------------*/* l# F! D( K( z$ j
  15. 15.          /* Set HSION bit */
    " R  G7 }+ S6 i4 g
  16. 16.          RCC->CR |= RCC_CR_HSION;( K3 R3 P- g. w( e
  17. 17.        
    / C/ Z: \& V) Z5 X; `1 H" K: n' F4 k
  18. 18.          /* Reset CFGR register */
    ' f1 f; d9 p2 J* d
  19. 19.          RCC->CFGR = 0x00000000;4 }6 D4 `2 t7 k5 a+ a, e; L1 `+ L
  20. 20.        
    ; C- Y1 E( I) N+ k0 b
  21. 21.          /* Reset HSEON, CSSON , CSION,RC48ON, CSIKERON PLL1ON, PLL2ON and PLL3ON bits */- d1 q7 N+ I9 R9 h& t3 P
  22. 22.          RCC->CR &= (uint32_t)0xEAF6ED7F;
    & M! |& w) y- O
  23. 23.        7 i5 w9 j: e2 s- s
  24. 24.          /* Reset D1CFGR register */
    ( k( j( f0 d) a! N& }- y# E9 Q. P: }
  25. 25.          RCC->D1CFGR = 0x00000000;
    7 H7 v% o. q8 H7 c
  26. 26.        6 Y+ }7 Y9 v7 ~
  27. 27.          /* Reset D2CFGR register */
    + j  @4 z' D/ w+ S6 g
  28. 28.          RCC->D2CFGR = 0x00000000;
      D9 h! k4 c+ x3 p0 w7 D, [
  29. 29.        
    2 R9 T; V! X& {& D3 @# }. l
  30. 30.          /* Reset D3CFGR register */- P4 Z# [/ W7 [$ K
  31. 31.          RCC->D3CFGR = 0x00000000;3 T9 [" W2 n* r
  32. 32.        
    7 g3 n4 n& k! H( M0 P# C
  33. 33.          /* Reset PLLCKSELR register */4 _9 ^  [8 o- n8 F- z1 Z+ r
  34. 34.          RCC->PLLCKSELR = 0x00000000;: _; L7 r: f# ?) o/ a2 r
  35. 35.        
    " h2 e% H: |3 D2 \& E
  36. 36.          /* Reset PLLCFGR register */4 ?% F; W, H" M3 s0 O. E
  37. 37.          RCC->PLLCFGR = 0x00000000;
    , h# b/ f* C8 n/ q4 |$ U3 |
  38. 38.          /* Reset PLL1DIVR register */- N4 I" K6 c  L. h, ?; M
  39. 39.          RCC->PLL1DIVR = 0x00000000;
    . V4 m5 z% C9 X
  40. 40.          /* Reset PLL1FRACR register */
    ! R1 M5 u+ z. S4 m8 j& |1 y
  41. 41.          RCC->PLL1FRACR = 0x00000000;9 Q4 Z9 [$ u+ n. v1 |6 D
  42. 42.        
    . _7 z+ B. X8 s) B
  43. 43.          /* Reset PLL2DIVR register */2 v: W4 z2 R; K6 J& {2 G) F
  44. 44.          RCC->PLL2DIVR = 0x00000000;
    - D3 w8 h2 l% P' _# S
  45. 45.        
    3 U% \, @0 \# y) W3 O* {8 u
  46. 46.          /* Reset PLL2FRACR register */
    ' p/ [0 c8 `% A# G
  47. 47.        & s6 b+ ^, m! |6 k( m3 u! B
  48. 48.          RCC->PLL2FRACR = 0x00000000;/ Z! @9 d. E  z8 J
  49. 49.          /* Reset PLL3DIVR register */
    / F, S5 [9 w% I8 g
  50. 50.          RCC->PLL3DIVR = 0x00000000;
    : H' p: \. @. @3 m, R5 L3 `2 g
  51. 51.        $ L6 V6 K% W' D9 ?8 I; Q8 r
  52. 52.          /* Reset PLL3FRACR register */
    / p/ U3 w% @" G4 s; c* I2 {  C
  53. 53.          RCC->PLL3FRACR = 0x00000000;! Z& I! n- M5 H: k  T$ Y" ^
  54. 54.        
    $ C. w. e7 _9 ^: O7 x
  55. 55.          /* Reset HSEBYP bit */  V, S% j: R, Q5 V
  56. 56.          RCC->CR &= (uint32_t)0xFFFBFFFF;4 Q0 t! h& }, h6 u) t1 ]+ n
  57. 57.        
    + I6 J7 z* s6 F  ]' Y  ]$ C
  58. 58.          /* Disable all interrupts */
    ) F. B6 {; U. d9 t4 P
  59. 59.          RCC->CIER = 0x00000000;& W4 E' f1 @: Y5 D
  60. 60.        , V* C8 g  x9 r) f# y8 `3 @9 J; R( \
  61. 61.          /* Change  the switch matrix read issuing capability to 1 for the AXI SRAM target (Target 7) */
      k: z. H" M  T( K/ b$ o8 y
  62. 62.          *((__IO uint32_t*)0x51008108) = 0x00000001;- O7 G: s# d7 r# s' u/ \
  63. 63.        
    ' G. B6 ^& G1 f; A1 F" {
  64. 64.        #if defined (DATA_IN_ExtSRAM) || defined (DATA_IN_ExtSDRAM)! e9 o2 _: P1 l9 |' r& @; e+ N
  65. 65.          SystemInit_ExtMemCtl();
    ' r7 L( R* ^# Y
  66. 66.        #endif /* DATA_IN_ExtSRAM || DATA_IN_ExtSDRAM */7 X2 L) [) c$ L, E& J% q
  67. 67.        
    & t% J' [6 L2 ]- S& y: e
  68. 68.          /* Configure the Vector Table location add offset address ------------------*/# k: k6 q  f1 [  U; z
  69. 69.        #ifdef VECT_TAB_SRAM3 e( ^4 A! o' H  L- n5 ~
  70. 70.          SCB->VTOR = D1_AXISRAM_BASE  | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal ITCMSRAM */0 @) C' \! Y) Q1 }
  71. 71.        #else" i: b- c. P! T2 d" t, u% ]
  72. 72.          SCB->VTOR = FLASH_BANK1_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal FLASH */
    7 i6 z9 o* ^  n6 |2 _
  73. 73.        #endif
    # r' ]1 A& Y, ^) d# P# p+ g
  74. 74.        
    " z- P3 x9 |6 t' s2 ?& e
  75. 75.        }
复制代码
8 H. L( y, X) p, o, \: S' Q3 K- g) i
第12行:使能FPU单元。0 z' ^' [5 E; k# a) c& P% L  ~

, }* C" U7 B. O6 W第16 – 59行:复位RCC相关寄存器。
0 k1 c1 J) s* l6 s( C* k; Z. `% M4 @1 u" M' c, T, A( g/ _) w0 i7 [" P8 D
第69 – 73行:设置中断向量表的位置。0 Z7 y- N$ H5 J  Y

2 p: Q9 O1 }7 o' X/ q& _0 n# J: h  第3步:在main函数的外设驱动初始化函数里面完成时钟初始化,主要是PLL锁相环,让芯片最终工作到400MHz。2 j# A2 g5 x# N$ k& n6 ~) O
14.6 总结& f) A3 \3 r0 O. ^* H; x
本章节就为大家讲解这么多,本章节的知识点相对比较多,比较杂,不容易一下子都掌握了。随着后面章节的进行,还会深入的讲解这些知识点。5 B! e( _8 f% d; i
5 \/ m& G. z8 i) O! X; e
+ \: K5 n7 i9 {( Y, `/ y
7 ^: E3 d/ X  b# c
aHR0cHM6Ly9pbWcyMDE4LmNuYmxvZ3MuY29tL2Jsb2cvMTM3OTEwNy8yMDE5MDQvMTM3OTEwNy0yMDE5.png
收藏 1 评论0 发布时间:2021-12-20 17:00

举报

0个回答

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版