深入理解STM32之储存器和总线架构1(基于STM32F411)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/CharmingSun/article/details/52258419

官方文档:
STM32F411 参考手册
STM32F411 数据手册
Cortex™-M4F 编程手册
STM32 微控制器系统存储器自举模式应用笔记
STM32™ 自举程序中使用的 USART 协议
ARM Cortex™-M Programming Guide to Memory Barrier Instructions

一、系统架构

主系统由 32 位多层 AHB 总线矩阵构成,可实现以下部分的互连:

有关AHB总线和APB总线的更多信息请参考博文:浅析AMBA规范以及AMBA 5 AHB接口和AMBA 3 APB接口

1、六条主控总线:
● Cortex™-M4F 内核 I 总线、D 总线和 S 总线;
● DMA1 存储器总线;
● DMA2 存储器总线;
● DMA2 外设总线。

2、五条被控总线:
● 内部 Flash ICode 总线;
● 内部 Flash DCode 总线;
● 主要内部 SRAM;
● AHB1 外设(包括 AHB-APB 总线桥和 APB 外设);
● AHB2 外设。

借助总线矩阵,可以实现主控总线到被控总线的访问,这样即使在多个高速外设同时运行期间,系统也可以实现并发访问和高效运行。此架构如 Figure 1 所示。
Figure 1. System architecture


S0:I 总线
此总线用于将 Cortex™-M4F 内核的指令总线连接到总线矩阵。内核通过此总线获取指令。此总线访问的对象是包含代码的存储器(内部 Flash/SRAM)。


S1:D 总线
此总线用于将 Cortex™-M4F 数据总线连接到总线矩阵。内核通过此总线进行立即数加载和调试访问。此总线访问的对象是包含代码或数据的存储器(内部 Flash/SRAM)。


S2:S 总线
此总线用于将 Cortex™-M4F 内核的系统总线连接到总线矩阵。此总线用于访问位于外设 或 SRAM 中的数据。也可通过此总线获取指令(效率低于 I 总线)。此总线访问的对象是内部 SRAM、包括 APB 外设在内的 AHB1 外设、AHB2 外设。


S3、S4:DMA 存储器总线
此总线用于将 DMA 存储器总线主接口连接到总线矩阵。DMA 通过此总线来执行存储器数据的传入和传出。此总线访问的对象是数据存储器:内部 Flash、内部 SRAM 以及 S4 可以额外访问包括 APB 外设在内的 AHB1/AHB2 外设。


S5:DMA 外设总线
此总线用于将 DMA 外设主总线接口连接到总线矩阵。DMA 通过此总线访问 AHB 外设或执 行存储器间的数据传输。此总线访问的对象是 AHB 和 APB 外设以及数据存储器:Flash 储存器和内部 SRAM。


总线矩阵
总线矩阵用于主控总线之间的访问仲裁管理。仲裁采用循环调度算法。


AHB/APB 总线桥 (APB)
借助两个 AHB/APB 总线桥 APB1 和 APB2,可在 AHB 总线与两个 APB 总线之间实现完全 同步的连接,从而灵活选择外设频率。

有关 APB1 和 APB2 最大频率的详细信息,请参见器件数据手册;有关 AHB 和 APB 外设地 址映射的信息,请参见STM32F411参考手册中的 Table 1。

每次芯片复位后,所有外设时钟都被关闭(SRAM 和 Flash 接口除外)。使用外设前,必须在 RCC_AHBxENR 或 RCC_APBxENR 寄存器中使能其时钟。其中RCC寄存器不属于外设,复位后RCC寄存器直接由HSI提供时钟信号。但其RCC寄存器仍然挂接在AHB1总线上,具体请看下文中 STM32F411xC/xE 方框图中的“Reset & clock control”。

注意:对 APB 寄存器执行 16 位或 8 位访问时,该访问将转换为 32 位访问:总线桥将 16 位或 8 位数据复制后提供给 32 位向量。


STM32F411xC/xE 方框图
左边部分:
Figure 3. STM32F411xC/xE block diagram (left)

右边部分:
Figure 3. STM32F411xC/xE block diagram (right)

挂接在 AHB1 总线上的外设有:GPIOA、GPIOB、GPIOC、GPIOD、GPIOE、GPIOH、CRC、RCC、Flash 接口寄存器、DMA1、DMA2;

挂接在 AHB1 总线上的外设有:USB OTG FS;

挂接在 APB1 总线上的外设有:TIM2、TIM3、TIM4、TIM5、RTC 和 BKP 寄存器、WWDG、IWDG、I2S2ext、SPI2 / I2S2、SPI3 / I2S3、I2S3ext、USART2、I2C1、I2C2、I2C3、PWR;

挂接在 APB2 总线上的外设有:USART1、USART6、ADC1、SDIO、SPI1/I2S1、SPI4/I2S4、SYSCFG、EXTI、TIM9、TIM10、TIM11、SPI5/I2S5。

有关 STM32F411xC/E 器件中可用外设的边界地址请参考STM32F411数据手册中的“Table 1. STM32F411xC/E register boundary addresses”。

二、存储器组织结构

综合存储器映射图:

左边部分:
Figure 14. Memory map (left)

程序存储器、数据存储器、寄存器和 I/O 端口排列在同一个顺序的 4 GB 地址空间内。

各字节按小端格式在存储器中编码。字中编号最低的字节被视为该字的最低有效字节,而编号最高的字节被视为最高有效字节。

有关外设寄存器映射的详细信息,请参见STM32F411参考手册中的相关章节。

可寻址的存储空间分为 8 个主要块,每个块为 512 MB。

未分配给片上存储器和外设的所有存储区域均视为“保留区”。请参见STM32F411数据手册中的存储器映射图。

从0x0000 0000到0x03FF FFFF这段地址空间称为自举存储空间,Cortex™-M4F CPU 通过 ICode 总线从地址 0x0000 0000 获取栈顶值,然后从始于0x0000 0004 的存储器开始执行代码。自举存储空间使用别名,也就是说在单片机上电之前是没有存储器映射到这段自举存储空间内的。单片机上电之后通过硬件检测相应的 BOOT 引脚来确定将自举存储空间映射到主 Flash、系统存储器还是嵌入式 SRAM。具体的物理重映射方式参见下文。

自举配置 (Boot configuration):

存储器采用固定的存储器映射,代码区域起始地址为 0x0000 0000(通过 ICode/DCode 总 线访问),而数据区域起始地址为 0x2000 0000(通过系统总线访问)。Cortex™-M4F CPU 始终通过 ICode 总线获取复位向量,这意味着只有代码区域(通常为 Flash)可以提供自举空间。STM32F4xx 微控制器实施一种特殊机制,可以从其它存储器(如内部 SRAM) 进行自举。

在 STM32F4xx 中,可通过 BOOT[1:0] 引脚选择三种不同的自举模式,下表所示。
自举模式

复位后,在系统时钟 (SYSCLK)的第四个上升沿锁存 BOOT 引脚的值。复位后,用户可以通过设置 BOOT1 和 BOOT0 引脚来选择需要的自举模式。

BOOT0 为专用引脚,而 BOOT1 则与 GPIO 引脚共用。一旦完成对 BOOT1 的采样,相应 GPIO 引脚即进入空闲状态,可用于其它用途。

器件退出待机模式时,还会对 BOOT 引脚重新采样。因此,当器件处于待机模式时,这些引脚必须保持所需的自举模式配置。这样的启动延迟结束后,CPU 将从地址 0x0000 0000 获取栈顶值,然后从始于0x0000 0004 的自举存储器开始执行代码。

注意:如果器件从 SRAM 自举,在应用程序初始化代码中,需要使用 NVIC 异常及中断向量表和偏移寄存器来重新分配 SRAM 中的向量表。

嵌入式自举程序 (Embedded bootloader)

嵌入式自举程序模式用于通过以下串行接口重新编程 Flash:
● USART1 (PA9/PA10)
● USART2 (PD5/PD6)
● I2C1 (PB6/PB7)
● I2C2 (PB10/PB3)
● I2C3 (PA8/PB4)
● SPI1 (PA4/PA5/PA6/PA7)
● SPI2 (PB12/PB13/PB14/PB15)
● SPI3 (PA15/PC10/PC11/PC12)
● USB OTG FS (PA11/12) 从设备模式 (DFU: device firmware upgrade).

USART 外设以内部 16 MHz 振荡器 (HSI) 频率运行,而 USB OTG FS 则需要相当
于 1 MHz 数倍(4 MHz 到 26 MHz 之间)的外部时钟 (HSE) 频率。

嵌入式自举程序代码位于系统存储器 (system memory,位于Flash)中,在芯片生产期间由 ST 编程。有关详细信息,请参见应用笔记 AN2606。

物理重映射 (Physical remap)

选择自举引脚后,应用程序软件可以将某些存储器设定为从代码空间进行访问(这样,可通过
ICode 总线而非系统总线执行代码)。这样的修改通过在 SYSCFG 控制器中编程来实现,该寄存器的说明在STM32F411参考手册的第 7.2.1 节:SYSCFG 存储器重映射寄存器 (SYSCFG_MEMRMP) 。

SYSCFG memory remap register

此寄存器用于对存储器重映射进行配置:
● 使用两个位来配置可在地址 0x0000 0000 访问的存储器区域。从而通过软件选择物理重映射,而旁路 BOOT 引脚。
这两个位的复位值和复位时 BOOT 引脚的设置相同。当 BOOT 引脚设为 10 [(BOOT1,BOOT0)
= (1,0)] 从主 Flash 中自举时,寄存器值为 0x00。

在重映射模式下,CPU 可以通过 ICode 总线 (而不是 System 总线)访问外部存储器来提高性能。

偏移地址:0x00
复位值:0x0000 00XX(X 和 BOOT 引脚的设置相同)

因此可重映射以下存储器:
● 主 Flash
● 系统存储器
● 嵌入式 SRAM1 (128 KB)

下面这张表格说明了当把自举存储空间映射到不同存储器上时每段地址对应着何种存储器,小括号内的数字标明了可以使用的地址空间的大小(也就是对应存储器的大小)。
Table 3. 存储器映射与自举模式/物理重映射
*注:1. 即使在自举存储空间中使用别名,相关存储器仍可通过其原始存储空间进行访问。

Flash 概述 (Flash memory overview)

Flash 接口可管理 CPU 通过 AHB I-Code 和 D-Code 对 Flash 进行的访问。该接口可针对 Flash 执行擦除和编程操作,并实施读写保护机制。Flash 接口通过指令预取和缓存机制加速代码执行。

下图所示为系统架构内的 Flash 接口连接:
系统架构内的 Flash 接口连接

嵌入式 Flash 接口的主要特性:
● Flash 读操作
● Flash 编程/擦除操作
● 读/写保护
● I-Code 上的预取操作
● I-Code 上的 64 个缓存(128 位宽)
● D-Code 上的 8 个缓存(128 位宽)

嵌入式 Flash 具有以下主要特性:
● 对于 STM32F411xC/E,容量高达 512 KB
● 128 位宽数据读取
● 字节、半字、字和双字数据写入
● 扇区擦除与全部擦除
● 存储器组织结构
Flash 结构如下:
— 主存储器块,分为 4 个 16 KB 扇区、1 个 64 KB 扇区和 3 个 128 KB 扇区
— 系统存储器,器件在系统存储器自举模式下从该存储器启动
— 512 字节 OTP(一次性可编程),用于存储用户数据。OTP 区域还有 16 个额外字节,用于锁定对应的 OTP 数据块。
— 选项字节,用于配置读写保护、BOR 级别、软件/硬件看门狗以及器件处于待机或
停止模式下的复位。
● 低功耗模式(有关详细信息,请参见参考手册的“电源控制 (PWR)”部分)

下面这张表格说明了 Flash 模块构成 (STM32F411xC/E):
Flash 模块构成 (STM32F411xC/E)

嵌入式 SRAM (Embedded SRAM)

STM32F411xC/E 带有 128 KB 系统 SRAM。

系统 SRAM 可按字节、半字(16 位)或全字(32 位)访问。读写操作以 CPU 速度执行,且等待周期为 0。

如果选择从 SRAM 自举或选择物理重映射(SYSCFG 控制器中的 SYSCFG 存储器重映射寄存器 (SYSCFG_MEMRMP)),则 CPU 可通过系统总线或 I-Code/D-Code 总线访问系统 SRAM。要在 SRAM 执行期间获得最佳的性能,应选择物理重映射(通过自举管脚及软件配置来选择)。

位段 (Bit banding)

Cortex™-M4F 存储器映射包括两个位段区域。这些区域将存储器别名区域中的每个字映射到存储器位段区域中的相应位。在别名区域写入字时,相当于对位段区域的目标位执行读-修改-写操作。

在 STM32F4xx 器件中,外设寄存器和 SRAM 均映射到一个位段区域,这样可实现单个位段的读写操作。这些操作仅适用于 Cortex™-M4F 访问,对于其它总线主接口(如 DMA)无效。

两个位段区域分别位于 SRAM 和外设寄存器区域中地址最低的 1 MB,并且分别被映射到两个 32 MB 的位段别名区域:
● 访问映射到 1 MB SRAM 位段区域的 32 MB SRAM 别名区域:

地址范围 存储器区域 指令和数据存取
0x20000000-0x200FFFFF SRAM 位段区域 可以像访问 SRAM 存储器那样直接访问此存储器区域,但是此区域也可以使用位段别名按位寻址。
0x22000000-0x23FFFFFF SRAM 位段别名区域 本区域的数据存取将被映射到位段区域。写操作相当于读-改-写操作。指令存取不会被重映射。

● 访问映射到 1 MB 外设位段区域的 32 MB 外设别名区域:

地址范围 存储器区域 指令和数据存取
0x40000000-0x400FFFFF 外设位段区域 可以像访问外设寄存器那样直接访问此存储器区域,但是此区域也可以使用位段别名按位寻址
0x42000000-0x43FFFFFF 外设位段别名区域 本区域的数据存取将被映射到位段区域。写操作相当于读-改-写操作。不允许存取指令。

注意:位段传输的大小与指令规定的传输大小相匹配,可以为字节、半字或字。这两个别名区域位于存储器映射图中的保留区域,所以说只有位段区域映射到别名区域,而没有存储器映射到别名区域。

可以直接操作别名区域。在别名区域写一个字将更新位段区域的一个位。被写进别名区域的字的第 0 位的值决定了被写进位段区域的目标位的值。写进一个第 0 位为 1 的值将使位段区域对应位置 1,写进一个第 0 位为 0 的值将使位段区域对应位置 0。在别名区域写进的数值中的第 1 位到第 31 位对位段区域位的值没有影响。在别名区域写入 0x01 和写入 0xFF 的效果相同,在别名区域写入 0x00 和写入 0x0E 的效果相同。

在别名区域读取一个字:
● 0x00000000 表示位段区域的对应位的值为 0
● 0x00000001 表示位段区域的对应位的值为 1

可通过一个映射公式说明别名区域中的每个字与位段区域中各个位之间的对应关系。映射公式为:
bit_word_addr = bit_band_base + (byte_offset x 32) + (bit_number × 4)

其中:
— bit_word_addr 代表别名区域中将映射到目标位的字的地址
— bit_band_base 代表别名区域的起始地址
— byte_offset 代表目标位所在位段区域中的字节编号
— bit_number 代表目标位的位位置 (0-7)

示例
下例说明如何将 SRAM 地址 0x20000300 处字节的位 2 映射到别名区域:
0x22006008 = 0x22000000 + (0x300*32) + (2*4)

对地址 0x22006008 执行写操作相当于在 SRAM 地址 0x20000300 处字节的位 2 执行读-修 改-写操作。

对地址 0x22006008 执行读操作将返回 SRAM 地址 0x20000300 处字节的位 2 的值(0x01 表示位置位,0x00 表示位复位)。

有关位段的详细信息,请参见 Cortex™-M4F 编程手册 (Cortex®-M4 programming manual)。


右边部分:
Figure 14. Memory map (right)

挂接在 APB1、 APB2、 AHB1、 AHB2 总线上的寄存器和 I/O 端口位于 block 2。位于block 7的Cortex-M4 内部外设有:NVIC (Nested Vectored Interrupt Controller)、SCB (System Control Block)、SysTick (System timer)、MPU (Memory Protection Unit)、FPU (Floating-point Unit)。

猜你喜欢

转载自blog.csdn.net/CharmingSun/article/details/52258419