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

发布者:素心静听最新更新时间:2018-05-06 来源: eefocus关键字:STM32  储存器  总线架构  STM32F411 手机看文章 扫描二维码
随时随地手机看文章

本文转载自http://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-0x200FFFFFSRAM 位段区域可以像访问 SRAM 存储器那样直接访问此存储器区域,但是此区域也可以使用位段别名按位寻址。
0x22000000-0x23FFFFFFSRAM 位段别名区域本区域的数据存取将被映射到位段区域。写操作相当于读-改-写操作。指令存取不会被重映射。

● 访问映射到 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)。


关键字:STM32  储存器  总线架构  STM32F411 引用地址: 深入理解STM32之储存器和总线架构1(基于STM32F411)

上一篇:深入理解STM32之储存器和总线架构2(基于STM32F411)
下一篇:使用HAL库、STM32CubeMX和Keil 5开发入门教程(一)

推荐阅读最新更新时间:2024-03-16 16:01

stm32 NRF24L01
include 24l01.h #include lcd.h #include delay.h #include spi.h #include usart.h const u8 TX_ADDRESS ={0x34,0x43,0x10,0x10,0x01}; //发送地址 const u8 RX_ADDRESS ={0x34,0x43,0x10,0x10,0x01}; //初始化24L01的IO口 void NRF24L01_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; SPI_InitTypeDef SPI_InitStructure; R
[单片机]
stm32 独立看门狗和窗口看门狗区别
1)独立看门狗没有中断,窗口看门狗有中断 2)独立看门狗有硬件软件之分,窗口看门狗只能软件控制 3)独立看门狗只有下限,窗口看门狗又下限和上限 4)独立看门狗是12位递减的。窗口看门狗是7位递减的 5)独立看门狗是用的内部的大约40KHZ RC振荡器,窗口看门狗是用的系统时钟APB1ENR 1.看门狗介绍 看门狗这东西虽然简单,但我相信绝大多程序员没有足够重视它。使用看门狗保证系统正常地运行是非常有必要的。我们在设计产品时,代码以及硬件设计缺陷或是外界电磁干扰都有可能使系统死机,如果不能正常对其进行复位,系统的可靠性将大打折扣。看门狗分为软件看门狗和硬件看门狗两类,其原理都是使用一个独立定时器来计时,超出时间
[单片机]
STM32中的时钟
下面就以STM32开发板中最常见的STM32F103系列芯片的时钟为例,介绍一下STM32中的时钟。 时钟作用 说到时钟,你一定会问,这是用来计时的吗?没错,是用来计时的,但这只是它在STM32中的一项功能而已,下面就为你列出了时钟的具体功能。 计时作用(供给某些计数器统计时间); 控制时序(串口数据的传输,只能一位一位的传输); 控制信号(将时钟的上升下降沿作为独特的控制标志)。 STM32时钟模型 STM32内部时钟树 时钟源 时钟源就是产生时钟的电路啦,我们来一起看一下,什么样的电路可以产生时钟。 STM32中的时钟源分为以下五种: 低速内部时钟LSI:频率为40kHz ; 高速内部时钟HSI :频率为8MH
[单片机]
<font color='red'>STM32</font>中的时钟
STM32嵌入式微控制器快速上手——笔记
1、大端格式:数据的高字节存在低地址,低字节存在高地址; 小端格式:数据的低字节存在低地址,高字节存在高地址。 2、arm公司推出的AMBA片上总线标准包括:AHB系统总线和APB外设总线。 3、最大寻址空间4GB(2的32次方)。 CPU最大能查找多大范围的地址叫做寻址能力 ,CPU的寻址能力以 字节 为单位 ,如32位寻址的CPU可以寻址2的32次方大小的地址也就是4G,这也是为什么32位的CPU最大能搭配4G内存的原因 ,再多的话CPU就找不到了。 4、ARM指令集32位,Thumb指令集是ARM指令集的一个子集,允许指令编码长度为16位。ARM核就好比一个高中学校,那种包含普通高中和职业高中的。普通高中就相当
[单片机]
stm32 库文件_line 函数
定义   内联函数从源代码层看,有函数的结构,而在编译后,却不具备函数的性质。编译时,类似宏替换,使用函数体替换调用处的函数名。一般在代码中用inline修饰,但是否能形成内联函数,需要看编译器对该函数定义的具体处理。 动机   内联扩展是用来消除函数调用时的时间开销。它通常用于频繁执行的函数。 一个小内存空间的函数非常受益。 如果没有内联函数,编译器可以决定哪些函数内联 。 程序员很少或没有控制哪些职能是内联的,哪些不是。 给这种控制程度,作用是程序员可以选择内联的特定应用 。 函数内联问题   除了相关的问题, 内联扩展一般,语言功能作为一个内联函数可能不被视为有价值的,因为它们出现的原因,对于一个数字:
[单片机]
stm32通用定时器
  STM32 的定时器功能十分强大,有TIME1 和TIME8 等高级定时器,也有 TIME2~TIME5 等通用定时器,还有 TIME6 和TIME7 等基本定时器和看门狗定时器以及系统时基定时器。   基本定时器(TIM6,TIM7)的主要功能: 只有最基本的定时功能,基本定时器TIM6和TIM7各包含一个16位自动装载计数器,由各自的可编程预分频器驱动。   通用定时器(TIM2~TIM5)的主要功能: 除了基本的定时器的功能外,还具有测量输入信号的脉冲长度( 输入捕获) 或者产生输出波形( 输出比较和PWM)。   高级定时器(TIM1,TIM8)的主要功能: 高级定时器不但具有基本,通用定时器的所有的功能,还具
[单片机]
<font color='red'>stm32</font>通用定时器
STM32学习笔记二:什么是寄存器
芯片架构简图 芯片(这里指内核,或者叫 CPU)和外设之间通过各种总线连接,其中驱动单元有 4个,被动单元也有 4 个。为了方便理解,我们都可以把驱动单元理解成是CPU 部分,被动单元都理解成外设。 系统框图 1、ICode总线:ICode 中的 I 表示 Instruction,即指令。我们写好的程序编译之后都是一条条指令,存放在 FLASH 中,内核要读取这些指令来执行程序就必须通过 ICode 总线,它几乎每时每刻都需要被使用,它是专门用来取指的。 2、驱动单元: (1)DCode 总线:DCode 中的 D 表示 Data,即数据,那说明这条总线是用来取数的。我们在写程序的时候,数据有常量和变量两种,常量就是固
[单片机]
<font color='red'>STM32</font>学习笔记二:什么是寄存器
基于STM32F103C8T6 MCU的STM32 Blue Pill Board接口
在本教程中,我将介绍如何将DHT11湿度和温度传感器与基于STM32F103C8T6 MCU的STM32 Blue Pill Board接口。DHT11传感器的值由STM32读取,并显示在I2C LCD显示屏上。 介绍 传感器是很小的设备,可以弥合原始模拟世界与MCU的数字世界之间的鸿沟。传感器可以非常简单,例如非常著名的LM35温度传感器,也可以是一些复杂的数学单元,例如MPU6050陀螺仪和加速度计组合传感器。 简单或复杂,传感器是许多消费,汽车,机器人和工业应用中的关键部分,如果不集成适当的传感器就无法完成某些应用。 让我们从工业应用程序扩展到日常项目和业余爱好者。气象站是一个非常普遍且受欢迎的项目,无论是物联网
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved