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

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

[复制链接]
STMCU小助手 发布时间:2021-12-20 17:00
14.1 初学者重要提示, V' v! P( C  R" \' ?0 D
1、  电源管理部分涉及到的各种低功耗方式会在后面章节中为大家讲解,当前阶段仅需了解低功耗属于电源管理部分即可。, B  m) [8 H  W; c1 L5 _
1 e1 \; S1 |) P8 |. I* o
2、  电源管理部分最繁琐的就是CPU,D1,D2,D3域的各种运行,待机,停机状态切换,这部分知识点也放在后面低功耗章节学习。" k9 K  y5 F: l- R/ \' p

# e/ L; @) `  T14.2 电源' y0 h' [. L3 p) U& O
电源是系统稳定运行的根本,主要分为以下几个知识点,电源供电、供电监控、电源管理和低功耗。当前阶段主要了解电源供电和硬件上电时序。, H* m2 J. a3 g/ @8 }

& l9 |! d' z8 g8 U14.2.1 电源供电+ G, R! r* _: s" @3 v2 S8 c
学习STM32H7的电源供电,往往被一堆电源标识Vdd,Vdda,Vcap,Vss等搞迷糊,这些标识整明白了,电源供电部分也就理解了,首先看下面的框图:
/ s* V8 w( ?) F. E% v3 |" u0 Z0 u; U; W- X- P
aHR0cHM6Ly9pbWcyMDE4LmNuYmxvZ3MuY29tL2Jsb2cvMTM3OTEwNy8yMDE5MDQvMTM3OTEwNy0yMDE5.png

# b2 X9 P3 j6 D: B# _4 \( k, k& e) d/ W) M' p# V5 i/ I( n' T
这些常用标识的解释如下:2 }7 U% l% U- u4 G& t

. K5 a  K0 V0 E5 b+ \
aHR0cHM6Ly9pbWcyMDE4LmNuYmxvZ3MuY29tL2Jsb2cvMTM3OTEwNy8yMDE5MDQvMTM3OTEwNy0yMDE5.png
4 Q9 z) D; K5 K: {2 i6 \# F

+ [4 v/ C5 Z9 c对于电源供电部分了解了这些知识点就够用。
& i/ u/ z# O- U( J
' N/ o6 |7 a/ \14.2.2 系统上电启动
) M6 Z; h) f) J6 h" @) M- {系统上电到程序开始运行期间,H7都做哪些工作,一张时序图可以说明问题:
* s! v. ^/ W+ J: b2 m& K, y  _& N% g/ @& G( u# ?0 g5 ]6 r
aHR0cHM6Ly9pbWcyMDE4LmNuYmxvZ3MuY29tL2Jsb2cvMTM3OTEwNy8yMDE5MDQvMTM3OTEwNy0yMDE5.png

7 S7 u, T' j# T2 b# D! [8 O
6 @9 B- p, v( ?2 Y9 C& d对于上面的截图,主要看Operating mode部分,依次是Power down –> Reset -> Wait Oscillator ->HW system init -> Run -> Wait ACTVOS RDY –> Run,即断电状态 -> 复位状态 -> 等待HSI就绪->硬件初始化 -> 运行 -> 等ACTVOS位就绪 -> 正式运行。
) c0 R) a: z" A' _7 ^) Y2 b/ H4 N6 N7 n8 i5 F
详细些的执行流程如下:, X1 Q0 u+ L8 @$ w

* c0 E5 }6 J3 h2 `3 @$ T) f4 E  当系统上电后,POR(Power on reset 上电复位)会检测VDD供电,当VDD大于POR设置的阀值时,将使能电压稳压器,注意看VDD那条线的变化。
3 J6 M8 B' ]$ W  看VCORE那条曲线,只要VOSRDY未就绪,就会一直处于复位状态。( o% h; _) M2 P: U
  一旦VCORE正常输出,系统将走出复位状态,内部高速RC振荡器HSI将使能。' X7 Q: c5 S/ J5 e) Y# U# D2 }
  HSI稳定后,将开始系统初始化,主要是Flash和可选字节的加载,这些都是由硬件完成的,CPU也将以受限的方式运行(主要是指不允许对RAM进行写操作)。$ [# D. p; Y/ I0 A- F4 _& j7 B
  软件程序初始化系统,包括供电配置。当供电配置完成后,等待ACTVOSRDY位置1,完成置1后,CPU就进入正常的运行的模式,允许读写RAM了。0 |4 a' [+ u7 r
14.2.3 电源管理. q/ e7 Y# V; H, Z: e/ g
关于电源管理部分,H7参考手册中讲解的还挺复杂的,当前阶段我们仅需了解几个重要的工作状态即可,看到这几个单词了要认识,因为官方文档中多处要用这几个标识。4 L+ B9 x" K1 z# i1 D
" T4 Y! o' l7 P, [6 ?
为了实现各种低功耗模式,CPU和D1,D2,D3域支持的各种模式如下:- \8 {  L9 c, s5 X  T" V
/ [/ M0 u* ]: q3 w. x
  CPU模式) M% c  M  V% R. S% _2 G& r5 T1 l
CRun:运行状态,CPU和CPU子系统外设正常运行。
  }. _) g' [+ ^+ z( t
9 g3 n4 w# z9 Q6 ^9 {CSleep:休眠状态,CPU时钟停止运行,CPU子系统外设正常运行。
, V9 B3 q6 _* r  p1 M; m
/ C) c/ |, `9 Y4 DCStop:停止状态,CPU和CPU子系统外设都停止运行。
$ h% \9 W, _7 x+ k. @2 \. H6 Z" f- E" C  u+ W& j$ V
  D1域模式3 F  O+ _& C. I; Z  \0 I
DRun:运行状态,D1域的总线矩阵正常运行,CPU子系统运行在CRun或者CSleep模式。+ |4 \# c! v& o8 ]. \3 Q
6 p4 ^: ]. I0 y. R- U: j
DStop:停机状态,D1域的总线矩阵时钟停止运行,CPU子系统运行在CStop模式,PDDS_D1位选择DStop模式。* N; q7 \- e+ F

+ @6 b6 {1 f9 f0 g5 |4 {" `DStandby:待机状态,D1域的总线矩阵断电,CPU子系统运行在CStop模式,PDDS_D1位选择DStandby模式。
9 N1 A- E0 ?& r; }  `, N' k9 c/ W( w( i
  D2域模式
3 ]+ u1 j% O" D& wDRun:运行状态,D2域的总线矩阵正常运行,CPU子系统在D2域中有分配的外设,CPU子系统运行在CRun或者CSleep模式。4 v% L! J1 i- I  j
" [5 ]5 m7 g  q; X, v
DStop:停机状态,D2域的总线矩阵时钟停止运行,CPU子系统没有在D2域分配外设,PDDS_D1位选择DStop模式。或者CPU子系统在D2域中有分配的外设,CPU子系统运行在CStop模式,PDDS_D1位选择DStop模式。5 _2 z3 ?. s' Y' P

  t% I/ a" |6 O9 N9 h$ j, G) KDStandby:待机状态,D2域的总线矩阵断电,CPU子系统没有在D2域分配外设,PDDS_D1位选择DStandby模式。或者CPU子系统在D2域中有分配的外设,CPU子系统运行在CStop模式,PDDS_D1位选择DStandby模式。9 N5 W) l, ?9 y' S: ^
* G6 G- H( k# a! G7 o
  系统/D3域模式
, N& m) I! M2 B& u2 BRun:运行状态,系统时钟和D3域总线矩阵时钟处于运行状态。CPU子系统处于CRun和CSleep模式,或者一个唤醒信号处于激活状态。" n$ m& h) a- K0 @

8 l* S. T3 _* A4 r3 R" \2 E- YStop:停止状态,系统时钟和D3域总线矩阵时钟处于停止状态,CPU子系统处于CStop模式。所有的唤醒信号都处于非激活状态,并且至少某个域的一个PDDS_Dn位选择了Stop模式。
# N. `% b5 H* |, h. P& j: c3 [! b! ?' i. r1 A: V# h4 y
Standby:待机状态,系统处于断电状态,CPU子系统处于CStop模式,所有的唤醒信号都处于非激活状态,并且所有域的所有PDDS_Dn位选择Standby模式。
; E- k) r  T7 o
, v. V( B/ @, n/ G" [1 v14.2.4 电源去耦电容的选择
  x# \! B9 C: c. \! V7 G# Q2 f( _9 m每个电源对 (VDD/VSS, VDDA/VSSA ...)必须使用下述的滤波陶瓷电容去耦。这些电容必须尽量靠近芯片引脚,以确保器件正常工作。不建议去掉滤波电容来降低PCB 尺寸或成本,这可能导致器件工作不正常。 ! e5 |; j# O/ m  @

% Y4 ~1 d. t& t4 z5 S
5 |3 R: t8 {6 W* d) W, r5 ~5 ?. R
! H, D' E7 M) F6 y1 D/ L, ^
14.3 硬件复位4 D9 R4 c$ `* N
所有数字计算机系统都是由某种形式的震荡时钟电路驱动的。这种电路被称为系统的“脉搏”,是系统正确运行的关键。如果振荡器失灵,系统将完全无法运行,如果振荡器运行不规律,系统执行的所有与时间有关的计算都会有误差。. H8 C! l! n. T

) C% F* N; r4 s* S- j- ~* p所有微控制器的启动流程都不通用。由于硬件的复杂性,必须运行一段由厂家定义的短小的“复位程序”来使硬件处于一种正确的状态,然后再开始执行用户程序。运行这个复位程序需要时间并且要求微控制器的振荡器已经运行。6 q3 d  M1 [! p) ~* ^5 H; S
0 I/ L6 O$ j# O2 F% A" G8 l! P* H
当系统由可靠的电源供电时,一旦通电,电源迅速地达到额定输出电压,一旦断电,电源迅速地下降到0V,并且在接通的时候,电压不会降低。这时能够可靠地使用基于一个电容和一个电阻的低成本硬件复位。这种形式的复位电路称为阻容复位。
7 m+ r- z: }4 h7 y& u; Z9 T
& a/ s) g; P1 L- w7 p如果电源不够可靠,而涉及安全性,这种简单的阻容解决方案就不合适了。
+ a) j: V+ t3 I8 m" g5 V% v. J3 x( }+ R
14.3.1 上电复位和手动复位

) R0 ?7 T4 _0 y+ b) Y6 D0 c: ?STM32H7开发板的硬件复位原理图如下:
; G, Y# `% F# m8 K( T* c6 [1 |/ _/ w1 d4 Q
aHR0cHM6Ly9pbWcyMDE4LmNuYmxvZ3MuY29tL2Jsb2cvMTM3OTEwNy8yMDE5MDQvMTM3OTEwNy0yMDE5.png

$ w& t" x8 C' P1 V- g( z4 N+ i4 b" u
  STM32这款CPU的复位引脚是低电平有效,即NRST为低电平时,CPU处于复位状态。
- |$ T3 R8 g1 E) |  R173单的RC复位电路。当系统上电瞬间,C114电容两端电压可以认为是0,CPU处于复位状态。3.3V电源通过R173给C114充电,当C114的电压升到CPU的高电平门槛电压时,CPU退出复位状态转入运行状态。0 N4 C0 f3 m' l. I% R
  在设计电路时,需要选择适当的R值和C值,以保证NRST低电平持续时间满足CPU复位最小脉宽的要求。
, H% \8 C; O8 ~; T- d  当按下S4轻触开关时,C114两端被短路接地,可实现手动复位CPU。  S* s. G* _7 g

6 p/ s. _) b  Y) b  ~4 M3 W% |14.3.2 复位序列' f( [, M3 c: O: K2 o$ @
前面第11章的13.3.1小节讲解了复位系列的相关知识,再结合本章节的上电复位和下电复位,大家会对其有一个较全面的认识,更多复位序列的知识直接看13.3.1小节即可。' n3 H% f( ~* A5 d
9 `5 d% o2 n; m% D# E+ b7 X
14.4 软件复位+ Z, L9 Z" A( _: x
除了上电和手动复位,程序设计设置中还经常要用到软件复位,即调用一条函数就可以实现复位功能。此函数已经由CMSIS软件包中的core_cm7.h文件提供,函数如下:
: x' f: ?+ T8 c1 b& ^" B6 ^& B/ c" }$ i* t8 q* }6 F" J4 j
  1. /**
    7 y+ ]9 Z3 F0 b. r' m
  2.   \brief   System Reset
    + I2 L. p& e- ~7 e
  3.   \details Initiates a system reset request to reset the MCU.5 G% `+ E# G& i: S( I
  4. */
    . s! @( _  p4 n, Q  O
  5. __STATIC_INLINE void __NVIC_SystemReset(void)
    / s: t" R* e: C3 F- g
  6. {0 Q% I2 X% w7 Q+ C! U; B
  7.   __DSB();                                  /* Ensure all outstanding memory accesses included
    1 E& Q: h9 \9 z
  8.                                               buffered write are completed before reset */8 M9 ~3 N; C. V) s: O6 l
  9.   SCB->AIRCR  = (uint32_t)((0x5FAUL << SCB_AIRCR_VECTKEY_Pos)    |
    3 M6 k$ E3 k5 h: E" i3 i* t
  10.                            (SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) |
    ' \) T4 t; ]" [! a+ m3 d0 p
  11.                             SCB_AIRCR_SYSRESETREQ_Msk    );        /* Keep priority group unchanged */: t9 ~) h9 D  r' H0 l
  12.   __DSB();                                                         /* Ensure completion of memory access */
    & V% m' N% P' \* J/ s( T3 ~
  13. 0 o; T$ l# U2 d  }1 @
  14.   for(;;)                                                          /* wait until reset */& W, ]( i1 T. q0 e: S! o: L
  15.   {
    $ F0 E4 \! @9 @0 C; c
  16.     __NOP();3 I9 b& n: M6 V2 m7 b' f* `+ h/ k
  17.   }
    . y/ C9 i1 j) J8 E
  18. }
复制代码

- v$ E6 D8 [' \. @! o3 ^" [9 O软件复位反映到实际硬件上,就是给硬件复位部分发一个复位信号:# ~/ f1 a4 G2 v
1 P- X1 g; u8 ~
aHR0cHM6Ly9pbWcyMDE4LmNuYmxvZ3MuY29tL2Jsb2cvMTM3OTEwNy8yMDE5MDQvMTM3OTEwNy0yMDE5.png
1 S% W: `5 Q, E) L% P; Y) r( g
( J" M, j, T7 f; O  y+ e% ]: J
14.5 RCC时钟控制
+ ?' E5 n* v: O0 YSTM32H7有如下六种时钟可供使用:3 Z' |3 {3 I6 Y# w( ]% C6 c- Z
2 M, K- T% ]; @0 Y- m
  HSI (High-speed internal oscillator) :- U; u& F3 T/ ~7 C# B) ]" L2 S6 q
HSI是内部的高速RC振荡器,频率64MHz,可被用于系统时钟。优势是低成本,无需外部时钟,快速启动(仅需几个微秒),缺点是精度差,即使经过校准。. t: S/ ?8 k. F( E7 Y; G

, o' s* [, {  k: q+ B, d7 p" J6 F  HSE (High-speed external oscillator):5 @) S" a; }/ F0 K+ [: \, _* L. n
HSE是外部的高速振荡器,通过外接时钟源,有源或者无源晶振驱动,时钟范围4-48MHz。优势是精度高,缺点是增加成本。
+ G! x# v' Y6 _. Z, `  i" a0 T5 X; C5 H' I* |' A$ i
  LSE (Low-speed external oscillator)" q( _/ r& t  T& C/ F* t+ W
LSE是外部的低速振荡器,通过外接时钟源,有源或者无源晶振驱动,一般接32.768KHz,主要用于RTC实时时钟。  x* ]. J* v0 W" L2 R0 c
, Q: i$ I2 |* C  u( P" l
  LSI (Low-speed internal oscillator)
, _: k7 l" C" s* [LSI是内部的低速RC振荡器,频率约是32KHz,主要用于独立看门狗和自动唤醒,也可以用于RTC实时时钟。
, e4 Q# T1 m# T! B) J2 w. R8 A+ Y8 U
% X7 W2 K$ k5 S$ Y! I2 r$ Y/ u  CSI (Low-power internal oscillator)( ]( P& e' O9 u
CSI是内部的低速振荡器,频率约是4MHz,相比64MHz的HSI,主要用于低功耗。& b# p5 `: F. y8 I3 I- ]

) i, `3 r# ]& m8 ]2 |& M- {  HSI48 (High-speed 48 MHz internal oscillator)

# ]# P7 {4 l/ O$ g5 D8 X* fHSI48是内部高速振荡器,频率约是48MHz,用于给特定的外设提供时钟,比如USB。& C( g" P, b( G0 ?( S6 k' Z
, _1 y) Y) w% I% V& P
通过下面的时钟树再进一步的认识这几个时钟:
$ O1 s% j1 h8 r- Y% [- F8 v) G- L- B) G2 K
aHR0cHM6Ly9pbWcyMDE4LmNuYmxvZ3MuY29tL2Jsb2cvMTM3OTEwNy8yMDE5MDQvMTM3OTEwNy0yMDE5.png
7 S6 |+ Y6 q% Q6 e, P3 ]

7 {$ g- z3 J% z. H) n3 U" Q14.5.1 HSE和LSE硬件设计
/ W9 ~* w+ n# J, F! q HSE时钟" S7 Y/ M" x8 N$ R0 {; V* y2 a
当前V7开发板是用的25MHz晶振为HSE提供时钟,硬件设计如下:
" ^2 ~% d4 _( b7 l( w& C! W( i2 T# ]( I
aHR0cHM6Ly9pbWcyMDE4LmNuYmxvZ3MuY29tL2Jsb2cvMTM3OTEwNy8yMDE5MDQvMTM3OTEwNy0yMDE5.png

& @7 D' {! `+ k0 \( v; Z& v2 Y
+ g  a' _0 F' _  g: F$ f晶振和负载电容需要尽可能近地靠近H7的晶振引脚,以减小输出失真和启动稳定时间。负载电容值必须根据选定的晶振进行调节。
: g/ _" m' b  k* A/ q4 P# R7 ^9 {$ ?
对于C15和C17,我们推荐使用高质量陶瓷电容,这种电容是设计用于需要高频率的场合,并且可以满足晶体或谐振器的需求。C15和C17通常具有相同的值。0 F0 A$ Y4 b- h& H& K# r

) s, h) }; s7 H9 f1 k这里再额外补充一个知识点,HSE旁路时钟和外置晶振区别:当前V7板子是采用的外置晶振模式,高速外部 (HSE) 时钟可以使用一个4到48MHz 的晶振 / 陶瓷谐振振荡器产生:8 E" m5 N: ]$ w. H

% k5 m: f% H! @5 I! t( @0 E
aHR0cHM6Ly9pbWcyMDE4LmNuYmxvZ3MuY29tL2Jsb2cvMTM3OTEwNy8yMDE5MDQvMTM3OTEwNy0yMDE5.png
, \5 y2 ~+ X* X$ \$ w3 S8 q8 C
% M5 d6 K# Q5 P& w
而bypass 旁路的意思就是不使用它,绕过它。具体到HSE旁路的话,用户直接提供4-50MHz的时钟源即可,可以使用有源晶振或者FPGA提供时钟等方式:5 u3 C2 m& y" J1 f

$ e$ ?5 C! [. g$ j
aHR0cHM6Ly9pbWcyMDE4LmNuYmxvZ3MuY29tL2Jsb2cvMTM3OTEwNy8yMDE5MDQvMTM3OTEwNy0yMDE5.png
1 [) X: h' e( j: N$ A3 K
* y3 M& a( e: R' a4 ?! r$ O# ^
  LSE时钟
; L9 Y: R+ |8 W' s& r当前V7开发板是用的32768Hz晶振为LSE提供时钟,硬件设计如下:
* j% J0 ^, M' v9 J' u" `! s4 `0 U( ~& B" b
aHR0cHM6Ly9pbWcyMDE4LmNuYmxvZ3MuY29tL2Jsb2cvMTM3OTEwNy8yMDE5MDQvMTM3OTEwNy0yMDE5.png
( A9 F: b: I! J8 w& R* [( ~

1 q- L9 v" k1 w: k7 D2 O7 O- ~" D7 Z1 p/ c3 c3 ?- I; A' Q. _  v
14.5.2 时钟配置  R3 V# D3 J" Z! [! q, K
STM32H7开发板使用的外部晶振频率是25MHz,下面分步说明如何让其通过这个频率工作到400MHz的主频。
& W- K' W' H  L- o0 x( K
0 D0 u$ J! J0 f. S  第1步:在stm32h7xx_hal_conf.h文件配置HSE_VALUE  R! `8 _. P/ t' w) ]
配置的大小要跟板子的实际晶振大小匹配。
( g$ d8 R9 o0 H
1 M& k3 R% X4 ~5 I. [+ |
  1. #if !defined (HSE_VALUE) : S1 L( {+ l% k$ X
  2. #define HSE_VALUE ((uint32_t)8000000) /*!< Value of the External oscillator in Hz */
    % M( Z( B+ I3 F" B
  3. #endif /* HSE_VALUE */
复制代码
3 o, m2 z1 ]0 u3 C# c
  第2步:系统上电后,在启动文件startup_stm32h743xx.s的复位中断服务程序里面会调用函数SystemInit。
& t  k1 c$ S) Z0 L* G" t" O; s5 [
  1. Reset_Handler    PROC) g1 T3 y# J! n- {- e! E/ N1 S3 H
  2.                  EXPORT  Reset_Handler                    [WEAK]
    ) g5 a) Y; Q' Z+ H$ {% @. f5 ~; D& N
  3.         IMPORT  SystemInit+ ]5 C- M+ e7 Q" k( |' F; z* x/ W
  4.         IMPORT  __main
      y% s* _$ O( N6 V5 F
  5. 2 \$ j; j) T  H
  6.                  LDR     R0, =SystemInit# q% W9 t- w0 p2 h
  7.                  BLX     R0* O8 D" Y" ?5 A- Y' e
  8.                  LDR     R0, =__main
    7 f2 X: u- S9 ~  D" r3 o, T
  9.                  BX      R0
      e; r! @; y# P9 k- Y  ?
  10.                  ENDP
复制代码

7 }; \6 \" S) a# D. j以往STM32F1和STM32F4系列都会在函数SystemInit里面配置PLL锁相环,使用了HAL后,需要在main函数里面配置。当前SystemInit函数实现的功能如下:% L- a4 [8 U; e: c7 ]* W

% i6 X" L+ o8 C; N* n! u6 C
  1. 1.        /**
    " C2 P' ~/ j5 _' E: v0 {8 g
  2. 2.          * @brief  Setup the microcontroller system8 ^( ]9 o4 ]. k1 B
  3. 3.          *         Initialize the FPU setting, vector table location and External memory6 x* w% }# \: A2 x0 x- e7 g
  4. 4.          *         configuration.3 a& c2 y* g! q# C2 y2 z
  5. 5.          * @param  None8 @1 H; H$ Y* g0 M0 s) ~
  6. 6.          * @retval None
    / w" Z. j4 b# y" P; W: B% p: e5 e
  7. 7.          */
    : p$ O) [% u, ?  |5 t; ~% Y/ K) p
  8. 8.        void SystemInit (void)
    & T! x! O+ A) b% P, H
  9. 9.        {8 t2 q4 f, J# i. [5 K/ L1 U
  10. 10.          /* FPU settings ------------------------------------------------------------*/7 [" R- c3 A0 y- z+ s) R2 |
  11. 11.          #if (__FPU_PRESENT == 1) && (__FPU_USED == 1)4 O0 b) @0 \, T4 G9 r% Y
  12. 12.            SCB->CPACR |= ((3UL << 10*2)|(3UL << 11*2));  /* set CP10 and CP11 Full Access */% B; x) [3 q  K3 C# _4 ?
  13. 13.          #endif& Z4 ?9 Y0 Y4 O" _% ?- Y( h
  14. 14.          /* Reset the RCC clock configuration to the default reset state ------------*/
    # g, ]* Z, k) Z
  15. 15.          /* Set HSION bit */2 U9 G+ ]) x/ p) J4 ]
  16. 16.          RCC->CR |= RCC_CR_HSION;
    0 x! g6 T+ Y/ ?: J" i  s
  17. 17.        
    " j. I7 s" i1 b2 ]4 h
  18. 18.          /* Reset CFGR register */
    * v8 ]3 B+ E: Y
  19. 19.          RCC->CFGR = 0x00000000;
    9 O0 T: W4 u4 J& Z3 }5 u9 a2 {
  20. 20.        
    ) g2 D! S/ e2 N3 t
  21. 21.          /* Reset HSEON, CSSON , CSION,RC48ON, CSIKERON PLL1ON, PLL2ON and PLL3ON bits */
    + t0 @9 h" W$ m& O1 g  f
  22. 22.          RCC->CR &= (uint32_t)0xEAF6ED7F;
    # z- J8 g- C  b5 T' J: @
  23. 23.        1 r/ i5 [7 T0 g1 X$ H9 g
  24. 24.          /* Reset D1CFGR register */
    , \2 }2 h* \3 q! T6 W- e; k
  25. 25.          RCC->D1CFGR = 0x00000000;/ i' q& P3 ]3 d: f$ Q
  26. 26.        ' n2 o( f) d2 s1 ~+ C" B8 s
  27. 27.          /* Reset D2CFGR register */* x; l. L0 e0 @- E5 S0 [% E6 W
  28. 28.          RCC->D2CFGR = 0x00000000;& j& x0 a& T5 T& z7 G
  29. 29.        / b: R8 g5 p( R/ N
  30. 30.          /* Reset D3CFGR register */4 [. @5 R; P$ H- A% C
  31. 31.          RCC->D3CFGR = 0x00000000;0 Y2 a. h' a$ O# P
  32. 32.        . H% `; c& X3 `) K& v! I5 ]" K% i
  33. 33.          /* Reset PLLCKSELR register */% n9 E) y' w% T
  34. 34.          RCC->PLLCKSELR = 0x00000000;; ~1 B& k) g& I0 `. ~- N
  35. 35.        
    " u$ D6 l- h# F* }
  36. 36.          /* Reset PLLCFGR register */
    7 ~3 c# x1 F" g) M4 ?: W# k3 g
  37. 37.          RCC->PLLCFGR = 0x00000000;
      f: J5 ]% r$ j; g3 q
  38. 38.          /* Reset PLL1DIVR register */9 X1 Z. d& \" o7 Q4 W
  39. 39.          RCC->PLL1DIVR = 0x00000000;" q. R" h: ?" u0 P
  40. 40.          /* Reset PLL1FRACR register */
    ' t( e1 k* B2 F9 h5 m1 I
  41. 41.          RCC->PLL1FRACR = 0x00000000;" _8 [! O% n$ k" V
  42. 42.        
    - Y6 `1 R# \, H, O- X8 m
  43. 43.          /* Reset PLL2DIVR register */( B4 x1 m: R- {9 T5 W9 @2 L: V7 ^! W
  44. 44.          RCC->PLL2DIVR = 0x00000000;4 ~  `; L' \9 {
  45. 45.        * l: |' O$ E9 Z; H  B0 b. k+ z  u
  46. 46.          /* Reset PLL2FRACR register */3 X/ R4 _9 |& D- z5 O$ M! @
  47. 47.        * A, r  p' n" r- ]4 d
  48. 48.          RCC->PLL2FRACR = 0x00000000;& ~' g$ Q1 d- J0 V$ [9 N2 }
  49. 49.          /* Reset PLL3DIVR register */8 W/ I2 Q: Y; O
  50. 50.          RCC->PLL3DIVR = 0x00000000;
    0 y2 Z: H  e4 C5 u' |/ G8 Q
  51. 51.        . \! d9 m* a+ |5 _
  52. 52.          /* Reset PLL3FRACR register */+ @* V5 o  @& B8 j8 O9 O
  53. 53.          RCC->PLL3FRACR = 0x00000000;& K( u7 g9 p# U
  54. 54.        * u9 J2 h5 W. V1 w
  55. 55.          /* Reset HSEBYP bit */9 ]% T, X" }+ P% A8 O
  56. 56.          RCC->CR &= (uint32_t)0xFFFBFFFF;
    " R9 B% p! ^2 n9 S* d* ~8 o3 l  G) k
  57. 57.        6 E% G, _# {& K7 e1 y  \* J5 X
  58. 58.          /* Disable all interrupts */+ u4 F( T: L. x9 G5 i7 e$ J7 d
  59. 59.          RCC->CIER = 0x00000000;6 |1 A3 c2 I  ]" P% `+ i
  60. 60.        9 R, V5 t+ U+ O  r3 z
  61. 61.          /* Change  the switch matrix read issuing capability to 1 for the AXI SRAM target (Target 7) */: g" l. p8 Y# d4 z* C
  62. 62.          *((__IO uint32_t*)0x51008108) = 0x00000001;
    % d- A/ f8 @6 Z
  63. 63.        # w' C! {0 }$ ?
  64. 64.        #if defined (DATA_IN_ExtSRAM) || defined (DATA_IN_ExtSDRAM); v; R4 g4 V) F6 N6 H8 c
  65. 65.          SystemInit_ExtMemCtl();1 d% s: }( p% T* q4 B
  66. 66.        #endif /* DATA_IN_ExtSRAM || DATA_IN_ExtSDRAM */, H* C; h; [2 e
  67. 67.        
      H  z/ y5 G: ?' v# q1 t
  68. 68.          /* Configure the Vector Table location add offset address ------------------*/9 \8 @) @8 e" B0 o4 B" ?, `
  69. 69.        #ifdef VECT_TAB_SRAM
    7 y- k. T. U8 V  V8 n
  70. 70.          SCB->VTOR = D1_AXISRAM_BASE  | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal ITCMSRAM */1 s7 {# T* u! e9 f
  71. 71.        #else
    9 ^- G$ r& y7 D
  72. 72.          SCB->VTOR = FLASH_BANK1_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal FLASH */
    - i4 w3 }0 i9 x( I" x" X
  73. 73.        #endif
    7 U" D: Z' e8 ^+ @, L
  74. 74.        
    , g* x: i( b0 O: @0 G
  75. 75.        }
复制代码
; q' z6 _  }" b0 Y) y& V& n
第12行:使能FPU单元。& W! L* K3 |; X# y1 F+ W4 u
+ P) u" b  `3 y5 q
第16 – 59行:复位RCC相关寄存器。
& u2 Y1 k: }/ G/ |% d  D2 G7 ^" J: E0 f8 q9 |
第69 – 73行:设置中断向量表的位置。4 L: t2 J% |* |
  B$ z5 K4 L+ Z  X
  第3步:在main函数的外设驱动初始化函数里面完成时钟初始化,主要是PLL锁相环,让芯片最终工作到400MHz。$ C! |6 z" ~5 R) `
14.6 总结% w4 ]" L3 C% g  z9 m9 b2 s1 U
本章节就为大家讲解这么多,本章节的知识点相对比较多,比较杂,不容易一下子都掌握了。随着后面章节的进行,还会深入的讲解这些知识点。
4 r5 O7 o+ S5 R# W0 O- B
+ _, M8 z, w& G" I9 |  t, p- p% h! L
: q' H2 T5 k$ x
aHR0cHM6Ly9pbWcyMDE4LmNuYmxvZ3MuY29tL2Jsb2cvMTM3OTEwNy8yMDE5MDQvMTM3OTEwNy0yMDE5.png
赞 收藏 1 评论0 发布时间:2021-12-20 17:00

举报

0个回答

所属标签

相似技术帖

官网相关资源

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