STM32储存器和总线构架

news2024/11/22 3:14:25

一、引言

本篇文章旨在介绍STM32小容量、中容量和大容量的储存器和系统构架,文中涉及到一些专有名词和概念较为抽象和陌生,建议读者能够查阅相关资料和知识加深了解。

二、正文 

(一)、系统构架

在小容量、中容量和 大容量产品中,主系统由以下部分构成:
● 四个驱动单元:
─ Cortex™-M3内核DCode总线(D-bus)

─ 系统总线(S-bus)
─ 通用DMA1和通用DMA2


● 四个被动单元
─ 内部SRAM
─ 内部闪存存储器
─ FSMC
─ AHB到APB的桥(AHB2APBx),它连接所有的APB设备

以上提及到的主系统部分构成都是通过一个多级的AHB总线架构相互连接的。 这是系统结构图:

 在互联型产品中,主系统由以下部分构成:

● 五个驱动单元:
─ Cortex™-M3内核DCode总线(D-bus),和系统总线(S-bus)
─ 通用DMA1和通用DMA2

─ AHB到APB的桥(AHB2APBx),它连接所有的APB设备

● 三个被动单元:

─ 内部SRAM
─ 内部闪存存储器

─ AHB到APB的桥(AHB2APBx),它连接所有的APB设备

补充:关于以上出现的部分名词,我将对其进行解释 

1、DCode总线(D-bus)

在STM32驱动单元中,DCode总线(D-bus)指的是一种内部总线架构,用于处理指令和数据之间的通信。

DCode总线是STM32微控制器内部的一个重要组成部分,它连接了CPU、存储器以及外设。它被设计用于高效地传输指令和数据,实现与外部设备的通信和数据交换。

通过DCode总线,CPU能够读取和写入存储器中的指令和数据。同时,外设也可以通过DCode总线与CPU进行交互,进行数据的输入和输出操作。

DCode总线具有高带宽和低延迟的特点,这使得STM32微控制器能够快速响应指令和数据的处理需求。它提供了良好的性能和可靠性,为驱动单元的正常运行提供了基础。

需要注意的是,DCode总线只是STM32内部的一个概念,不同系列的STM32微控制器可能会有不同的总线架构和命名方式。因此,在具体的STM32驱动单元中,可能会使用其他名称来描述类似的总线结构。

2、系统总线(S-bus)

在STM32微控制器中,S-Bus(System Bus,系统总线)是一个内部总线架构,用于连接处理器核心、存储器和外设模块之间的通信。

S-Bus提供了高效的数据传输机制,使得CPU能够与系统中的各种模块进行通信和数据交换。它主要用于处理器核心与存储器、DMA控制器以及其他系统级模块之间的数据传输。

通过S-Bus,CPU可以读取和写入存储器中的指令和数据。此外,外设模块也可以通过S-Bus与CPU进行数据的输入和输出操作,实现与外部设备的通信和数据交互。

S-Bus具有高带宽和低延迟的特点,这使得STM32微控制器能够快速响应数据访问需求和系统级操作。它提供了可靠的数据传输通道,确保系统中不同模块之间的协调运作。

需要注意的是,S-Bus只是STM32微控制器内部的一个概念,用于描述系统级总线连接架构。具体的STM32系列和型号可能会有不同的总线架构和名称,但基本原理和功能类似。因此,在具体的STM32系统中,可能会使用其他名称来描述类似的系统总线结构。

ICode总线

该总线将Cortex™-M3内核指令总线与闪存指令接口相连接。指令预取在此总线上完成;

Dcode总线

该总线将Cortex™-M3内核的DCode总线与闪存存储器的数据接口相连接(常量加载和调试访
问);

系统总线
此总线连接Cortex™-M3内核的系统总线(外设总线)到总线矩阵,总线矩阵协调着内核和DMA间的访问。
DMA总线
此总线将DMA的AHB主控接口与总线矩阵相联,总线矩阵协调着CPU的DCode和DMA到
SRAM、闪存和外设的访问。

总线矩阵
总线矩阵协调内核系统总线和DMA主控总线之间的访问仲裁,仲裁利用轮换算法。在互联型产品中,总线矩阵包含5个驱动部件(CPU的DCode、系统总线、以太网DMA、 DMA1总线和
DMA2总线)和3个从部件(闪存存储器接口(FLITF)、 SRAM和AHB2APB桥)。在其它产品中总线矩阵包含4个驱动部件(CPU的DCode、系统总线、 DMA1总线和DMA2总线)和4个被动部件(闪存存储器接口(FLITF)、 SRAM、 FSMC和AHB2APB桥)。
AHB外设通过总线矩阵与系统总线相连,允许DMA访问。

AHB/APB桥(APB)
两个AHB/APB桥在AHB和2个APB总线间提供同步连接。 APB1操作速度限于36MHz,APB2操作于全速(最高72MHz)。(注意;这里只是基于STM32F10XXXX)有关连接到每个桥的不同外设的地址映射请参考表1。在每一次复位以后,所有除SRAM和FLITF以外的外设都被关闭,在使用一个外设之前,必须设置寄存器RCC_AHBENR来打开该外设的时钟。
注意: 当对APB寄存器进行8位或者16位访问时,该访问会被自动转换成32位的访问:桥会自动将8位或者32位的数据扩展以配合32位的向量。 

(二)、存储器组织 

程序存储器、数据存储器、寄存器和输入输出端口被组织在同一个4GB的线性地址空间内。
数据字节以小端格式存放在存储器中。一个字里的最低地址字节被认为是该字的最低有效字
节,而最高地址字节是最高有效字节。
可访问的存储器空间被分成8个主要块,每个块为512MB。

(三)存储器映像

嵌入式SRAM

STM32F10xxx内置64K字节的静态SRAM。它可以以字节、半字(16位)或全字(32位)访问。
SRAM的起始地址是0x2000 0000。

SRAM简介

STM32单片机的SRAM是指其内部集成的静态随机存储器(Random Access Memory)。SRAM是一种易失性存储器,能够快速读写数据,但是需要保持电源供应才能保留其中的数据,关机或掉电会导致其中的数据丢失。

不同型号的STM32单片机具有不同容量的SRAM,例如STM32F103C8T6具有20KB的SRAM,而STM32F407VGT6具有192KB的SRAM。 SRAM用于存储程序运行时的变量和栈等数据。 在进行STM32单片机开发时,需要合理地分配SRAM资源,以满足程序运行的需要。

STM32单片机的SRAM在程序设计中具有重要作用,包括以下几个方面:

  1. 存储变量和栈:SRAM用于存储代码运行时所需要的各种变量和栈。这些变量可能是程序运行时的临时存储器,也可以是需要长期保留的数据。

  2. 数据缓存:SRAM还可用作数据缓存器,提高程序的执行效率。通过将常用的数据缓存在SRAM中,避免了频繁从Flash或外部存储器读取数据的时间开销。

  3. 内存映射I/O:某些STM32单片机的外设寄存器会被直接映射到SRAM中,以便于对外设的访问和控制。

  4. DMA传输:DMA(Direct Memory Access)引擎可以直接读写SRAM,使得大量数据传输更加高效,不需要CPU参与其中。

总之,SRAM是STM32单片机内部重要的存储器,直接影响了程序的运行效率、稳定性和数据存储能力。理解SRAM的特点和使用方法,能够有效提升系统性能、降低功耗,并优化代码设计。

 位段

Cortex™-M3存储器映像包括两个位段(bit-band)区。这两个位段区将别名存储器区中的每个字映射到位段存储器区的一个位,在别名存储区写入一个字具有对位段区的目标位执行读-改-写操作的相同效果。


在STM32F10xxx里,外设寄存器和SRAM都被映射到一个位段区里,这允许执行单一的位段的写和读操作。
下面的映射公式给出了别名区中的每个字是如何对应位带区的相应位的:
bit_word_addr = bit_band_base + (byte_offset× 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执行读-改-写操作有着相同的效果。

 嵌入式闪存

高性能的闪存模块有以下的主要特性:
● 高达512K字节闪存存储器结构:闪存存储器有主存储块和信息块组成:
─ 主存储块容量:
小容量产品主存储块最大为4K× 64位,每个存储块划分为32个1K字节的页(见表2)。
中容量产品主存储块最大为16K× 64位,每个存储块划分为128个1K字节的页(见表3)。
大容量产品主存储块最大为64K× 64位,每个存储块划分为256个2K字节的页(见表4)。
互联型产品主存储块最大为32K× 64位,每个存储块划分为128个2K字节的页(见表5)。

─ 信息块容量:
互联型产品有2360× 64位(见表5)。
其它产品有258× 64位(见表2
30/754、 表3、 表4)。
闪存存储器接口的特性为:
● 带预取缓冲器的读接口(每字为2× 64位)
● 选择字节加载器
● 闪存编程/擦除操作
● 访问/写保护

 闪存的读取

闪存的指令和数据访问是通过AHB总线完成的。预取模块是用于通过ICode总线读取指令的。仲裁是作用在闪存接口,并且DCode总线上的数据访问优先。


读访问可以有以下配置选项:
● 等待时间:可以随时更改的用于读取操作的等待状态的数量。
● 预取缓冲区(2个64位):在每一次复位以后被自动打开,由于每个缓冲区的大小(64位)与闪
存的带宽相同,因此只通过需一次读闪存的操作即可更新整个缓冲区的内容。由于预取缓
冲区的存在, CPU可以工作在更高的主频。 CPU每次取指最多为32位的字,取一条指令
时,下一条指令已经在缓冲区中等待。
● 半周期:用于功耗优化。


注: 1. 这些选项应与闪存存储器的访问时间一起使用。等待周期体现了系统时钟(SYSCLK)频率与闪存访问时间的关系:
0等待周期,当 0 < SYSCLK < 24MHz
1等待周期,当 24MHz < SYSCLK ≤ 48MHz
2等待周期,当 48MHz < SYSCLK ≤ 72MHz


2 . 半周期配置不能与使用了预分频器的AHB一起使用,时钟系统应该等于HCLK时钟。该特性只能用在时钟频率为8MHz或低于8MHz时,可以直接使用的内部RC振荡器(HSI),或者是主振荡器(HSE),但不能用PLL。


3. 当AHB预分频系数不为1时,必须置预取缓冲区处于开启状态。


4. 只有在系统时钟(SYSCLK)小于24MHz并且没有打开AHB的预分频器(即HCLK必须等于
SYSHCLK)时,才能执行预取缓冲器的打开和关闭操作。
一般而言,在初始化过程中执行预取缓冲器的打开和关闭操作,这时微控制器的时钟由8MHz的内部RC振荡器(HSI)提供。


5. 使用DMA: DMA在DCode总线上访问闪存存储器,它的优先级比ICode上的取指高。 DMA在每次传送完成后具有一个空余的周期。有些指令可以和DMA传输一起执行。

编程和擦除闪存 

闪存编程一次可以写入16位(半字)。
闪存擦除操作可以按页面擦除或完全擦除(全擦除)。全擦除不影响信息块。
为了确保不发生过度编程, 闪存编程和擦除控制器块是由一个固定的时钟控制的。
写操作(编程或擦除)结束时可以触发中断。仅当闪存控制器接口时钟开启时,此中断可以用来从WFI模式退出。

(四)、启动配置 

在STM32F10xxx里,可以通过BOOT[1:0]引脚选择三种不同启动模式。

在系统复位后, SYSCLK的第4个上升沿, BOOT引脚的值将被锁存。用户可以通过设置BOOT1和BOOT0引脚的状态,来选择在复位后的启动模式。


在从待机模式退出时, BOOT引脚的值将被被重新锁存;因此,在待机模式下BOOT引脚应保持为需要的启动配置。在启动延迟之后, CPU从地址0x0000 0000获取堆栈顶的地址,并从启动存储器的0x0000 0004指示的地址开始执行代码。

因为固定的存储器映像,代码区始终从地址0x0000 0000开始(通过ICode和DCode总线访问),而数据区(SRAM)始终从地址0x2000 0000开始(通过系统总线访问)。 Cortex-M3的CPU始终从ICode总线获取复位向量,即启动仅适合于从代码区开始(典型地从Flash启动)。

STM32F10xxx微控制器实现了一个特殊的机制,系统可以不仅仅从Flash存储器或系统存储器启动,还可以从内置SRAM启动。

 (五)、结语

以上就是我对STM32F10XXX存储器和总线架构的学习和了解,文中涉及到一些名词较为陌生和抽象,我在最初学习的时候也是倍感无聊和痛苦,不过经过我查阅相关资料和文档,感觉静下心来学完后,还是受益匪浅的。故写此总结,与渴望知识的我们共享!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1304805.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

接口自动化测试之Yaml数据驱动封装!

一、数据驱动&#xff1a;pytest.mark.parametrize(&#xff09; 首先看个样本&#xff1a; import pytestclass TestData:# parametrize有两个值&#xff0c;一个是args_name:参数名&#xff0c;一个是args_value:参数值,可以有多个&#xff0c;进行数据解包# args_value可以…

Windows环境提示“‘mysql‘ 不是内部或外部命令,也不是可运行的程序或批处文理件” 简易记录

在Windows环境下使用DOS命令窗登入MYSQL&#xff0c;提示“mysql 不是内部或外部命令&#xff0c;也不是可运行的程序或批处理文件。” 这意味着系统无法找到 mysql.exe可执行文件&#xff0c;这是因为 MySQL 没有正确安装或未添加到系统PATH环境变量中所致。 处理方法&#x…

巧用ChatGPT系列丛书(由北京大学出版社出版)

前言 随着人工智能技术的迅速发展&#xff0c;越来越多的工具和应用程序被应用于职场中&#xff0c;以提高我们的工作效率。其中&#xff0c;ChatGPT作为一种先进的自然语言处理技术&#xff0c;正在逐渐引起人们的关注。 ✨巧用ChatGPT系列书籍&#xff1a; 《巧用chatGPT快…

文献速递:PET-影像组学专题--临床上在乳腺癌方面PET-MRI的进展

文献速递&#xff1a;PET-影像组学专题–临床上在乳腺癌方面PET-MRI的进展 01 文献速递介绍 成像在乳腺癌的筛查、诊断、分期和管理中扮演着关键角色。乳房X线摄影&#xff08;mammography&#xff09;、超声检查和动态增强乳腺MRI是主要的乳腺癌成像方法。对于怀疑或已知有…

【教程】开始使用ipaguard进行代码加固混淆

目录 前言 下载ipa代码混淆保护工具 获取ipaguard登录码 代码混淆 文件混淆 IPA重签名与安装测试 前言 iOS加固保护是直接针对ios ipa二进制文件的保护技术&#xff0c;可以对iOS APP中的可执行文件进行深度混淆、加密。使用任何工具都无法逆向、破解还原源文件。对APP进…

mysql数据恢复

使用MySQL第三方工具binlog2sql binlog2sql&#xff0c;一款基于python开发的开源工具&#xff0c;是由大众点评团队的DBA使用python开发出来的&#xff0c;从MySQL binlog解析出你要的SQL。根据不同选项&#xff0c;你可以得到原始SQL、回滚SQL、去除主键的INSERT SQL等。其功…

《Vue.js设计与实现》—Vue3响应系统的原理

一、响应式数据与副作用函数 1. 副作用函数 1-1 指令材料 在JavaScript中&#xff0c;副作用函数是指在执行过程中对外部环境产生可观察的变化或影响的函数。这种函数通常会修改全局变量、修改传入的参数、执行I/O操作&#xff08;如读写文件或发送网络请求&#xff09;、修…

Dockerfile创建镜像LNMP+WordPress

实验部署 INMPwordpress nginx 172.111.0.10 docker-nginx mysql 172.111.0.20 docker-mysql php 172.111.0.30 docker-php nginx 关闭防火墙和安全机制在opt目录创建nginx MySQL php目录 cd nginx mysql php vim Dockerfile#声明基础镜像 FROM centos:7 #安装依赖环境 R…

Datawhale 12月组队学习 leetcode基础 day1 枚举

这是一个新的专栏&#xff0c;主要是一些算法的基础&#xff0c;对想要刷leedcode的同学会有一定的帮助&#xff0c;如果在算法学习中遇到了问题&#xff0c;也可以直接评论或者私信博主&#xff0c;一定倾囊相助 进入正题&#xff0c;今天咱们要说的枚举算法&#xff0c;这是个…

NGINX高性能服务器与关键概念解析

目录 1 NGINX简介2 NGINX的特性3 正向代理4 反向代理5 负载均衡6 动静分离7 高可用8 结语 1 NGINX简介 NGINX&#xff08;“engine x”&#xff09;在网络服务器和代理服务器领域备受推崇。作为一款高性能的 HTTP 和反向代理服务器&#xff0c;它以轻量级、高并发处理能力以及…

供配电运维智能监控系统

供配电运维智能监控系统是一种针对供配电系统的智能监控设备&#xff0c;依托电易云-智慧电力物联网&#xff0c;旨在实现对供配电系统的实时监控、数据记录和分析&#xff0c;以及异常预警和故障检测等功能&#xff0c;以提高供配电系统的可靠性和稳定性。 该系统通常由以下部…

WhatsApp全球获客怎么做?

一、导语 随着全球数字化趋势的加速&#xff0c;WhatsApp作为一种即时通讯工具&#xff0c;已经成为了连接全球用户的桥梁。 对于企业和营销人员来说&#xff0c;利用WhatsApp拓展全球业务是一种非常有效的策略&#xff0c;本文将为您揭示WhatsApp全球获客的秘密&#xff0c;…

【小尘送书-第十三期】Python从入门到精通(第3版)(软件开发视频大讲堂)

大家好&#xff0c;我是小尘&#xff0c;欢迎你的关注&#xff01;大家可以一起交流学习&#xff01;欢迎大家在CSDN后台私信我&#xff01;一起讨论学习&#xff0c;讨论如何找到满意的工作&#xff01; &#x1f468;‍&#x1f4bb;博主主页&#xff1a;小尘要自信 &#x1…

python:六种算法(RFO、SSA、WOA、GWO、PSO、GA)求解23个测试函数(python代码)

一、六种算法简介 1、红狐优化算法RFO 2、麻雀搜索算法SSA 3、鲸鱼优化算法WOA 4、灰狼优化算法GWO 5、粒子群优化算法PSO 6、遗传算法GA 二、6种算法求解23个函数 &#xff08;1&#xff09;23个函数简介 参考文献&#xff1a; [1] Yao X, Liu Y, Lin G M. Evolution…

简单了解RNN循环神经网络

为什么需要RNN&#xff08;循环神经网络&#xff09; 将神经网络模型训练好之后&#xff0c;在输入层给定一个x&#xff0c;通过网络之后就能够在输出层得到特定的y&#xff0c;那么既然有了这么强大的模型&#xff0c;为什么还需要RNN&#xff08;循环神经网络&#xff09;呢…

资深测试总结,性能测试目的如何做?主要看什么指标?

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 1、性能测试是什么…

学生管理系统 数据库版

如题&#xff1a; 一.SQL部分 a. b. c. 修改&#xff1a; 二.Java部分 代码&#xff1a; 结果

STM32CubeIDE串口空闲中断实现不定长数据接收

STM32F051空闲中断实现串口不定长数据接收 目的编程软件配置串口开中断中断程序 运行结果 目的 在串口输入不定长数据时&#xff0c;通过串口空闲中断来断帧接收数据。 编程软件 STM32CubeIDE STM32CubeMX配置MCU。通过对端口配置&#xff0c;自动生成程序&#xff0c;减少编…

Godot Engine:跨平台游戏开发的新境界 | 开源日报 No.92

godotengine/godot Stars: 62.6k License: MIT Godot Engine 是一个功能强大的跨平台游戏引擎&#xff0c;可用于创建 2D 和 3D 游戏。它提供了一套全面的常见工具&#xff0c;让用户可以专注于制作游戏而不必重复造轮子。该引擎支持将游戏一键导出到多个平台上&#xff0c;包…

3D漫游:沉浸式数字空间,步进式漫游新体验

5G时代的普及&#xff0c;使得人们对信息获取的要求越来越高&#xff0c;同时标准也越来越严格&#xff0c;3D漫游虚拟空间的体验&#xff0c;为很多用户提供了更加直观、生动的视觉体验。3D步进式漫游以其生动逼真的视觉效果和沉浸式体验&#xff0c;吸引着人们的关注以及多种…