3.1 初学者重要提示 学习一款新的芯片,优先掌握系统框架是比较重要的,建议逐渐养成这种学习习惯,然后各个击破即可。 本章节提供了多张STM32H7的框图,这些框图都非常具有代表性。很多时候记忆知识点比较费脑子,记录这些框图是一种非常好的方式。8 i- S0 L6 u( {8 h2 c 对于本章节提供的部分知识点,无法理解透彻,暂时没有关系。随着后面的深入学习,基本都可以掌握。 重要的MPU和Cache知识分别放在了第23章和第24章。3 S4 d) _3 B" @2 @ 3.2 STM32H7硬件框图 学习一款新的芯片,需要优先了解一下它的整体功能设计。需要的资料主要是来自官网和数据手册,比如我们V7开发板使用的STM32H743XIH6,直接在官方地址:链接(这是超链接)就可以看到对此芯片所做的介绍,页面中有一个如下的框图,对于了解STM32H7整体设计非常方便。' A5 y# w5 w$ T3 y d- f: F5 M0 |5 a- n 1 S. S4 }$ B2 d% I: j5 ] ~ 再稍微详细点,就需要大家读页面上的”Key Features”,就是下图所示的内容: & H( N: `) c: @3 y+ b 或者直接看数据手册开头的章节即可,也进行了介绍,内容基本都是差不多的,如下图所示(部分截图): , a2 d! h2 x( q* m8 W) z, R0 I# E 通过框图和Key Features,大家可以方便地了解STM32H7的FLASH、RAM大小以及各种自带外设的信息。5 u z! ^ m% m) x( ^8 P " g3 A- j' A. R4 @; ~: `( [ 3.3 STM32H7各个型号的区别 涉及到芯片选型的时候,需要大家了解各个型号的区别。对此ST有一个专门的文件STM32H7x3 MCUs High-performance line,在链接(这是一个超链接)里面可以找到。此文件里面有简单的对比,只是内容比较简单,仅两页,不过也言简意赅。最主要的是下面的这个截图:0 e: z+ n0 u- R# ^& K / I& {, y( w$ `; f5 [% f' f: m 通过这个截图可以方便地了解不同型号的引脚数、封装、FLASH大小、RAM大小以及是否带HW CRYPTO硬件加密的区别。9 Q$ R. F' k) y6 F4 m; k S 9 q9 _9 L. n3 |% ^/ c" T 需要了解更详细的对比信息,可以看数据手册。任意下载一个型号的数据手册,在数据手册的的Table 2里面有详细的对比,如下图所示(部分截图):5 p: F E/ W- w2 I6 _6 V" W ' a x4 I ?% M7 L2 M' G/ r' [ 使用ST提供的软件STMCUFinder或者STM32CubeMX也可以做对比,只是没有上面的表格这么方便,可以一目了然。 3.4 STM32H7总线框图和时钟 STM32H7的数据手册里面提供了一张非常棒的框图,大家可以方便地查看每个总线的时钟速度和这个总线所挂的外设。这个在大家配置外设时钟分频的时候还是非常有用的,因为外设的时钟分频就是建立在所挂的总线速度(大家直接在数据手册里面检索Figure 1就可以找到)。/ Q: u) p! W8 z ! B: h+ S$ |$ _0 ?6 p' p " p8 U' a( K {9 G" E" S 比如我们想得到不同定时器的主频,通过上面的框图,可以方便地获得如下信息: SYSCLK(Hz) = 400000000 (CPU Clock)' \ l& p0 z, x e; r HCLK(Hz) = 200000000 (AXI and AHBs Clock) AHB Prescaler = 2 : H+ o7 R* B; c D1 APB3 Prescaler = 2 (APB3 Clock 100MHz)% Q$ c0 B3 R: m: ] * ?4 r% E8 I8 q* Q G D2 APB1 Prescaler = 2 (APB1 Clock 100MHz) D2 APB2 Prescaler = 2 (APB2 Clock 100MHz) D3 APB4 Prescaler = 2 (APB4 Clock 100MHz) 因为APB1 prescaler != 1, 所以 APB1上的TIMxCLK = APB1 x 2 = 200MHz; 因为APB2 prescaler != 1, 所以 APB2上的TIMxCLK = APB2 x 2 = 200MHz;4 Y, a1 {( w0 f: Q" Q* X ( L0 x3 A# O3 Q$ s3 ^ APB4上面的TIMxCLK没有分频,所以就是100MHz; ! }% @3 {# M8 L& m9 y0 k; X APB1 定时器有 TIM2, TIM3 ,TIM4, TIM5, TIM6, TIM7, TIM12, TIM13, TIM14,LPTIM1 APB2 定时器有 TIM1, TIM8 , TIM15, TIM16,TIM17+ P2 `9 c: g o% p. d APB4 定时器有 LPTIM2,LPTIM3,LPTIM4,LPTIM5+ c# p' D! g6 A4 N( v 6 _5 T2 ? R! q' ] T9 G F: f* A 3.5 STM32H7的AXI线 A**线在STM32H7中有着举足轻重的作用。高并发性全靠这个总线了,先来看下A**线的框架: * r+ K# T# \$ \; z) i9 i# V: l 3.5.1 总线系统框架 下面这个截图比较有代表性,可以帮助大家理解STM32H7总线系统。+ g. K$ R9 p/ r3 E9 j $ h8 a2 B; _/ h: p4 }0 K( l$ s, s 这个图可以方便识别总线所外挂的外设,共分为三个域:D1 Domain,D2 Domain和D3 Domain。 D1 Domain 5 {. c6 v8 Y4 ], x/ k6 S& t, Q0 C D1域中的各个外设是挂在64位A**线组成6*7的矩阵上。2 U8 w7 T1 q$ k 6个从接口端ASIB1到ASIB60 l0 a( s2 W! f 外接的主控是LTDC,DMA2D,MDMA,SDMMC1,AXIM和D2-to-D1 AHB 总线。 2 j9 D9 K; E# D8 n; V) U) ] 7个主接口端AMIB1到AMIB7, K: V1 A- X* W" y 外接的从设备是AHB3总线,Flash A,Flash B,FMC总线,QSPI和AXI SRAM。另外AHB3也是由A**线分支出来的,然后再由AHB3分支出APB3总线。 D2 Domain( L. R# T5 ~9 {7 F2 U+ K D2域的各个外设是挂在32位AHB总线组成10*9的矩阵上。% v, t# k7 x/ t6 M; I w) j 10个从接口: _; L2 \4 o: c; ^; p1 b 外接的主控是D1-to-D2 AHB 总线,AHBP总线,DMA1,DMA2,Ethernet MAC,SDMMC2,USB HS1和USB HS2。 9个主接口 外接的从设备是SRAM1,SRMA2,SRAM3,AHB1,AHB2,APB2,APB3,D2-to-D1 AHB总线和D2-to-D3 AHB总线。 D3 Domain8 j* x0 B- F) C* Y" \5 K/ ? 9 ]0 l. m U/ w& a, s5 V D3域的各个外设是挂在32位AHB总线组成3*2的矩阵上。$ h/ c, e! v; [" i: L9 Y4 l 3个从接口 外接的主控D1-to-D3 AHB总线,D2-to-D3 AHB总线和BDMA。 2个主接口/ n: u+ W! r9 A' G! j7 O6 ]1 x 外接的从设备是AHB4,SRAM4和Bckp SRAM。另外AHB4也是这个总线矩阵分支出来的,然后再由AHB4分支出APB4总线。: _; I' ^+ c2 B* Q- b) D3 L 这三个域之间也是有互联的,可以是:: H( s7 y6 D$ W7 { , N2 g9 w8 ]& y+ ?0 G7 N D1域到D2域的D1-to-D2 AHB bus 允许D1域中的主接口外设访问D2域里面的从接口外设。比如D1域里面的DMA2D访问D2域里面的SRAM1。 % u8 L7 Z! i0 w D2域到D1域的D2-to-D1 AHB bus6 g" b2 w7 p7 I$ m8 t( c 允许D2域中的主接口外设访问D1域里面的从接口外设。比如D2域里面的DMA2访问D1域里面的AXI SRAM。. R) {6 I8 u( y ; d# o2 D' o6 a2 z0 o D1域到D3域的D1-to-D3 AHB bus4 S V" w1 b0 u0 t" s 允许D1域中的主接口外设访问D3域里面的从接口外设。比如D1域里面的DMA2D访问D3域里面的SRAM4。9 y* Q; }! M5 ~5 a. P. g5 L; U D2域到D3域的D2-to-D3 AHB bus。: [( W5 A. h( E; D* i/ Y 允许D1域中的主接口外设访问D2域里面的从接口外设。比如D2域里面的DMA2访问D3域里面的SRAM4。 有了这些知识后,下面我们重点了解A**线矩阵。 ' J: P& M% w# `8 l8 U8 s- D# A 3.5.2 AXI线特色4 D: \- {% l( P AXI支持高频率、高性能的系统设计:9 u% j, N# ^, Y$ `7 g6 ? ( r: H7 }* F: D; {. |4 p4 Q* \ 支持高带宽,低延迟设计。# H0 B$ r1 p# _9 E# i+ i& p4 y. R 提供高频操作,无需复杂的总线桥。0 W% M" U2 o1 I* R 满足各种组件的接口需求。 适用于具有高初始访问延迟的内存控制器。. Z& G2 u2 x! Z5 c% X% i 为互连架构的实现提供了灵活性。7 C, M; C: E; W( X' R0 J 与现有的AHB和APB接口向后兼容。 / A1 m. j. I6 o5 V9 E AXI线的关键特性: 独立的地址、控制和数据线。( s5 v8 m# u+ F. z+ a5 p 支持非字节对齐方式传输。# @8 Z. p7 C- @1 m 基于起始地址的突发传输。 分开的读和写数据通道,且提供DMA传输。 支持发起多个地址。 支持无序传输。 允许添加寄存器,以提供时序收敛。 . c9 I' u& Y6 x* o- s : x: }, I5 |& c& X( U7 x& ^3 Z% ?4 v2 \ AXI线 3.5.3 AXI线简介 通过下面的框图,我们再进一步的认识一下A**线。 ; m: Q! s6 f/ D/ M9 `8 q0 c: S2 v 通过上面的截图,我们可以看到,A**线有6个从接口ASIBs(AMBA slave interface blocks)和7个主控接口AMIBs(AMBA master interface blocks)。9 g1 U/ s6 C: m* r1 | q& o, b4 j; g9 n3 ] 针对从接口ASIBs,描述如下: 重点注意最后一列,STM32H7参考手册里面原始的描述是R/W issuing,这里将其翻译为读/写发起能力。比如输入通道IN5连接的主控DMA2D,支持的读发起能力是2,写发起能力是1。读发起能力是2该如何理解呢?这里的含义是存在两路读信号同时进行(因为AXI接口有一个FIFO的功能,可供同时进行,更深入的认识有待研究),反映到DMA2D的实际应用中,就是DMA2D同时读取前景色和背景色的缓存区做Alpha融合之类的操作。写操作同理,DMA2D的写发起能力仅支持一路。 4 E: V# U0 x8 d* [8 ^1 ?* ~ 针对主控接口AMIBs,描述如下: / \: p& X- H! f+ M; k3 @ # g* k: [! }& V) {7 w 跟上面表格的含义是一样的,同样重点注意最后一列,这里多了一个总接收能力(Total acceptance),也就是读发起能力和写发起能力同时执行的情况。 3.5.4 AXI线优先级编程) P5 W o4 w, U1 N2 q% Z 由于存在多个ASIB从接口访问AMIB主控的问题,这就涉及到谁先谁后等问题。所以A**线矩阵就做了一个基于优先级的仲裁方案。每个ASIB接口支持读通道和写通道分别设置,优先级从0到15。数值越大,优先级越高,默认情况都是优先级0。如果有两个传输同时到达AMIB主控接口,那么优先级高的ASIB接口传输优先处理;如果优先级相同的话,根据LUR方案选择(least recently-used最近最少使用情况)。4 q$ \; Z3 t5 B) n . C8 b$ m' h0 V- a, n. t 大家在实际应用中,可以根据实际情况进行设置,一般情况下使用默认值即可。 G* Z8 M$ }0 }9 _5 F w% d# _* i! m0 ~5 T7 Q 3.6 STM32H7的总线互联- g6 }, R+ ~3 w. S STM32H7的总线矩阵四通八达,但不是任意Bus Master总线主控端和Bus Slave设备端都可以相互通信的: P/ A6 ^' ]+ G1 w$ A / U. B5 @: c6 E1 m; `0 z6 k8 |, M7 U 黑色加粗字体是64位总线(ITCM,DTCM,Flash A,Flash,AXI SRAM,FMC等),普通字体是32位总线。 访问通路(每个小方块里面的字符)" j2 k# I0 @, k2 m% N 任何有数字的表示有访问通路。/ L/ Q0 Y( }4 q, w8 } 短横杠“-”表示不可访问。 v6 W5 ~4 ~3 m0 y6 h 有灰色阴影的表示有实用价值的访问通路。% m& U H( O' b4 j! p4 c8 [' ` 表格中具体数值所代表的含义, V \3 X) p/ u! J; u 5 |& }2 k; Z7 p9 f D=direct % Z8 Y/ B4 J$ I( V, q# U, d4 L' C 1=via AXI bus matrix 2=via AHB bus matrix in D2 4 t# _( _: t6 E+ U) E4 g1 l 3=via AHB bus matrix in D39 _8 ^3 c# j0 B, U, I% H ! D+ s6 K2 a3 B) P/ z 4=via AHB/APB bridge in D10 ?& r0 M k0 B1 o 5=via AHB/APB bridge in D2 + k3 {, ~& |. |5 [/ P. ^ 6=via AHB/APB bridge in D38 J* Q( }" k! y+ I) L; j( `! A 7=via AHBS bus of Cortex-M7 多个数值组合 = 互连路径以数字的顺序经过多个矩阵或/和桥。" I# S; B+ Y' S2 T 5 V5 l: ?" z) i C& k2 u8 B" [6 e, C 总线访问类型) b8 L K5 ?/ d# a1 m+ m6 K " ], H$ J3 e" n* g1 U0 E, k 普通字体表示32位总线。 斜体表示32位总线主机端/ 64位总线从机端。 粗体表示64位总线。 # M- g" e, F2 K9 E# _ 当前要对这个图有个了解,后面章节讲解各个外设的时候要用到,比如DTCM和ITCM不支持DMA1,DMA2和BDMA,仅支持MDMA。 3.7 STM32H7的FLASH 首次学习STM32H7,要掌握以下几点认识即可:# t6 q' q3 c; z. B- G / C- p' |+ T0 r6 J/ O& g 1、双BANK,每个BANK的带宽都是64bits,如下图所示: 2、H7中Flash的延迟和主频关系。% n) m! R& w) S+ y) B v6 u 8 d p- L4 J( a; Z H7中已经没有F1和F4系列中的ART Chrome加速,通过H7中的Cache加速即可。具体延迟数值和主频关系如下: % d+ ~" I6 t6 S 对于上面的表格,大家可以看到,当延迟等待设置为0的时候,即无等待,单周期访问,速度可以做到70MHz。增加1个Flash周期后,访问速度可以做到140MHz。当增加到3个或4个Flash周期后,最高速度可以做到225MHz。 3、Flash编程操作(写)最好以256bits为单位进行,应用中也可以小于256bits,但是容易造成ECC校验出问题,所以不推荐。Flash读操作支持64bits,32bits,16bits和8bits。 $ U# U$ _; U% |3 V 4、Flash支持ECC校验,每256bits配10bit的ECC位,可以检测到1个bit并纠正或者检测2个bit。随着芯片的制造工艺水平越高,带电粒子能产生的位翻转就越多,此时的ECC是必须要有的,一般可以纠正1-2个bit。安全等级高的Flash类存储器和RAM类都是必须要带ECC的。. D8 n+ ?+ P5 W. a5 w7 m# I5 \ 7 D: C7 T2 ~2 { 3.8 STM32H7的RAM; S: h2 t/ ` ~5 k4 V (注,学习本小节,优先回顾本章节3.5.1小节的框图,另外H7的RAM区也是支持硬件ECC的) STM32H7的RAM区分为好几个部分,下面分别进行说明: TCM区( h) _5 b# m* t" z4 \) y$ h# p 8 K9 o0 F2 S* L TCM : Tightly-Coupled Memory 紧密耦合内存 。ITCM用于运行指令,也就是程序代码,DTCM用于数据存取,特点是跟内核速度一样,而片上RAM的速度基本都达不到这个速度,所以有降频处理。 1 z" K( C- j2 B' W8 m | 速度:400MHz。 DTCM地址:0x2000 0000,大小128KB。 ITCM地址:0x0000 0000,大小64KB。 0 Z" z& E. n7 [) T4 t& d! H1 B AXI SRAM区3 S) Q4 T, I& z 位于D1域,数据带宽是64bit,挂在A**线上。除了D3域中的BDMB主控不能访问,其它都可以访问此RAM区。 % ^% C5 d; {1 ]$ H0 J+ g 速度:200MHz。 * s/ B; U9 s* @& T1 ~ 地址:0x2400 0000,大小512KB。4 z1 p+ ~8 ~) |# q; k 9 ?1 v% P L% `) R6 }) C 用途:用途不限,可以用于用户应用数据存储或者LCD显存。 SRAM1,SRAM2和SRAM3区* U- ?+ Y) I8 d + K! w" F5 ^2 l2 _0 ^* d, W7 V 位于D2域,数据带宽是32bit,挂在AHB总线上。除了D3域中的BDMB主控不能访问这三块SRAM,其它都可以访问这几个RAM区。 速度:200MHz。 SRAM1:地址0x3000 0000,大小128KB,用途不限,可用于D2域中的DMA缓冲,也可以当D1域断电后用于运行程序代码。, r2 e% I( `( h D. g, c* | 9 e9 ]0 u' F: u4 {5 {' {) l+ v SRAM2:地址0x3002 0000,大小128KB,用途不限,可用于D2域中的DMA缓冲,也可以用于用户数据存取。 SRAM3:地址0x3004 0000,大小32KB,用途不限,主要用于以太网和USB的缓冲。5 w* I$ q& _9 ~0 ~9 h2 W SRAM4区 , f: h1 d" U3 J2 z! n 位于D3域,数据带宽是32bit,挂在AHB总线上,大部分主控都能访这块SRAM区。 ! D. r9 l$ x) t3 r. c 速度:200MHz。 地址:0x3800 0000,大小64KB。2 ^( F2 \: e: y1 K7 D% }( q 9 e6 f0 ]8 ?! g* ]1 m4 W" B) i4 N 用途:用途不限,可以用于D3域中的DMA缓冲,也可以当D1和D2域进入DStandby待机方式后,继续保存用户数据。 " S! t' q. T3 n3 e Backup SRAM区 . ^9 c3 K" E# N3 I 备份RAM区,位于D3域,数据带宽是32bit,挂在AHB总线上,大部分主控都能访问这块SRAM区。 # h8 Y$ Y" S: F9 X 速度:200MHz。) ?% h% I# j4 P+ w * [1 C% o6 o( K0 c" d$ y8 {& o8 T 地址:0x3880 0000,大小4KB。' p4 s3 y- @# S. }# H - D! _5 x6 Y2 F: [& ]3 S4 J! m, e! H+ [ 用途:用途不限,主要用于系统进入低功耗模式后,继续保存数据(Vbat引脚外接电池)。* B; B' _' `3 V' `7 Z# m) ~& _+ p3 J 3.9 总结 本章节就为大家讲解这么多,让大家对STM32H7有个整体的认识,后面章节将逐个进行学习。 7 O- \* s2 ^6 s |
stm32使用定时器触发dma传输,启动dma没反应的几种情况的解决方法
【Wio Lite AI视觉开发套件】+cube.ai与食物识别
【STM32H7S78-DK】汽车仪表系统
【STM32H7S78-DK】基于 rtthread 适配 lcd 驱动移植 lvgl
【STM32H7S78-DK评测】TouchGFX (QR Code)二维码生成器
【STM32H7S78-DK】rtthread 增加 psram 内存管理
【STM32H7S78-DK】开箱与rtthread工程初体验
【STM32H7S78-DK评测】-5 LVGL&DMA2D DEMO测试
【STM32H7S78-DK评测】-4 LTDC&DMA2D 基本测试
【STM32H7S78-DK评测】CoreMark移植和优化--兼记printf重定向实现方法及常见问题