STM32F103XX 存储器和总线架构
stm32f103属于经典的一款微处理器,内核采用CortexM3内核,集成了一些常用外设接口,芯片可运行RTOS。对于型号为stm32f103zet6的单片机,内部sram的为64Kb,flash容量为512kb。
系统架构

芯片内部的组成架构如上图所示,主要分为master和slave,master包括4项,分别为Cortex® -M3、D-bus、S-bus、DMA1/2,如图中绿色阴影部分。slave也包括四部分,分别为内部sram、内部的flash、FSMC()和AHB到APB的桥,在图中用红色阴影标注。
-
ICode bus
连接内部Cortex-M3内核的指令总线至flash的指令接口,在这条总线上完成取指令的操作;
-
DCode bus
连接内部Cortex-M3内核的数据总线至flash的数据接口;
-
系统总线
连接Cortex-M3内核的系统总线至芯片的总线矩阵,总线矩阵负责协调内核与DMA;
-
DMA总线
连接DMA的ABH master接口至芯片的总线矩阵;
-
总线矩阵
- 采用轮换算法协调内核系统总线与DMA主控总线之间的访问仲裁;
- 连接四个主设备CPU DCode, System bus, DMA1 bus and DMA2 bus和四个从设备FLITF, SRAM, FSMC and AHB2APB bridges;
- AHB外设通过总线矩阵与系统总线连接,允许DMA访问;
- 协调CPU DCode和DMA到SRAM flash和外设的访问;
-
AHB/APB桥
- 两个AHB/APB的桥,桥用于AHB总线与2个APB总线之间的同步连接
- APB1限制在36MHz,APB2提供高速72MHz;
- 在每一次复位之后,除SRAM and FLITF之外,其他外设时钟均处于关闭状态;
- 在使用外设之前,需要操作RCC部分对应的寄存器打开时钟;
内存管理
在f103处理器中程序内存、数据内存、寄存器和IO端口采用统一线性分布,大小为4Gb,在Cortex-M3的内存管理中提供了一个宏观的内存分布。

内存映射
-
外设映射
外设主要映射在0x40000000为起始地址的区域,但FSMC的地址范围为0xA000 0000 - 0xA000 0FFF,大小为4KB;
-
嵌入式SRAM
f103支持64kb大小的静态RAM,地址范围为0x20000000至0x20010000,支持16/32/8位访问;
-
Bit banding
-
在Cortex-M3内核文档中描述了两部分的Bit banding,一部分是外设,另外一部分是RAM。在F103中所有的外设和SRAM均映射到了对应的banding区域,支持单个bit的写和读,但是仅内核操作,对于DMA则不支持该特性;
-
计算公式
bit_word_addr = bit_band_base + (byte_offset x 32) + (bit_number × 4)
例如要计算SRAM地址0x20000300中bit2对应的8位banding地址,套入上述公式:
0x22006008 = 0x22000000 + (0x300x32) + (2x4)
-
-
嵌入式flash
f103zet6芯片支持的flash为512Kb,在分布上划分为两部分,分别是主内存块和信息块;
-
主内存块:划分为256个页,每一页的大小为2Kb;
-
信息块:大小为2Kb;
-
FLITF(Flash memory interface)闪存接口功能包括带预取缓冲器的读接口、可选的字节加载器、flash的编程和擦除以及读写保护

-
闪存读取
闪存指令和数据的访问通过AHB总线,预取缓冲块用于ICode总线,DCode上的数据有更高的优先级,在读访问时可以配置读操作等待的时间,缓冲区的大小(2x64bit)以及半周期。
-
编程和擦除
支持16位的写,在读写操作是内部的HSI必须是开启状态; 擦除不仅可以按页擦除,也可以整个擦除; 读写控制块由一个固定时钟控制;在读写操作完成后可以产生一个中断,中断用于退出WFI模式;
-
FLASH_ACR寄存器
可用于预取缓冲块的设置,半字节访问,等待时间的配置;

-
更多关于flash的内容,请参考《STM32F10xxx Flash programming manual》
-
启动配置
f103通过boot引脚支持3种不同的启动方式,包括:
- 从主闪存启动:起始地址映射到0x0000 0000,也可以从原地址0x8000000处访问;
- 从系统内存启动:映射至0x0000 0000,原地址为0x1FFF F000;
- 从嵌入式SRAM启动:访问地址为0x2000 0000,此方式需要改写中断向量表的地址;

在复位之后系统时钟的第四个上升沿将采样boot引脚的状态,从Stnadby模式退出后也会从新采样。在启动延时过去后,cpu将会从地址0x00000000处获取栈的地址,从0x00000004处执行代码,内核始终从ICode总线获取复位向量。
嵌入自举程序
嵌入的自举程序存放在系统存储区,由厂家在生产时写入,可通过UART1接口对该存储器进行从新编程。具体请参考《Introduction to system memory boot mode on STM32 MCUs》文档。
总结
首先对32单片机的系统架构做了了解,知道单片机内除了Cortex-M3还有什么,以及模块之间的组合关系。然后介绍了内存相关的部分,需要关注的点是内部flash的结构和访问特性,这部分有具体的参考手册,后面有机会查看。最后是启动的配置,32单片机支持3种启动方式,经常用的一种是从主flash中启动。