第3章 STM32系列微控制器存储器与外设
3.1 存储器和总线的结构 3.1.1 系统结构
系统的主要部分包括:
? 四个驱动单元:
- Cortex-M3内核指令总线 (I-bus),数据总线 (D-bus),以及系统总线 (S-bus) - GP-DMA(通用DMA) ? 三个被动单元:
- 内部SRAM - 内部闪存存储器
这些通过一个多级的AHB总线构架相互连接,如图3.1所示: 图3.1:系统结构
ICode总线
该总线将Cortex-M3内核的指令总线与闪存存储器指令接口相连接。指令预取操作在该总线上进行。 DCode总线
该总线将Cortex-M3内核的DCode总线与闪存存储器的数据接口相连接(常量加载和调试访问)。 系统总线
该总线将Cortex-M3内核的系统总线(外设总线)连接到一个总线矩阵,总线矩阵协调
83
着内核和DMA间的访问。 DMA总线
该总线将DMA的AHB主机接口连接到一个总线矩阵,总线矩阵协调着CPU的DCode和DMA到SRAM、闪存和外设的访问。 总线矩阵
此总线矩阵协调内核系统总线和DMA主控总线之间的访问仲裁。此仲裁利用轮换算法。此总线矩阵由三个驱动部件(CPU的DCode、系统总线和DMA总线)和三个被动部件(闪存存储器接口、SRAM和AHB2APB桥)构成。
为了允许DMA访问,AHB外设通过一个总线矩阵连接到系统总线。 AHB/APB 桥 (APB)
两个 AHB/APB 桥在AHB和两个APB总线之间提供完全同步的连接。APB1 被限制在36 MHz, APB2 工作在全速状态 (根据设备的不同可以达到72 MHz)。
- 请参照表3.1 以获取连接到每个桥的外设的地址映射。 AHB 到 APB 桥 (AHB2APBx)该桥用来连接所有的APB设备
3.1.2 存储器结构
程序存储器、数据存储器、寄存器和I/O端口被组织到一个4G字节的线性地址空间。 这些字节在存储器小端格式编码,在小端格式中,一个字中最低地址的字节为该字的最低位字节,最高地址的字节为最高位字节。
图3.2展示了STM32F10x 的内存映射,若需要更为详细的外设寄存器的映射,请参考相关的章节。
可寻址的存储器空间被分为8个512MB的主块。
所有未分配给片上存储器或外设的存储区域被视为是保留的(图3.2中灰色阴影部分)。
3.1.3 存储器映射
84
图3.2 存储器映射
85
3.1.3.1 外设存储器映射
表 3.1:寄存器边界地址 边界地址
0x4002 2400 - 0x4002 3FFF 0x4002 2000 - 0x4002 23FF 0x4002 1400 - 0x4002 1FFF 0x4002 1000 - 0x4002 13FF 0x4002 0400 - 0x4002 0FFF 0x4002 0000 - 0x4002 03FF 0x4001 3C00 - 0x4001 3FFF 0x4001 3800 - 0x4001 3BFF 0x4001 3400 - 0x4001 37FF 0x4001 3000 - 0x4001 33FF 0x4001 2C00 - 0x4001 2FFF 0x4001 2800 - 0x4001 2BFF 0x4001 2400 - 0x4001 27FF 0x4001 2000 - 0x4001 1FFF 0x4001 1800 - 0x4001 1BFF 0x4001 1400 - 0x4001 17FF 0x4001 1000 - 0x4001 13FF 0x4001 0C00 - 0x4001 0FFF 0x4001 0800 - 0x4001 0BFF 0x4001 0400 - 0x4001 07FF 0x4001 0000 - 0x4001 03FF 0x4000 8000 - 0x4000 77FF 0x4000 7000 - 0x4000 73FF 0x4000 6C00 - 0x4000 6FFF 0x4000 6800 - 0x4000 6BFF 0x4000 6400 - 0x4000 67FF 0x4000 6000 - 0x4000 63FF 0x4000 5C00 - 0x4000 5FFF 0x4000 5800 - 0x4000 5BFF 0x4000 5400 - 0x4000 57FF 0x4000 5000 - 0x4000 4FFF 0x4000 4800 - 0x4000 4BFF 0x4000 4400 - 0x4000 47FF 0x4000 4000 - 0x4000 3FFF 0x4000 3800 - 0x4000 3BFF 0x4000 3400 - 0x4000 37FF 0x4000 3000 - 0x4000 33FF 0x4000 2C00 - 0x4000 2FFF 0x4000 2800 - 0x4000 2BFF
外设 保留
闪存存储器接口 保留
复位和时钟控制RCC 保留 DMA 保留 USART1 保留 SPI 1
TIM1定时器 ADC2 ADC1 保留
GPIO 端口 E GPIO 端口 D GPIO 端口 C GPIO 端口 B GPIO 端口 A EXIT AFIO 保留
电源控制(PWR) 备份寄存器(BKP) 保留 bxCAN
共享的USB/CAN SRAM 512字节 USB 寄存器 I2C2 I2C1 保留 USART3 USART2 保留 SPI2 保留
独立的看门狗(IWDG) 窗口看门狗(WWDG) RTC
总线
AHB
APB2
APB1
86
0x4000 2400 - 0x4000 0FFF 0x4000 0800 - 0x4000 0BFF 0x4000 0400 - 0x4000 07FF 0x4000 0000 - 0x4000 03FF 保留
TIM4 定时器 TIM3 定时器 TIM2 定时器
3.1.3.2 嵌入式SRAM
STM32F10x内置20K字节的静态SRAM,可以以字节、半字(16位)、字(32位)的方式访问,SRAM的起始地址为0x2000 0000。
3.1.3.3 位段
Cortex-M3存储器映像包括两个位段(bit-band)区。这两个位段区将别名存储器区中的每个字映射到位段存储器区的一个位,在别名存储区写入一个字具有对位段区的目标位执行读-改-写操作的相同效果。
在STM32F10x里,外设寄存器和SRAM都被映射到一个位段区里,这允许执行单一的位段的写和读操作。
下面的映射公式给出了别名区中的每个字是如何对应位带区的相应位的:
bit_word_addr = bit_band_base + (byte_offset x 32) + (bit_number × 4)
其中:
? bit_word_addr 是别名存储器区中字的地址,它映射到某个目标位。 ? bit_band_base 是别名区的起始地址。
? byte_offset 是包含目标位的字节在位段里的序号 ? bit_number 是目标位所在位置(0-31)
下面的例子说明如何映射别名区中SRAM地址为0x20000300的字节中的位2: 0x22006008 = 0x22000000 + (0x300*32) + (2*4).
对0x22006008地址的写操作和对SRAM中地址0x20000300字节的位2执行读-改-写操作有着相同的效果。
读0x22006008地址返回SRAM中地址0x20000300字节的位2的值(0x01 or 0x00)。 请参考《Cortex-M3技术参考手册》以了解更多有关位段的信息。
87