1 什么是AHB、APB?
AHB(Advanced High-performance Bus)高速总线,接高速master,APB(Advanced Peripheral Bus)外设总线,用来接低速slave,一个master可以有多个slave,AHB和APB之间通过一个AHB2APB桥转接。
1.1 什么是主模块(master)、从模块(slave)?
主模块是向从模块发出读写操作的模块,如CPU、DSP等。
从模块是接受主模块发来的命令并做出反应的模块,如片上的RAM,AHB/APB桥接器等。
另外,还有一些模块同时具有两种属性,比如DMA(直接存储器存取),在被CPU编程时是从模块,但在后续传输数据时是主模块。
1.2 什么是总线?
总线是计算机系统中连接各个部件的信息通道,通过总线可以传输数据信息,通过总线矩阵管理总线之间的通信。早期的计算机系统没有总线的概念,各个部件之间分别连接,造成信息通路复杂,不宜维护与扩展。
1.3 什么是总线矩阵?
总线矩阵(Bus Matrix)是嵌入式系统中常见的组件之一,它通常用于连接多个总线并管理它们之间的数据传输。总线矩阵的作用:管理总线之间的通信,总线矩阵用于主控总线之间的访问仲裁管理。仲裁采用循环调度算法。总线矩阵可以被视为一种交叉开关,它可以根据需要将数据传输从一个总线切换到另一个总线,从而允许系统中的不同组件之间进行灵活通信。
2.芯片中的总线
与电脑相比,内核与外设就相当于电脑的CPU与主板、内存、显卡等。CPU与外设之间通过各种总线连接,其中驱动单元总线(CPU部分)有4个,被动单元总线(外设部分)有4个。
芯片(这里指内核,或者叫CPU)和外设之间通过各种总线连接,其中驱动单元有4个,被动单元也有4个 。为了方便理解,我们都可以把驱动单元理解成是CPU部分,被动单元都理解成外设。 下面我们简单介绍下驱动单元和被动单元的各个部件。
该图为 STM32F10xx系统框图 ,下面对该图进行详细解释:
1.ICode总线
ICode中的I表示Instruction,即指令。我们写好的程序编译之后都是一条条指令,存放在Flash中,内核要读取这些指令来执行程序就必须通过ICode总线,它几乎每时每刻都需要被调用,是专门用来取指令的。
2.驱动单元
2.1 Dcode总线
DCode中的D表示Data,即数据,这条总线使用来取数据的。我们在写程序的时候,数据有变量和常量两种,常量就是不变的量,在c语言中用const关键字修饰,是放在内部Flash中的;变量是可变的量,不管是全局变量还是局部变量都放在内存的SRAM中。因为数据可以被Dcode总线与DMA总线访问,为了避免冲突,在取数的时候要经过总线矩阵来仲裁,决定哪个总线读取数据。
2.2 System总线
System(系统)总线主要是访问外设的奇存器,我们通常说的寄存器编程,即读写寄存器都是通过这根条统总线来完成的。
2.3 DMA 总线
DMA 总线也主要用来传输数据,这个数据可以在某个外设的数据寄存器中,可以在SRAM 中,也可以在内部的Flash 中。因为数据可以被 DCode 总线和 DMA 总线访问,所以为了避免访问冲突,在取效的时候需要经过一个总线矩阵来仲裁,决定哪个总线取数。
3. 被动单元
3.1 内部的闪存存储器
内部的闪存存储器即 Flash,我们编写好的程序就放在这个地方,内核通过 ICode 总线来取里面的指令。
3.2 内部的 SRAM
内部的 SRAM,即我们通常说的RAM,程序的变量、堆栈等的开销都基于内部的 SRAM。内核通过DCode 总线来访回它。
3.3 FSMC
FSMC的英文全称是Flexible static memory controller,叫灵活的静态的存储器控制器, 是STM32F10xx中一个很有特色的外设, 通过FSMC,我们可以扩展内存,如外部的SRAM,NANDFLASH和NORFLASH。但有一点我们要注意的是,FSMC只能扩展静态的内存, 即名称里面的S:static,不能是动态的内存,比如SDRAM就不能扩展。
3.4 AHB 到 APB 的桥
从AHB总线延伸出来的两条APB2和APB1总线,上面挂载着STM32各种各样的特色外设。我们经常说的GPIO、串口、I2C、SPI这些外设就挂载在这两条总线上, 这个是我们学习STM32的重点,就是要学会编程这些外设去驱动外部的各种设备。