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

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

[复制链接]
STMCU小助手 发布时间:2021-12-20 17:00
14.1 初学者重要提示0 ^: u5 [; S2 K  H" t
1、  电源管理部分涉及到的各种低功耗方式会在后面章节中为大家讲解,当前阶段仅需了解低功耗属于电源管理部分即可。
9 c5 Q4 d/ H, e# ]; b, N: y
3 `4 _) Y) b9 V% [2、  电源管理部分最繁琐的就是CPU,D1,D2,D3域的各种运行,待机,停机状态切换,这部分知识点也放在后面低功耗章节学习。3 C# g- N, C( z' `# b% o: S
: U: P. F5 N/ a
14.2 电源
1 r5 F- K8 j+ i电源是系统稳定运行的根本,主要分为以下几个知识点,电源供电、供电监控、电源管理和低功耗。当前阶段主要了解电源供电和硬件上电时序。
% Z, c6 w3 I- Z/ Q/ I, R0 [( L' [2 O! o3 m4 u5 R8 l( l2 d
14.2.1 电源供电, z+ C$ O. s7 o; s$ V( i2 j( V0 ~3 b
学习STM32H7的电源供电,往往被一堆电源标识Vdd,Vdda,Vcap,Vss等搞迷糊,这些标识整明白了,电源供电部分也就理解了,首先看下面的框图:5 f. D% h# a+ I1 b5 H6 D* q
) {) X# F  m# \0 h" i- a% ^
aHR0cHM6Ly9pbWcyMDE4LmNuYmxvZ3MuY29tL2Jsb2cvMTM3OTEwNy8yMDE5MDQvMTM3OTEwNy0yMDE5.png
; _9 S& p3 e4 D' n$ k

' v/ ~7 R2 r; f6 a1 w1 [这些常用标识的解释如下:% v  T5 d! f; h
! r5 S' {, T$ b2 D1 ?8 o& M1 N: c
aHR0cHM6Ly9pbWcyMDE4LmNuYmxvZ3MuY29tL2Jsb2cvMTM3OTEwNy8yMDE5MDQvMTM3OTEwNy0yMDE5.png
+ N9 N! }% |* Y( u2 `
  A" Z. l% {3 Y% Z7 S
对于电源供电部分了解了这些知识点就够用。7 w/ Y5 r& {/ u' K: E" }2 }4 G

' D' Q) H2 z  w/ W) O5 g14.2.2 系统上电启动. K1 B' g$ b. l" ?" e4 a/ Q
系统上电到程序开始运行期间,H7都做哪些工作,一张时序图可以说明问题:! m. }) I; x. t6 d, g( q" O
# v6 S( z" L# Z# g* A3 ]: D' g
aHR0cHM6Ly9pbWcyMDE4LmNuYmxvZ3MuY29tL2Jsb2cvMTM3OTEwNy8yMDE5MDQvMTM3OTEwNy0yMDE5.png
6 E1 Y) N* h) ?% n8 i
5 \5 c% F% K3 a6 M
对于上面的截图,主要看Operating mode部分,依次是Power down –> Reset -> Wait Oscillator ->HW system init -> Run -> Wait ACTVOS RDY –> Run,即断电状态 -> 复位状态 -> 等待HSI就绪->硬件初始化 -> 运行 -> 等ACTVOS位就绪 -> 正式运行。+ I/ z+ d1 L- S4 z' G( a

  u7 t! ]7 G7 b2 y. X详细些的执行流程如下:
4 @' i  b& V% G+ E  q0 L. o5 ^2 T: G2 `1 C
  当系统上电后,POR(Power on reset 上电复位)会检测VDD供电,当VDD大于POR设置的阀值时,将使能电压稳压器,注意看VDD那条线的变化。
& b( v4 \- Z; o, f# `+ {8 H  看VCORE那条曲线,只要VOSRDY未就绪,就会一直处于复位状态。
7 |5 J, d. G. Y# O; i. q. g0 Z  一旦VCORE正常输出,系统将走出复位状态,内部高速RC振荡器HSI将使能。
9 C. Q) l1 Y' Y7 R3 |* \( o# C& g9 T1 Q  HSI稳定后,将开始系统初始化,主要是Flash和可选字节的加载,这些都是由硬件完成的,CPU也将以受限的方式运行(主要是指不允许对RAM进行写操作)。
/ F( d7 \) I8 z; N  软件程序初始化系统,包括供电配置。当供电配置完成后,等待ACTVOSRDY位置1,完成置1后,CPU就进入正常的运行的模式,允许读写RAM了。% f3 \$ L' ]# J0 I
14.2.3 电源管理# c  R9 t2 X, D. I5 h; X
关于电源管理部分,H7参考手册中讲解的还挺复杂的,当前阶段我们仅需了解几个重要的工作状态即可,看到这几个单词了要认识,因为官方文档中多处要用这几个标识。
- l. w. P2 E# l
; y8 D* v/ _% N! P8 O为了实现各种低功耗模式,CPU和D1,D2,D3域支持的各种模式如下:% z5 c& J0 g) F5 J: i

3 d; W  }4 A  `& _$ v  CPU模式
* a; m! _- ^* z* g) |# xCRun:运行状态,CPU和CPU子系统外设正常运行。
: d' A2 R" N8 N+ S& j8 x2 L; I7 B% K& A; `( ?
CSleep:休眠状态,CPU时钟停止运行,CPU子系统外设正常运行。4 r# P1 E! u" F6 Z8 J# P
0 D1 Y/ s1 Q! R
CStop:停止状态,CPU和CPU子系统外设都停止运行。
* i( X& x; C, ?' b; Z
8 p' e( H) H5 K2 |% J8 I; ]9 J  D1域模式8 b, O2 b+ `1 X# G5 a2 h# n
DRun:运行状态,D1域的总线矩阵正常运行,CPU子系统运行在CRun或者CSleep模式。2 G. `' u5 p/ z: M9 h5 v0 R

5 k* g6 Q+ f0 L. P0 ]0 L/ ?DStop:停机状态,D1域的总线矩阵时钟停止运行,CPU子系统运行在CStop模式,PDDS_D1位选择DStop模式。; K/ x( @) N6 }' ^. _7 ]2 d
4 C$ I; y0 j, q, X5 ^+ [
DStandby:待机状态,D1域的总线矩阵断电,CPU子系统运行在CStop模式,PDDS_D1位选择DStandby模式。. l2 i: f0 ^: ]( f8 y4 e# |
$ ?- @% {* t; P, A* C
  D2域模式
/ r4 V# d! @* K6 w7 R: S; n- `DRun:运行状态,D2域的总线矩阵正常运行,CPU子系统在D2域中有分配的外设,CPU子系统运行在CRun或者CSleep模式。' b5 h1 ~0 N* m% k, M; V2 Z

  j* S* a7 v4 X5 m) R6 U' x7 MDStop:停机状态,D2域的总线矩阵时钟停止运行,CPU子系统没有在D2域分配外设,PDDS_D1位选择DStop模式。或者CPU子系统在D2域中有分配的外设,CPU子系统运行在CStop模式,PDDS_D1位选择DStop模式。( T& B& u/ R: l! d. K+ ]1 |
2 L0 L& q5 C' G) u
DStandby:待机状态,D2域的总线矩阵断电,CPU子系统没有在D2域分配外设,PDDS_D1位选择DStandby模式。或者CPU子系统在D2域中有分配的外设,CPU子系统运行在CStop模式,PDDS_D1位选择DStandby模式。
1 k, w/ {5 j" {) k# {  Q; t7 [8 R* o: c  v- N
  系统/D3域模式0 t6 o) Y1 V4 v# V* n  S" h2 o4 D
Run:运行状态,系统时钟和D3域总线矩阵时钟处于运行状态。CPU子系统处于CRun和CSleep模式,或者一个唤醒信号处于激活状态。4 X( h* W3 V6 t& a! y

$ ^4 P* N% Z. Y/ `Stop:停止状态,系统时钟和D3域总线矩阵时钟处于停止状态,CPU子系统处于CStop模式。所有的唤醒信号都处于非激活状态,并且至少某个域的一个PDDS_Dn位选择了Stop模式。
2 k) ?# l' b% X
% o8 G  A' `/ X: [% n0 AStandby:待机状态,系统处于断电状态,CPU子系统处于CStop模式,所有的唤醒信号都处于非激活状态,并且所有域的所有PDDS_Dn位选择Standby模式。
) F1 n( E9 r  j- |0 E$ W0 {! Q. E& P+ O% |  t6 I% H
14.2.4 电源去耦电容的选择" I/ x( \* F: K8 t
每个电源对 (VDD/VSS, VDDA/VSSA ...)必须使用下述的滤波陶瓷电容去耦。这些电容必须尽量靠近芯片引脚,以确保器件正常工作。不建议去掉滤波电容来降低PCB 尺寸或成本,这可能导致器件工作不正常。 ' k% r2 ^. Q; A+ L

+ l9 u' `$ Q" v# M& o& x
. |  X' P1 C. V- d0 }7 m
( h9 Y6 Z% D5 h2 o' e: z- S8 r
14.3 硬件复位, w  p7 l8 r. N% ]
所有数字计算机系统都是由某种形式的震荡时钟电路驱动的。这种电路被称为系统的“脉搏”,是系统正确运行的关键。如果振荡器失灵,系统将完全无法运行,如果振荡器运行不规律,系统执行的所有与时间有关的计算都会有误差。* t/ k, U! i/ C; P

0 ~, c5 `. o5 S' Z+ I所有微控制器的启动流程都不通用。由于硬件的复杂性,必须运行一段由厂家定义的短小的“复位程序”来使硬件处于一种正确的状态,然后再开始执行用户程序。运行这个复位程序需要时间并且要求微控制器的振荡器已经运行。
& U" \" R. l5 [' h. G% ]8 N: U6 X" A
9 [+ V! J" z: M& b8 R当系统由可靠的电源供电时,一旦通电,电源迅速地达到额定输出电压,一旦断电,电源迅速地下降到0V,并且在接通的时候,电压不会降低。这时能够可靠地使用基于一个电容和一个电阻的低成本硬件复位。这种形式的复位电路称为阻容复位。" C( J+ `1 ^* {" ^& E* S
  N: _5 v( \- a; Y  K8 i( K
如果电源不够可靠,而涉及安全性,这种简单的阻容解决方案就不合适了。
# L" y: p- o5 b! v/ w' s, D5 n
1 j( p# y- ?6 x1 y% F5 [14.3.1 上电复位和手动复位
8 D' @  q8 {* Q0 m7 n: p) S
STM32H7开发板的硬件复位原理图如下:
, _$ R6 i6 f" ]6 v. P7 {5 g9 E/ T# C% R0 J$ E3 I1 b; f
aHR0cHM6Ly9pbWcyMDE4LmNuYmxvZ3MuY29tL2Jsb2cvMTM3OTEwNy8yMDE5MDQvMTM3OTEwNy0yMDE5.png

* Y$ J7 ^- b" Y) C, W7 g
: @7 p! t1 T, J9 @, S& w+ b  STM32这款CPU的复位引脚是低电平有效,即NRST为低电平时,CPU处于复位状态。, h' r" M; H& t4 f! H% s/ o3 q
  R173单的RC复位电路。当系统上电瞬间,C114电容两端电压可以认为是0,CPU处于复位状态。3.3V电源通过R173给C114充电,当C114的电压升到CPU的高电平门槛电压时,CPU退出复位状态转入运行状态。
- T2 y! n: M1 V! U  h' k$ _  在设计电路时,需要选择适当的R值和C值,以保证NRST低电平持续时间满足CPU复位最小脉宽的要求。) D: K* `8 f: a  N
  当按下S4轻触开关时,C114两端被短路接地,可实现手动复位CPU。
4 |- U7 D9 @- D6 c- ?5 N5 K; ]  _& L) L( U
14.3.2 复位序列
& W# ]( {" f  `+ u* O1 G+ S2 k前面第11章的13.3.1小节讲解了复位系列的相关知识,再结合本章节的上电复位和下电复位,大家会对其有一个较全面的认识,更多复位序列的知识直接看13.3.1小节即可。# \/ M' I5 x  h. r. D. @/ u

1 |' ~) |# l+ L% q14.4 软件复位' P, T8 y+ H6 G6 ~6 S) `
除了上电和手动复位,程序设计设置中还经常要用到软件复位,即调用一条函数就可以实现复位功能。此函数已经由CMSIS软件包中的core_cm7.h文件提供,函数如下:5 }1 r& ?( F- Q5 n  v5 {: `0 N$ l% R1 g
. Z" m( s+ d. H5 U; F* b2 X
  1. /**
    ) f1 Q# o5 M2 y+ d! c% ~
  2.   \brief   System Reset; `0 p: j; Y. T" t& x  k! q
  3.   \details Initiates a system reset request to reset the MCU.
    & a; a+ y  p9 L0 B/ @# Q
  4. */
    3 [* B2 V; g; Q
  5. __STATIC_INLINE void __NVIC_SystemReset(void)1 s2 p/ g5 P& b& A* R' b+ m  w
  6. {
    ; G+ a: c( V2 c' ?
  7.   __DSB();                                  /* Ensure all outstanding memory accesses included  [8 i1 g& L* C' x  |3 ?
  8.                                               buffered write are completed before reset */  ]1 Y3 d5 `" M' O% K" y5 N& x9 E, i
  9.   SCB->AIRCR  = (uint32_t)((0x5FAUL << SCB_AIRCR_VECTKEY_Pos)    |
    1 z/ Y& ^6 e3 [4 L1 N8 j( C4 ~
  10.                            (SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) |( [  ^9 R# J+ c; P, p: h2 u
  11.                             SCB_AIRCR_SYSRESETREQ_Msk    );        /* Keep priority group unchanged */
    6 Z& Y& V" Z( L  p  ]! l7 W
  12.   __DSB();                                                         /* Ensure completion of memory access */
    1 i! q8 J2 ?4 ~" _4 h5 y

  13.   G+ z& L' k, l# [$ W7 J8 f6 F7 P; X
  14.   for(;;)                                                          /* wait until reset */
    * _7 i! l, {/ t4 q1 F
  15.   {) q" V  K* D+ T' I" _4 o$ Y8 V
  16.     __NOP();
    ( Y8 K* o4 s7 C  E4 Q
  17.   }
    2 C2 A- R1 J6 D' F' o1 B: Q4 R
  18. }
复制代码

# m5 t) P* p1 o$ m% V" _2 A软件复位反映到实际硬件上,就是给硬件复位部分发一个复位信号:7 N/ b; i/ s  i; Q% K( W

/ u& e# V; J; }! K
aHR0cHM6Ly9pbWcyMDE4LmNuYmxvZ3MuY29tL2Jsb2cvMTM3OTEwNy8yMDE5MDQvMTM3OTEwNy0yMDE5.png
* z; e& C( A6 J1 g4 k$ l9 H' Y( i

/ c; f/ Z: o1 K& f14.5 RCC时钟控制
" d. G) h. ]* _, mSTM32H7有如下六种时钟可供使用:
% Z; Q/ q' C2 Y- J, c7 \1 L$ l7 Z3 U% s) O# ^: E  Q( S1 N
  HSI (High-speed internal oscillator) :3 C' `- M. A; k
HSI是内部的高速RC振荡器,频率64MHz,可被用于系统时钟。优势是低成本,无需外部时钟,快速启动(仅需几个微秒),缺点是精度差,即使经过校准。
3 G# q+ a/ }" q" O8 g; H' y. Q* u; |! w+ o( f$ ~
  HSE (High-speed external oscillator):4 r+ t$ H4 |! t
HSE是外部的高速振荡器,通过外接时钟源,有源或者无源晶振驱动,时钟范围4-48MHz。优势是精度高,缺点是增加成本。7 L' p1 }* n& \2 s  Y4 h! S
" I  O, B( P5 I: C% j; i
  LSE (Low-speed external oscillator): E9 V' m  T: O, r' C7 _5 ?9 u9 D
LSE是外部的低速振荡器,通过外接时钟源,有源或者无源晶振驱动,一般接32.768KHz,主要用于RTC实时时钟。
8 }2 H" V" S% D% ~5 h! p& l
/ X% c8 B4 f- w+ D& z9 r, a  LSI (Low-speed internal oscillator)
  i) D! _8 Q( O; q$ TLSI是内部的低速RC振荡器,频率约是32KHz,主要用于独立看门狗和自动唤醒,也可以用于RTC实时时钟。
$ Z+ [) q" x/ i6 ^5 F
0 ?) x6 Y" g# S' _3 n& ?  CSI (Low-power internal oscillator)
; P7 \$ R+ N/ ~* E& `, D, QCSI是内部的低速振荡器,频率约是4MHz,相比64MHz的HSI,主要用于低功耗。+ z6 {9 q4 b6 I7 i/ t5 {* p

, }5 w  E7 D% G" A4 x5 E  HSI48 (High-speed 48 MHz internal oscillator)
7 W; j" p. N" F  j9 F9 x* m7 f4 m" A
HSI48是内部高速振荡器,频率约是48MHz,用于给特定的外设提供时钟,比如USB。
6 ~# H7 ^2 q: N& m2 i/ `: a$ U. N. `# Y5 n/ O
通过下面的时钟树再进一步的认识这几个时钟:
4 V& y+ b$ c2 P. M7 x5 \/ E+ Q+ t" b$ ^
aHR0cHM6Ly9pbWcyMDE4LmNuYmxvZ3MuY29tL2Jsb2cvMTM3OTEwNy8yMDE5MDQvMTM3OTEwNy0yMDE5.png

8 T* y8 u6 X0 f% L# ?
' t) P3 [8 l5 X% h; u9 {( q14.5.1 HSE和LSE硬件设计
3 N& p( {% Q. J, Q6 a HSE时钟
1 l! W; u- S/ b! G* w1 e当前V7开发板是用的25MHz晶振为HSE提供时钟,硬件设计如下:! G. v* r2 c! a, R5 [+ b
4 F7 C( z: o- p) R/ l( K4 V' _4 V
aHR0cHM6Ly9pbWcyMDE4LmNuYmxvZ3MuY29tL2Jsb2cvMTM3OTEwNy8yMDE5MDQvMTM3OTEwNy0yMDE5.png

" [/ W4 @, o% w, r( }. k" a; s; D) Z' c$ K+ p$ J) u  v2 I
晶振和负载电容需要尽可能近地靠近H7的晶振引脚,以减小输出失真和启动稳定时间。负载电容值必须根据选定的晶振进行调节。# T* x+ s9 `/ }" m/ t0 [
: b0 b1 w7 B( L1 d
对于C15和C17,我们推荐使用高质量陶瓷电容,这种电容是设计用于需要高频率的场合,并且可以满足晶体或谐振器的需求。C15和C17通常具有相同的值。  a6 }' L: m! c
- \  H- f& I) ~5 W  D
这里再额外补充一个知识点,HSE旁路时钟和外置晶振区别:当前V7板子是采用的外置晶振模式,高速外部 (HSE) 时钟可以使用一个4到48MHz 的晶振 / 陶瓷谐振振荡器产生:, O8 Q$ k9 K) A  R
- M2 l% ~+ ^; x
aHR0cHM6Ly9pbWcyMDE4LmNuYmxvZ3MuY29tL2Jsb2cvMTM3OTEwNy8yMDE5MDQvMTM3OTEwNy0yMDE5.png
. T6 b5 a9 F: v( {* Y

" z- c) r: A" x, q而bypass 旁路的意思就是不使用它,绕过它。具体到HSE旁路的话,用户直接提供4-50MHz的时钟源即可,可以使用有源晶振或者FPGA提供时钟等方式:
/ ?+ ]9 p; D5 ^3 P7 h: i! K: U
$ q: F2 {! ], `  _, D6 Q7 Y& ?
aHR0cHM6Ly9pbWcyMDE4LmNuYmxvZ3MuY29tL2Jsb2cvMTM3OTEwNy8yMDE5MDQvMTM3OTEwNy0yMDE5.png

& o) z( y2 m1 Q* b+ l; K( b5 \) Z/ k6 [/ g& U: j2 @" {$ z
  LSE时钟( ^1 f: A# v7 I
当前V7开发板是用的32768Hz晶振为LSE提供时钟,硬件设计如下:# V% F# T. ]( ^* ]. u6 L

. }. U, n0 Y, P0 J9 W' |
aHR0cHM6Ly9pbWcyMDE4LmNuYmxvZ3MuY29tL2Jsb2cvMTM3OTEwNy8yMDE5MDQvMTM3OTEwNy0yMDE5.png
+ N/ T: k7 r+ }. ~; n6 ^
: O$ x8 m. R2 G
* R" F' L. c5 }+ X; d4 b) d$ X
14.5.2 时钟配置
2 V& \" A  c- `% L' t- x, E1 cSTM32H7开发板使用的外部晶振频率是25MHz,下面分步说明如何让其通过这个频率工作到400MHz的主频。
7 ~$ \* S7 ?7 r% @! l, J( X
3 ]! C8 Z6 L/ F3 D/ k! K  第1步:在stm32h7xx_hal_conf.h文件配置HSE_VALUE/ e* v& c, h6 ~$ E. z3 y$ }) p
配置的大小要跟板子的实际晶振大小匹配。+ @, I" r' f( Z; N# b
7 j4 D; g7 u* U6 f
  1. #if !defined (HSE_VALUE)
    % d0 r7 f0 e8 V; W; Y! d
  2. #define HSE_VALUE ((uint32_t)8000000) /*!< Value of the External oscillator in Hz */
    , u6 Q. r% _9 d
  3. #endif /* HSE_VALUE */
复制代码

4 H7 c# F3 }; M* H! ?- K  第2步:系统上电后,在启动文件startup_stm32h743xx.s的复位中断服务程序里面会调用函数SystemInit。  r/ X, a9 `0 @! V
  1. Reset_Handler    PROC2 t. [$ _1 S+ r$ j$ s) p# D+ L: s
  2.                  EXPORT  Reset_Handler                    [WEAK]
    , }2 M$ t& H3 X4 A+ _
  3.         IMPORT  SystemInit
    2 O- d9 k/ q6 t' @, @/ F# u0 |% l
  4.         IMPORT  __main
    8 l4 ~% O4 e7 n" k$ L- d! u
  5. - c* E6 T/ W4 y6 M% [
  6.                  LDR     R0, =SystemInit
    ' U$ C" t& g( ^0 H9 i
  7.                  BLX     R0  v3 Q5 `8 q. F9 t$ z. b4 @
  8.                  LDR     R0, =__main9 b+ T4 j2 {+ s, E  @
  9.                  BX      R0
    5 o3 t4 _) X/ l/ w6 u
  10.                  ENDP
复制代码
5 \$ U/ k2 L/ X2 \" K
以往STM32F1和STM32F4系列都会在函数SystemInit里面配置PLL锁相环,使用了HAL后,需要在main函数里面配置。当前SystemInit函数实现的功能如下:
1 w9 l. G  S2 |0 K% E0 a4 K5 S9 }+ ^
  1. 1.        /**' _9 W/ ]$ p, K
  2. 2.          * @brief  Setup the microcontroller system( F) }  W8 y6 k1 }1 p' c7 v0 _
  3. 3.          *         Initialize the FPU setting, vector table location and External memory
    % c* U7 `: M4 [$ w
  4. 4.          *         configuration.
    ' Y, V- c3 |+ J( W. M- Q* n
  5. 5.          * @param  None( N; D' E8 u& k
  6. 6.          * @retval None
    7 u7 @0 }: a7 ~( H+ l4 y
  7. 7.          */
    ( w/ B) k- z- j* C9 ~
  8. 8.        void SystemInit (void)4 P- |2 C+ F! e. W
  9. 9.        {0 N! e) p% D9 p+ g; n, I
  10. 10.          /* FPU settings ------------------------------------------------------------*/# q9 L5 j2 s( y
  11. 11.          #if (__FPU_PRESENT == 1) && (__FPU_USED == 1)/ A2 ~& f! A3 j' ]
  12. 12.            SCB->CPACR |= ((3UL << 10*2)|(3UL << 11*2));  /* set CP10 and CP11 Full Access */8 N/ a3 Z" c/ r& r
  13. 13.          #endif# n3 c, q4 ?, G" e( `
  14. 14.          /* Reset the RCC clock configuration to the default reset state ------------*/
    2 a4 @( u- e- W- V6 T! ~
  15. 15.          /* Set HSION bit */
    7 a' R0 R% v# E. v; O  q4 u
  16. 16.          RCC->CR |= RCC_CR_HSION;
    4 R3 q# r; W% C4 \/ R
  17. 17.        
    8 Y+ M7 H) l: I0 @+ ?
  18. 18.          /* Reset CFGR register */& o3 b) H" z' }5 S8 i3 b' o+ I
  19. 19.          RCC->CFGR = 0x00000000;
    3 z8 F. J9 p( o/ X
  20. 20.        5 d2 P! }4 N: J8 ~1 d6 m( V
  21. 21.          /* Reset HSEON, CSSON , CSION,RC48ON, CSIKERON PLL1ON, PLL2ON and PLL3ON bits */+ V( j; k* y9 I  y4 l
  22. 22.          RCC->CR &= (uint32_t)0xEAF6ED7F;
    ! g0 `# F5 w! x6 C/ E: F) K
  23. 23.        - s! S  ?) G) v2 f/ U6 w9 z# h% p
  24. 24.          /* Reset D1CFGR register */% ~. y7 C" B& k9 ~2 m
  25. 25.          RCC->D1CFGR = 0x00000000;* O6 s& ?7 B5 S4 ^$ f
  26. 26.        
    + M2 d' d# e- Y4 \! ]
  27. 27.          /* Reset D2CFGR register */
    % M; S# {: Y+ A3 y
  28. 28.          RCC->D2CFGR = 0x00000000;
    3 v0 b. a/ `/ s% ]8 u4 Z5 V+ ~
  29. 29.        
    . a+ U7 I; _: m. s
  30. 30.          /* Reset D3CFGR register */: R9 C- O* d4 `* s' D
  31. 31.          RCC->D3CFGR = 0x00000000;
    ) V4 |; U* R3 B; r4 L
  32. 32.        
    4 @3 p3 D, w' n
  33. 33.          /* Reset PLLCKSELR register */  c/ U6 J/ H$ p7 S
  34. 34.          RCC->PLLCKSELR = 0x00000000;
    $ d: f* R7 c2 V$ S  Y; f/ O) `+ `; M
  35. 35.        4 c0 g$ I: g7 {) n# i2 e% H3 a
  36. 36.          /* Reset PLLCFGR register */% p3 D  z! T+ r9 F. ^4 |
  37. 37.          RCC->PLLCFGR = 0x00000000;
    8 ?* e6 {( i/ V% r* Y
  38. 38.          /* Reset PLL1DIVR register */
    , q) [5 H( Z8 b+ Z; H
  39. 39.          RCC->PLL1DIVR = 0x00000000;5 R& ~6 A" Z# h: R8 Z& }0 I
  40. 40.          /* Reset PLL1FRACR register */
    * a, m( P8 u7 p4 ~9 v* r( N
  41. 41.          RCC->PLL1FRACR = 0x00000000;& w, w; C8 M0 d( J  J! K
  42. 42.        5 p' Q8 A) \$ I: e* z
  43. 43.          /* Reset PLL2DIVR register */
    6 q9 [- j7 ]1 C4 ^0 T2 n
  44. 44.          RCC->PLL2DIVR = 0x00000000;
    # K' R% K1 I' S+ I1 ^
  45. 45.        ( {8 P9 }# C* s% |
  46. 46.          /* Reset PLL2FRACR register */$ g3 }6 T8 u5 D+ m5 C% k
  47. 47.        
    4 m, {; a7 \4 r/ ^2 G
  48. 48.          RCC->PLL2FRACR = 0x00000000;
    1 u, B% x% H" V5 \) e% b  R
  49. 49.          /* Reset PLL3DIVR register */
    7 `& w4 _4 L! h7 ]6 u
  50. 50.          RCC->PLL3DIVR = 0x00000000;- e& f, C5 O# O. ]+ k
  51. 51.        7 l4 M$ p' y( t- N# W9 t/ E
  52. 52.          /* Reset PLL3FRACR register */
    1 i7 D4 H4 ^8 J
  53. 53.          RCC->PLL3FRACR = 0x00000000;
    9 u) V) B- \9 k8 h
  54. 54.        
      C' d- H; Q0 p0 e& U: l, x/ f
  55. 55.          /* Reset HSEBYP bit */6 _8 v! O. B$ ?) G$ u9 ^
  56. 56.          RCC->CR &= (uint32_t)0xFFFBFFFF;4 j$ Q0 H6 f5 x; s9 ^- J; k
  57. 57.        
    : ?( I* Y; A9 w3 D# Q" W
  58. 58.          /* Disable all interrupts */! V7 N9 V, `$ u7 m
  59. 59.          RCC->CIER = 0x00000000;: _3 r, F" V4 o; f% m
  60. 60.        
    3 W9 j7 G8 i: k% J& _
  61. 61.          /* Change  the switch matrix read issuing capability to 1 for the AXI SRAM target (Target 7) */
    & R8 Y- I6 J/ K) d
  62. 62.          *((__IO uint32_t*)0x51008108) = 0x00000001;. l, T! I3 b& f8 c- X, w
  63. 63.        % A! c3 v2 A% [  F2 z/ k: O
  64. 64.        #if defined (DATA_IN_ExtSRAM) || defined (DATA_IN_ExtSDRAM)/ H# Y9 q- V/ q1 v/ d
  65. 65.          SystemInit_ExtMemCtl();
    ! U3 l, G5 k4 q# m
  66. 66.        #endif /* DATA_IN_ExtSRAM || DATA_IN_ExtSDRAM */% {4 @8 s+ A+ I8 m. x  e; i) v
  67. 67.        
    ) Q  p' S# K3 U/ x# m
  68. 68.          /* Configure the Vector Table location add offset address ------------------*/1 Y; z7 t5 t0 N$ ]& C' c- i
  69. 69.        #ifdef VECT_TAB_SRAM) f0 G; S* M; C$ V; B4 y; t
  70. 70.          SCB->VTOR = D1_AXISRAM_BASE  | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal ITCMSRAM */
    8 @( Q. }+ V6 S  Y% X
  71. 71.        #else, ~, a  G! A+ a
  72. 72.          SCB->VTOR = FLASH_BANK1_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal FLASH */6 |# I& ^. D7 `4 N; R6 k
  73. 73.        #endif
    # x' L% \+ Z8 {% I. V
  74. 74.          u4 v8 }' }" x: Y+ l9 ^0 X
  75. 75.        }
复制代码

; k) _* ?( ^; C' V第12行:使能FPU单元。: ^5 i1 t2 L: {" [

# P& w; i9 X! s2 L: [' i第16 – 59行:复位RCC相关寄存器。8 e; T! h. G5 q" J$ k
1 M0 D/ W* F3 v
第69 – 73行:设置中断向量表的位置。
  {8 G; [2 F& o- S6 k+ o2 @9 e1 w5 ]) K0 ]8 F
  第3步:在main函数的外设驱动初始化函数里面完成时钟初始化,主要是PLL锁相环,让芯片最终工作到400MHz。
) k% b2 H/ _- [+ h2 g! c% K) T  R14.6 总结
1 U; Q; M$ R$ p2 z8 ?" f' u本章节就为大家讲解这么多,本章节的知识点相对比较多,比较杂,不容易一下子都掌握了。随着后面章节的进行,还会深入的讲解这些知识点。0 m* `  C4 n9 g  N: r

3 s1 G* s% A8 V4 R( t: K0 M8 A8 z( v3 Q* l' K
5 O: e( U8 s4 U8 }
aHR0cHM6Ly9pbWcyMDE4LmNuYmxvZ3MuY29tL2Jsb2cvMTM3OTEwNy8yMDE5MDQvMTM3OTEwNy0yMDE5.png
收藏 1 评论0 发布时间:2021-12-20 17:00

举报

0个回答

所属标签

相似分享

官网相关资源

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