最开始学stm32开始对架构各部分不是很了解看架构图基本上走马观花,然后陷入对各个外设的投入中去(比如GPIO/ADC/CAN等),但是对整体架构的掌握对后面编程很多细节的理解帮助很大,而外设的使用是学不完的,无需沉溺其中。在此处做回忆自用。
整体架构
看图说话:
ARM公司是设计芯片内核的公司,将专利授权给STM公司后,STM公司在内核如CotexM3的基础上进行设计,如外设和内核如何传递信息、外围设计哪些外设等。最后将整体封装引脚引出交付给买家。
模块架构
如上图就是对系统结构进一步细化:
看这个图先要搞清楚驱动和被动单元是哪几个?
在小容量、中容量和 大容量产品中,主系统由以下部分构成:
● 四个驱动单元:
─ Cortex™-M3内核DCode总线(D-bus),和系统总线(S-bus)
─ 通用DMA1和通用DMA2
● 四个被动单元
─ 内部SRAM
─ 内部闪存存储器
─ FSMC
─ AHB到APB的桥(AHB2APBx),它连接所有的APB设备
1. 首先Cotex-M3内核通过ICode总线(Instruction)在Flash里面读取指令(就是你烧进去的代码)。
2. DCode总线(Data)用来读取存储在SRAM里面的数据,这里的数据就是程序里定义的数据(包括变量和常量,常量用const修饰后存储在Flash中),不管是全局变量extern还是局部变量static都是存储在SRAM里面。
3.系统总线System Bus 主要是用来对外设的寄存器进行操作。
4.DMA总线可以访问FLASH、SRAM、数据寄存器,并在三者间快速交换数据。
5.AHB总线桥接成APB1和APB2,众多外设分别挂载在这两条总线上,所以编程时你会发现所有片上外设的寄存器地址都是基于AHB总线地址定义的。
总线矩阵
总线矩阵用来在多个主设备(驱动单元)和从设备(被动单元)之间进行调度,避免两个主设备同时对一个从设备读写的情形。图中标有圆点的表示这两个设备间可以通信。比如 S0:I 总线只有跟 M0、M2 和 M6 这三根被控总线交叉的时候才有圆圈,就表示 S0 只能跟这三根被控总线通信。从功能上来理解,I 总线是指令总线,用来取指,指令指的是编译好的程序指令。我们知道 STM32 有三种启动方式,从 FLASH 启动(包含系统存储器),从内部 SRAM 启动,从外部 RAM 启动,这三种存储器刚好对应的就是M0、M2 和 M6 这三条总线。
举例:当多个AHB 主设备试图同时访问同一个AHB从设备时,总线矩阵仲裁器介入以解决访问冲突。在下面的例子中CPU 和DMA1 均试图访问SRAM1 以读取数据。
如上述示例总线访问请求同时发生的情况下,就需要总线矩阵仲裁。为了解决这种问题,需要应用循环调度策略:如果本次最后赢得总线控制权的主设备是CPU,则在下一次访问中DMA1将赢得总线控制权并首先访问SRAM1。CPU 随后方可有权访问SRAM1。