STM32芯片由内核和片上外设两部分组成。STM32F103采用Cortex-M3内核,该内核由ARM公司设计。芯片生产厂商ST则负责在内核之外设计部件并生产整个芯片。这些内核之外的部件被称为核外外设或片上外设,如GPIO、USART(串口)、I2C、SPI等。
芯片内核与外设之间通过各种总线连接,其中驱动单元有四个,被动单元也有四个。可以将驱动单元理解成内核部分,被动单元理解成外设。
ICode总线
ICode总线是专门用于取指令的总线,其中的“I”代表“Instruction”(指令)。在编写程序后,经过编译,程序将转化为一条条指令并存储在FLASH中。内核通过ICode总线读取这些指令,进而执行程序。
DCode总线
DCode总线用于取数,其中的“D”代表“Data”(数据)。在编写程序时,数据分为常量和变量两种。常量是不变的,使用C语言中的const关键字进行修饰,并存储在内部FLASH中。变量是可变的,无论是全局变量还是局部变量,都存储在内部的SRAM中。
System总线
我们通常所说的寄存器编程,即读写寄存器的操作,都是通过System总线来完成的。System总线主要用于访问外设的寄存器。
DMA总线
DMA总线也主要用于传输数据,这些数据可以来自某个外设的数据寄存器,也可以来自SRAM或内部FLASH。
由于数据既可以被DCode总线访问,也可以被DMA总线访问,因此为了避免访问冲突,取数时需要经过一个总线矩阵进行仲裁,以决定由哪个总线进行取数。
内部的闪存存储器Flash
内部的闪存存储器即为FLASH,它用于存储编写好的程序。内核通过ICode总线来获取存储器中的指令。
内部的SRAM
内部的SRAM,也被称为内存,是程序中变量、堆栈等开销的存储基础。内核通过DCode总线来访问SRAM。
FSMC
FSMC的英文全称是Flexible static memory controller(灵活的静态的存储器控制器)。通过FSMC,可以扩展内部存储器,如外部的SRAM、NAND-FLASH和NORFLASH。但是,FSMC只能扩展静态的内存,而不能扩展动态的内存,因此不能用于扩展SDRAM。
AHB
从AHB总线延伸出的两条APB2和APB1总线是常见的总线,它们连接了GPIO、串口、I2C、SPI等外设。学习STM32的重点在于学会对这些外设进行编程,以便驱动外部的各种设备。