STMCU小助手
发布时间:2022-3-23 14:00
|
F1 代表了基础型,基于Cortex-M3 内核,主频为 72MHZ,F4 代表了高性能,基于 Cortex-M4 内核,主频 180M,F7 代表了高性能,基于 Cortex-M7 内核,主频 216M。H7 代表了超高性能,基于 Cortex-M7 内核,主频400M + A5 F, X, P& ?* j& W
我们今天说的就STM32H7超高性能系列的这个MCU 如果您是初学者的话,建议先看下这篇,会对时钟树有一个基本的认识 首先我们来看下H7的时钟树,乍一看很大,比F1多了太多东西,那我们仔细看,发现也还是很多,别担心,那么接下来我将带你了解下整体的时钟树原理以及各个模块的分析。
因为整体框图太大,所以我们把他分成几部分来分析,首先看下外部输入的时钟源:9 l! q. N: @& {5 C& d# `1 ~$ P ) K' Y5 }9 Q4 ~; x 外部时钟源3 e G H! X$ E9 x* f! U, L; B* | STM32H7共有6个外部时钟源,分别是:, s$ m, h5 Y3 @% g, L1 Q' q: f , a* G. `0 T( R HSI(高速内部振荡器)时钟:~ 8 MHz、16 MHz、32 MHz 或 64 MHz HSE(高速外部振荡器)时钟:4 MHz 到 48 MHz# y% F" r3 i7 }1 e3 w0 a5 B3 x LSE(低速外部振荡器)时钟:32 kHz# F7 ^4 @5 f" k5 q% P: H. T; n LSI(低速内部振荡器)时钟:~ 32 kHz CSI(低功耗内部振荡器)时钟:~ 4 MHz. G! D6 n. a/ Y4 {1 d# i HSI48 (高速 48 MHz 内部振荡器)时钟:~48 MHz% v5 }0 K, R% E* _/ K" m LSI: b: k/ d1 H% U" ] LSI 属于 STM32H7 内部低速时钟源,频率约为 32Khz。8 G7 I- G! m% r8 r3 ?* y LSI 可作为低功耗时钟源保持运行,供独立看门狗 (IWDG) 和 RTC时钟/自动唤醒单元 (AWU) 使用6 B5 S8 C+ w8 Z P1 ]1 A5 x% {9 m* u5 ^8 N, D LSE LSE 则是外部低速时钟源,常用为 32.768Khz(使用 32.768Khz 晶振或陶瓷谐振器生成)8 p/ Q) L0 ^5 R 可作为实时时钟 (RTC) 的时钟源来提供时 钟/日历或其他定时功能,具有功耗低且精度高的优点- {$ x5 ?2 h3 W/ T; |" k HSE& V+ A) L" ?4 R l( \) K HSE 是外部高速时钟,正常我们都用HSE来作为系统时钟输入,常用25Mhz的外部晶振。, i2 d& Z& u2 K4 @ N- v% P. ]9 B, c 系统进入停止或待机模式时,HSE 会自动由硬件禁止 HSE 时钟可被驱动到 MCO1 和 MCO2 输出,以及用作其他应用组件的时钟源# D/ @+ n4 g- Z$ w; n$ V ; `2 ~" i w9 Y7 U HSI+ d( B# a# i* _/ o. Z HSI 是内部高速时钟,频率为 64Mhz;" v% a0 Z5 V0 w! l 可直接用作系统时钟、外设时钟或 PLL 输入4 f' H2 `( b1 q& V. I) Z 可使用 HSIDIV预 分频器来选择 8 MHz、16 MHz、32 MHz 或 64 MHz 的 HSI 输出频率4 Y7 R- c5 N4 Z* @2 Z CSI- Y# o$ V6 J8 S2 c0 r. m. W CSI 是低功耗内部时钟,频率为 4Mhz;3 S D4 Z" h) h) Q$ n& j 可直接用作系统时钟、外设时钟或 PLL 输入 CSI的频率极低,即使经过频率校准后,CSI 频率也不如外部晶振或陶瓷谐振器的频率精度高,其优点就是功耗低。 4 A3 F) B6 w4 O* `; [ CSS (Clock security system) 时钟安全系统,也就是监控系统,H7的HSE和LSE两个外部时钟源带有安全监控,一旦使能后,如果 HSE 或LSE启动失败,系统时钟将切换到 HSI。如果使能了中断的话,将进入不可屏蔽中断 NMI。 HSI487 N, M8 D( ?; U3 S HSI48 是内部高精度时钟源,频率为 48Mhz; 其提供的 48 MHz 时钟可直接用作某些外设的内核时钟 主要用于通过特殊时钟恢复系统 (CRS) 电路为 USB 外设的时钟源使用( \$ q* G# M* {6 z 好的,通过上述的介绍,你应该明白了H7的几大时钟源,那么这些时钟源后续要被用在哪里,我们再来分析 IWDG, RTC,AWU 上半部紫罗兰色框的部分,就是独立看门狗 (IWDG) 和 RTC时钟/自动唤醒单元 (AWU) 独立看门狗 (IWDG)只能由LSI 提供 RTC和AWU可以由LSE LSE 和 HSE的1M分频来作为时钟源 + K; B, L3 k& R 锁相环PLL PLL(Phase Locked Loop): 为锁相回路或锁相环。总体上起到晶振频率倍频的作用,为系统高速率运行提高必要条件。 |( u+ ?! h/ w" g VCO(voltage-controlled oscillator):压控振荡器,是PLL 里的一个构成部件8 V7 j, T- v2 y" I9 u
7 q5 q' R& Y+ s, u! f( w$ s3 ~ STM32H7一共有三个PLL锁相环:8 `$ N- u/ s/ ?. m% x 一个主 PLL (PLL1),通常用于为 CPU 和某些外设提供时钟。 两个专用 PLL(PLL2 和 PLL3),用于为外设生成内核时钟。- i3 x( x# t+ `1 Y/ g% _- T PLL的输入时钟源为refx_ck,并且为 PLL 提供的参考时钟的频率 (refx_ck) 必须介于 1 MHz 到 16 MHz 范围内, |, n1 S0 v: Y 其中HSI CSI HSE三个时钟源可以作为输入,然后经过PLL时钟源选择器PLLSRC,该选择器主要选择使用哪一个振荡器作为时钟源,再经过DIVMx分频得到1 MHz 到 16 MHz 的时钟频率,我们一般选择 PLL 时钟源来自 hse_ck,一般为 25Mhz' o Y% e: n6 T- s0 \ 6 {' D4 J' b* q% l DIVMx LLx时钟源预分频器,用于对PLLSRC选择的时钟源进行分频,取值范围是:2~63. E! L5 ]1 i0 X" n+ F" X/ M% L3 Z# P! B: U0 U+ h* }2 g PLL19 A. ?; b6 [% D1 Z& O PLL1 锁相环,该 PLL 主要用到两路输出:pll1_p_ck 和 pll1_q_ck,其中:pll1_p_ck一般用于 sys_ck 系统时钟的时钟源,最终作为 CPU、SysTick、AXI、AHB1~4 和 APB1~4 等的时钟源;而 pll1_q_ck 则可以通过 PKSU 选择作为部分外设的内核时钟(perx_ker_ck),如 FMC、QSPI、SDMMC1/2 等,至于图中的 pll1_r_ck,并没有用到。) k! l+ H1 X4 `5 |( ], o DIVN1 是主 PLL1 vco 的倍频系数,其取值范围是:4~512; DIVP1 是 PLL1 的 P 分 频,用于得到 pll1_p_ck 的频率,其取值范围是:2、4、6…128(必须是偶数);1 o+ M) R1 o; f# }% r DIVQ1 是 PLL1的 Q 分频,其取值范围是:1~128; DIVR1 则没有用到; FRACN1 是分数倍频系数,它和 DIVN1一起组成 PLL1 的倍频系数,但是我们一般并不需要用到分数倍频 0 E+ j" ~& z7 x 这里以 pll1_p_ck为例,简单介绍下 PLL 输出频率的计算公式(时钟 PLL 输入频率为 hse_ck): B0 W! v; K* a* S& k& c1 c4 d
7 A3 C! F+ m! c! K5 C4 F 假设外部晶振为 25Mhz,我们需要得到 400Mhz 的 pll1_p_ck 频率来作为系统时钟,则可以设置:DIVM1=5,DIVN1=160,DIVP1=2 即可3 }! l* @4 l" E/ c: K! |3 z& ? PLL2和PLL3跟PLL1类似,这里我们不再赘述。 系统时钟3 D0 J* B" y6 j! h9 d+ N5 P 系统复位后,会自动将 HSI 选作系统时钟,并且所有 PLL 均将关闭。 ,也就是每次系统复位,都会用HSI作为系统时钟,当系统稳定后,可以配置好 PLL1 ,将系统时钟可以切换为 plll1_q_ck(400Mhz),以得到最高性能 # \/ Z# e; D- F' r2 U6 i! p; ?. u- d& H; L 当时钟源用于系统时钟时,软件无法关闭所选时钟源,也就是系统时钟软件无法禁止: a2 C4 u+ P. O, w & l- z( g! o6 a4 q
SCGU(System Clock Generation Unit,系统时钟生成单元),用于将 sys_ck 分成各种 时钟频率,比如:CPU 频率、SysTick、AXI、AHB1~4 和 APB1~4 等。0 B4 S- S1 F* H9 u SCEU(System Clock Eable Unit,系统时钟使能单元),用于使能各个外设、总线等的时钟,是一个时钟开关。 下面我们来对系统时钟的生成做一个详细的介绍:
" d5 U4 f' I2 K* Y8 _ 上图主要列出了 STM32H743 系统时钟的生成原理,包括 CPU 时钟、SysTick 时钟、AXI时钟、AHB1~4 和 APB1~4 等,这些时钟对整个系统运行来说非常重要,图中,D1、D2 和 D3 域是 ST 为了支持动态能效管理,所设计的 3 个独立的电源域,每个域都能独立开启/关闭。系统时钟由 SCGU 产生,然后经过 SCEU 做开关,最终输出到各个时钟域(D1、D2 和 D3),从而能够控制和访问各类外设,保证系统的正常运行。 ( r/ F' o* H- R! e# N, i6 i3 t7 o) r SCGU 输入时钟(sys_ck),该时钟我们一般选择来自 pll1_p_ck,频率为 400Mhz/ I' Y/ t6 D) m8 h: y0 t: d DICPRE:sys_d1cpre_ck 时钟的分频系数,取值范围为 1~512,通过 RCC_ D1CFGR 寄存器的D1CPRE[3:0]位设置,我们一般设置为 1 分频,以得到最高的 sys_d1cpre_ck 频率,400Mhz! u5 J) y' X* |/ W3 q 经过HPRE分频后给AXI时钟等外设使用,注意这里最高频率为200Mhz,也就是大部分外设的最高频率为200Mhz,所以sys_ck为400Mhz时,HPRE最少为2分频。5 V. d$ f% u* x& t- c 给HRTIM做时钟使用,频率可达400Mhz CPU 时钟(rcc_c_ck、rcc_fclk_c),CPU 时钟是直接来自 sys_d1cpre_ck,没有分频器,频率为 400Mhz# p- Q' d, x* x: t SysTick 时钟分频器(固定 8 分频),这个在图中是有错误的,实际上这个分频器是没有的(硬件 bug),因此 SysTick 的时钟频率,直接来自 sys_d1cpre_ck,频率为 400Mhz系统时钟) X+ A8 N) }4 d0 i) H/ O 使能单元(SCEU),它能够对 D1、D2 和 D3 域内的所有外设时钟进行开/关控制,所以在使用外设的时候,必须设置 SCEU,使能其时钟,否则外设无法使用,也就是配置各个外设时钟的使能ENR D1 域,是高性能域,主要为CPU时钟和AXI外设,AHB3外设 D2 域,通信接口域,主要进行数据通信工作,减轻 CPU 的负担。此域包括:AHB1、AHB2、APB1 和 APB2 等时钟部分。5 N( T" T3 {% e/ J& r- Y( G+ y/ K D3 域,数据批处理域,此域包括 AHB4 和 APB4 等时钟部分# q, D: p/ N; X! V ) M; v8 J8 R( f) @8 n4 Q9 x MOC1/MOC2- }7 S2 e% U7 e1 T5 |# d 两个时钟输出 (MCO) 引脚可供使用,分别为 MCO1 和 MCO2。可以为每个输出选择一个时钟源。 GPIO 端口必须在复用功能模式下使用MCO。 MCO 输出提供的时钟频率不能超出最大引脚速度 MCO1 可以在 PA8 引脚输出$ }5 k3 y3 G) U8 Z. K+ o( A MCO2 可以在 PC9 引脚输出6 @* U8 v8 O# \2 n: q3 f ) K* [ f; P9 `+ w8 G; h; h PKSU/PKEU- Q! l/ `2 ~4 l. j) u/ Q: @ SCEU :用于控制外设的访问时钟(访问寄存器) PKEU: 用于控制外设的内核时钟(生成控制时序,如波特率等) : [+ K$ A; P) j" [ 并不是所有的外设都需要用到 PKEU,因为有些外设并不需要生成时序,没有所谓的外设内核时钟,比如 DMA、OPAMP 等,这些外设只需要在SCEU 进行使能即可1 G" i" p' ~8 q- i+ W 下图是详细的外设时钟使能框图
, h: u: ^$ p: }( U 上半部分的SCGU跟SCEU已经讲过,这里我们只说下下半部分:( R; H3 A9 F& c: C, ? 外设内核时钟选择单元(PKSU,即:Peripheral Kernel clock Selection Unit),用于选择某个外设的内核时钟来源,具体的选择关系。 外设内核时钟使能单元(PKEU,即:Peripheral Kernel clock Enable Unit),此部分将PKSU处选择的外设内核时钟进行使能/禁止操作,最终控制是否输出内核时钟(rcc_perx_ker_ck)给外设。. O5 ?0 |! Z9 m3 J7 I! W. M 内核控制逻辑(Kernel Control Logic),用于控制 PKEU 是否输出内核时钟给外设,它有很多控制信号,其中我们常用的是 PERxEN,通过这个位的设置就可以控制具体外设内核时钟的开/关。 外设内核时钟(rcc_perx_ker_ck),该时钟用于驱动外设产生时序,如波特率、时钟脉冲等。大部分外设都需要用到 rcc_perx_ker_ck,比如串口、SPI、IIC、FMC、SAI、LTDC 和CAN 等。 这里推荐一张STM32H7 的数据手册里面非常棒的框图(在数据手册里面检索 Figure 1 就可以找到),可以对H7的整体架构有一个直观的了解,可以看到每个外设所挂的总线,和各个总线的最大时钟频率。9 ]4 y9 K1 g" B# \ ( [# ~* Z% c8 b" i9 P AHB (Advanced High-performance Bus) 高级高性能总线2 e+ x, m' [& T0 Q+ Y APB (Advanced Peripheral Bus) 高级外围总线( M1 Q' A% `# |' s AXI (Advanced eXtensible Interface) 高级可拓展接口 AHB主要是针对高效率、高频宽及快速系统模块所设计的总线,它可以连接如微处理器、芯片上或芯片外的内存模块和DMA等高效率模块。, B5 I e. O4 V2 I1 ~6 N" m, q APB主要用在低速且低功率的外围,可针对外围设备作功率消耗及复杂接口的最佳化。APB在AHB和低带宽的外围设备之间提供了通信的桥梁,所以APB是AHB或ASB的二级拓展总线。 1 \6 ?+ S* _# y7 }' @ AXI:高速度、高带宽,管道化互联,单向通道,只需要首地址,读写并行,支持乱序,支持非对齐操作,有效支持初始延迟较高的外设,连线非常多。 ! z" G; `+ C1 `9 ?# |0 q0 w4 u! k 这些内容加起来就定义出一套为了高性能SoC而设计的片上通信的标准。0 R: y( H( }9 @7 A# b7 e" G 0 c. i8 K3 [0 m
比如你可以看到SYSCLK(Hz) = 400MHz (CPU Clock) 也就知道上述CPU框图初的错误 可以看到CPU外挂了一个 64bit的 AXI BUS 还有一个32bit的 AHB BUS- X. i' R4 V2 r2 V" p1 F: H 6 B% A( z6 l t* G, ]2 I3 C6 K8 U7 H FLASH FMC QSPI 这些都是在AXI总线上的/ v: Q1 P' Z* H* F/ F7 E9 I! [ 常用的 TIM UART SPI IIC挂在AHB总线上0 G7 M% X( L5 _ } 3 |8 S) h" C: ]2 t9 ~- K9 i 64位的AXI总线又分出了一个32位的 AHB4 等等2 E' {4 x5 C2 Z0 W: a/ \* ^0 D4 P7 g 3 j W1 C4 W2 V# Q$ h; y 右下角的是时钟的框图,可以看到RTC时钟 看门狗时钟 % Z: r0 z; w% O$ f& h 可以看到HSE的时钟是4-48Mhz 然后给APB4总线外挂 经过三个PLL锁相环 再做外部输出* d0 w2 F7 ^9 Q/ j. U" \ , [9 m% t8 R+ t4 R
再比如200Mhz的AHB4经过分频生成了APB4最高位100Mhz- b4 s2 v* l, h. e % X3 p, }' R, s6 e. c( z/ o* a
8 Y* e* ?3 \; U) O, @, L% ~% P APB1 定时器有 TIM2, TIM3 ,TIM4, TIM5, TIM6, TIM7, TIM12, TIM13, TIM14,LPTIM1( w) `6 N4 q/ G$ p# d5 C0 I M, ~ APB2 定时器有 TIM1, TIM8 , TIM15, TIM16,TIM173 Q) w& `* s2 m6 b: \4 }# W9 g5 W APB3 上有 LCD-TFT FIFO* N2 b2 @3 }- B) w$ b0 _" V APB4 定时器有 LPTIM2,LPTIM3,LPTIM4,LPTIM50 i3 v6 B; {0 o3 q7 | 还有下面的总线系统框架 B4 _% j( \3 A U s0 g8 K
4 Q0 J( ` k( S e 可以很清楚的看到外设共分为三个域:D1 Domain,D2 Domain 和 D3 Domain。 ◆ D1 Domain D1 域中的各个外设是挂在 64 位 AXI 总线组成 6*7 的矩阵上。9 w* m h6 }/ [8 j+ y ] 6 个从接口端 ASIB1 到 ASIB6 外接的主控是 LTDC,DMA2D,MDMA,SDMMC1,AXIM 和 D2-to-D1 AHB 总线。 8 U# p9 i2 A3 a i- h- x) { 7 个主接口端 AMIB1 到 AMIB7 外接的从设备是 AHB3 总线,Flash A,Flash B,FMC 总线,QSPI 和 AXI SRAM。 AHB3也是由 AXI 总线分支出来的,然后再由 AHB3 分支出 APB3 总线。 ' Q1 k. t6 `8 E4 x' w 7 k- \9 H, P/ h5 C& Z* @0 G ◆ D2 Domain, @, {7 ?% r m' E0 R D2 域的各个外设是挂在 32 位 AHB 总线组成 10*9 的矩阵上。 10 个从接口外接的主控是 D1-to-D2 AHB 总线,AHBP 总线,DMA1,DMA2,Ethernet MAC,SDMMC2,USB HS1 和 USB HS2。 9 个主接口外接的从设备是 SRAM1,SRMA2,SRAM3,AHB1,AHB2,APB1,APB2,D2-to-D1 AHB总线和 D2-to-D3 AHB 总线。$ p0 _4 |" q7 E8 [$ M" j6 T; a: \ ) G8 }; u2 W% A, _$ o# V1 {6 J ◆ D3 Domain& [- k1 d6 b; I( @ D3 域的各个外设是挂在 32 位 AHB 总线组成 3*2 的矩阵上。# E7 d# w1 d- Z, U+ Z/ G5 g, a 3 个从接口外接的主控 D1-to-D3 AHB 总线,D2-to-D3 AHB 总线和 BDMA。) {5 A5 d7 |( Y; r6 y6 F R7 [6 q 2 个主接口外接的从设备是 AHB4,SRAM4 和 Bckp SRAM。另外 AHB4 也是这个总线矩阵分支出来的,然后再由 AHB4 分支出 APB4 总线。! m0 p' o) Y5 b8 @8 m& F V O) H* e; g2 A B/ I- ^1 w |
【 逢7发帖赢大礼】1、利用CubeMX生成正点原子H7R7开发板的STM32CubeIDE工程
【STM32H735G-DK测评】ADC3+TIMER1+DMA 采样模拟信号
【STM32H735DK测评】Ethernet+lwip DHCP获取IP地址
STM32H743基于CubeMx5.0配置手册
【STM32H735G-DK测评】lvgl移植
【STM32H735G-DK 测评】STM32H735G-DK External Loder 编译和测试
【福利三:逢7发帖赢大礼】使用MPU6050模块、img_dsc、img_btn机制实现一些简单有趣的动画效果
【福利三:逢7发帖赢大礼】使用arc弧形拉条控件控制PWM舵机及使用SPI3接口操作NRF24L01模块进行无线通信
【福利三:逢7发帖赢大礼】调试nucleo-WBA65RI工程测试样板的一些心得
【福利三:逢7发帖赢大礼】lv_timer和BME680实现温度、湿度、气压数据读取
微信公众号
手机版