一文读懂STM32芯片总线

news2024/11/28 14:29:07

目录

一、前言

二、总线基础知识概述

(1)、总线在芯片中的角色

(2)、总线的类型

(3)、总线的指标

(4)、AHB和APB

三、总线框架结构

(1)、结构类型

(2)、总线模块

(3)、总线交互

四、总结


一、前言

        本篇介绍STM32芯片内部的总线系统结构,嵌入式芯片内部的总线和计算机总线类似,先来看一下通常定义下计算机总线定义,即计算机的总线是一种内部结构,它是cpu、内存、输入、输出设备传递信息的公用通道,主机的各个部件通过总线相连接,外部设备通过相应的接口电路再与总线相连接,从而形成了计算机硬件系统。在计算机系统中,各个部件之间传送信息的公共通路叫总线,微型计算机是以总线结构来连接各个功能部件的。

图片

图1 计算机总线结构

        计算机设备和设备之间传输信息的公共数据通道。总线是连接计算机硬件系统内多种设备的通信线路,它的一个重要特征是由总线上的所有设备共享,可以将计算机系统内的多种设备连接到总线上。如果是某两个设备或设备之间专用的信号连线,就不能称之为总线。

        因此STM32这类嵌入式芯片的总线可概括理解为:是各种信号线的集合,总线可以划分为数据总线、地址总线和控制总线,分别用来传输数据、数据地址和控制信号。

二、总线基础知识概述

图片

图2 总线基础知识

(1)、总线在芯片中的角色

        ARM公司负责提供设计内核,而其他外设则为芯片商设计并使用,ARM收取其专利费用而不参与其他经济活动,半导体芯片厂商拿到内核授权后,根据产品需求,添加各类组件,生产芯片售卖。图3为STM32的组成示意图,其中Cortex-M3内核、调试系统都是ARM公司设计,内部总线、外设、存储、时钟复位等都由ST公司开发。由图3中可以明显看出总线是cpu、内存、外设传递信息的公用通道,芯片上的各个部件通过总线相连接。

图片

图3 STM32芯片简要结构图

(2)、总线的类型

        A、数据总线DB用来传送数据信息,是双向的。CPU既可通过DB从内存或输入设备读入数据,又可通过DB将内部数据送至内存或输出设备。DB的宽度决定了CPU和计算机其他设备之间每次交换数据的位数。数据总线的位数是微型计算机的一个重要指标,通常与微处理的字长相一致。需要指出的是,数据的含义是广义的,它可以是真正的数据,也可以是指令代码或状态信息,有时甚至是一个控制信息,因此,在实际工作中,数据总线上传送的并不一定仅仅是真正意义上的数据。

        B、地址总线AB用于传送CPU发出的地址信息,是单向的。传送地址信息的目的是指明与CPU交换信息的内存单元或I/O设备。存储器是按地址访问的,所以每个存储单元都有一个固定地址,要访问1MB存储器中的任一单元,需要给出1M个地址,即需要20位地址(2^20=1M)。一般来说,若地址总线为n位,则可寻址空间为2^n字节。因此,地址总线的宽度决定了CPU 的最大寻址能力。

        C、控制总线CB用来传送控制信号、时序信号和状态信息等,是双向的。其中有的是CPU向内存或外部设备发出的信息,如读/写信号,片选信号、中断响应信号等;有的是内存或外部设备向CPU发出的信息,中断申请信号、复位信号、总线请求信号、设备就绪信号等。显然,CB中的每一条线的信息传送方向是一定的、单向的,但作为一个整体则是双向的。所以,凡涉及到控制总线CB,均是以双向线表示。

(3)、总线的指标

        A、总线的位宽

        总线的位宽指的是总线能同时传送的二进制数据的位数,或数据总线的位数,即32位、64位等总线宽度的概念。总线的位宽越宽,每秒钟数据传输率越大,总线的带宽越宽。

        B、总线的工作频率

        总线的工作时钟频率以MHZ为单位,工作频率越高,总线工作速度越快,总线带宽越宽。

        C、总线的带宽(总线数据传输速率)

        总线的带宽指的是单位时间内总线上传送的数据量,即每秒钟传送MB的最大稳态数据传输率 。与总线密切相关的两个因素是总线的位宽和总线的工作频率,它们之间的关系:

        总线的带宽=总线的工作频率*总线的位宽/8

        或者 总线的带宽=(总线的位宽/8)/总线周期

(4)、AHB和APB

        AMBA(Advanced Microprocessor Bus Architecture)是ARM公司提出的一种开放性的SoC总线标准,现在已经广泛的应用于RISC的内核上了。AMBA定义了一种多总线系统(multilevel busing system),包括系统总线和等级稍低的外设总线。 AMBA支持32位、64位、128位的数据总线,和32位的地址总线,同时支持byte和half-word设计。 它定义了两种总线:

        AHB(Advanced High-performance Bus)先进的高性能总线,也叫做ASB(Advanced System Bus)。APB(Advanced peripheral Bus)先进的外设总线 AHB和ASB其实是一个东西,是高速总线, AHB总线的强大之处在于它可以将微控制器(CPU)、高带宽的片上RAM、高带宽的外部存储器接口、DMA总线、各种拥有AHB接口的控制器等等连接起来构成一个独立的完整的SOC系统,不仅如此,还可以通过AHB-APB桥来连接APB总线系统。AHB可以成为一个完整独立的SOC芯片的骨架。

        APB是低速总线,主要负责外设接口 ,低速且低功率的外围设备,用于低带宽的周边外设之间的连接,例如UART、SPI等,可针对外围设备作功率消耗及复杂接口的最佳化。AHB和APB之间是通过Bridge(桥接器)连接的 。

图片

图4 AHB和APB连接关系

三、总线框架结构

图片

图5 总线框架结构内容

        如图6,以STM32F42XXX和STM32F43XXX器件总线系统架构为例。

图片

图6 STM32F42xxx和STM32F43xxx的总线系统架构

(1)、结构类型

        STM32芯片是属于哈佛架构,即数据和程序指令分别存储,总线设计有一条指令总线(I-Bus)、一条数据总线(D-Bus),地址总线则与所有IO和外设相连,按照内核架构统一的存储器映射表分配对应地址。

        哈佛架构与冯诺依曼的最大区别在于:哈佛架构的数据总线,指令总线是分开独立的,CPU通过Icode从Flash中取指令,再译码,得到数据的地址,再通过Dcode总线和SRAM进行数据交互。

        哈佛架构的优势:并行体系结构,将程序指令和数据存储在不同的存储空间中,每个存储器独立编址、独立访问。哈佛架构的微处理器通常具有较高的执行效率,其程序指令和数据指令分开组织和储存的,执行时可以预先读取下一条指令。

(2)、总线模块

A、总线矩阵

        图6中S是主控总线,M是被控总线,总线矩阵用于主控总线之间的访问仲裁管理,仲裁采用循环调度算法。有了总线矩阵,就可以让主设备和从设备进行并行访问,提升了访问效率,同时也降低了功耗。

        需要注意的是,虽然总线矩阵使得多个主设备可以并行访问不同的从设备,但在一个定义的时间段内,只有一个主设备拥有总线矩阵的控制权,如果有多个主设备同时出现总线请求时就得进行仲裁。所以有了总线仲裁器,就能保证每个时刻只有一个主设备通过总线矩阵对从设备进行访问。

         因为总线矩阵的存在,使得多个主设备可以并行访问不同的从设备,增强了数据传输能力,提升了访问效率,同时也改善了功耗性能。为了确保每个主设备访问从设备的延迟尽量短,在总线矩阵里实行循环调度优先级方案:
        • 循环调度仲裁策略使总线带宽合理分配。
        • 限定最大延时。
        • 循环调度以1次传输为单位。

        图中纵横交错的就是多层AHB总线矩阵,负责把上方主设备跟右边从设备互联起来。所谓AHB主设备是指CPU或DMA,由它们启动总线访问,即读写操作。那些响应主设备读写访问的设备就是AHB从设备,比如存储器、各类外设等。注意并非所有主设备访问从设备都得经过总线矩阵,如图中,有些主设备和从设备间有直通通道。

B、八条主控总线

        CCM(Core Coupled Memory)是给F4内核专用的全速64KB RAM, 它们没有经过总线矩阵, F4内核与之直接相连, 地址空间在0x1000_0000 ~ 0x1000_FFFF。可以用作堆栈以及高速运算的数据缓存;

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

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

        S总线:此总线用于将 Cortex-M4F 内核的系统总线连接到总线矩阵。此总线用于访问位于外设或 SRAM中的数据。也可通过此总线获取指令(效率低于 ICode)。此总线访问的对象是112 KB、 64 KB 和 16 KB 的内部 SRAM、包括 APB 外设在内的 AHB1 外设、 AHB2 外设以及通过 FSMC 的外部存储器;

        S3,S4:DMA存储器总线:此总线用于将 DMA 存储器总线主接口连接到总线矩阵。DMA 通过此总线来执行存储器数据的传入和传出。此总线访问的对象是数据存储器:内部 SRAM( 112 KB、 64 KB、 16 KB)以及通过 FSMC 的外部存储器;

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

        S6:以太网 DMA 总线,此总线用于将以太网 DMA 主接口连接到总线矩阵。以太网 DMA通过此总线向存储器存取数据。此总线访问的对象是数据存储器:内部 SRAM( 112 KB、 64 KB和 16 KB)以及通过FSMC的外部存储器;

        S7: USB OTG HS DMA 总线,此总线用于将 USB OTG HS DMA 主接口连接到总线矩阵。USB OTG DMA 通过此总线向存储器加载/存储数据。此总线访问的对象是数据存储器:内部 SRAM(112 KB、 64 KB 和 16 KB)以及通过 FSMC 的外部存储器。

C、七条被控总线

        内部 FLASH ICode 总线:是内核与内部闪存存储器(FLASH)指令接口之间的连接的总线,实现指令的预取功能;

        内部 FLASH DCode 总线:将内核与内部闪存存储器(FLASH)的数据接口连接起来的总线,实现数据读取;

        主要内部 SRAM1(112KB);

        辅助内部 SRAM2(16KB);

        辅助内部 SRAM3(64KB) (仅适用 STM32F42xx 和 STM32F43xx 系列器件);

        AHB1外设和AHB2外设:不同时钟频率的用于高性能模块(如CPU、DMA和DSP等)之间的连接总线;

        FSMC可变静态存储控制器:是STM32系列采用的一种新型的存储器扩展技术,FSMC能够根据不同的外部存储器类型,发出相应的数据/地址/控制信号类型以匹配信号的速度,从而使得STM32系列微控制器不仅能够应用各种不同类型、不同速度的外部静态存储器,而且能够在不增加外部器件的情况下同时扩展多种不同类型的静态存储器,满足系统设计对存储容量、产品体积以及成本的综合要求。能够与同步或异步存储器和 16 位 PC 存储器卡连接,STM32的 FSMC接口支持包括 SRAM、NAND FLASH、NOR FLASH 和 PSRAM 等存储器。

(3)、总线交互

        指令总线和数据总线如6图所示只会负责对应存储地址范围内的传输,剩下片内外设和外界设备则是需要通过系统总线(AHB)进行数据的传输,对于低速外设则是挂载在相对较慢的外设总线(APB)总线,APB总线通过一个桥接器最终还是会挂载到AHB总线上。

        主设备和从设备通过各自的总线两两相交连接,图6中两条总线相交且为圆圈的地方,表示这两条总线对应的主设备可以访问从设备,如I总线(指令总线),只有跟 M0、M2和M6这三根被控总线交叉的时候才有圆圈,就表示I总线只能跟这三根被控总线通信,这样就可以知道stm32f4的启动有三种分别是FLASH、内部SRAM、外部存储FSMC。

        当多个AHB主设备试图同时访问同一个AHB从设备时,总线矩阵仲裁器介入以解决访问冲突。在下面的例子中CPU和DMA1均试图访问SRAM1以读取数据。

图片

图7 CPU和DMA1请求访问SRAM1

        如上述示例总线访问请求同时发生的情况下,就需要总线矩阵仲裁。为了解决这种问题,需要应用循环调度策略:如果本次最后赢得总线控制权的主设备是CPU,则在下一次访问中DMA1将赢得总线控制权并首先访问SRAM1。CPU随后方可有权访问SRAM1。

        这就表明,一个主设备的传输延时取决于其它等待请求访问AHB从设备的主设备数量。下面的例子是五个主设备试图同时访问SRAM1的情形:

图片

图8 五个主设备请求SRAM

        DMA1再次获得总线矩阵访问权并访问SRAM1的延时等于其它等待请求的所有主设备的执行时间之和。

        我们再来看看进行总线矩阵仲裁可能导致的DMA传输延时最差情况。主设备DMA端口进行一次数据传输会遭遇的延时取决于其它主设备的传输类型和长度。比如,我们结合上面的DMA1 & CPU的例子,它们并行访问SRAM。DMA传输延时将随着CPU数据传输事务长度而变化。如果总线访问首先给予CPU且不是执行单次数据加载/存储,DMA访问SRAM的等待时间可能从一个AHB周期(单次数据加载/存储时间)延长为N个AHB周期,这里N为CPU数据传输事务中数据的数量。

        CPU锁定AHB 总线以保持其访问总线的所有权,减少了多次加载/ 存储操作过程中的延时以及进入中断的延时。这提高了固件的响应能力,但是可能导致DMA数据传输事务的延迟。

        DMA1与CPU并行访问SRAM的延时取决于传输类型:
        • 中断(上下文保护)发起的CPU传输:8个AHB周期;
        • LDM/STM 指令发起的CPU传输:14个AHB周期;
        ---在多达14 个寄存器与存储器之间进行传输;

图片

图9 中断发起的传输带来的DMA传输延时

        上图详细描述了一个因中断进入而导致DMA多周期传输延迟的情形。DMA存储器端口被触发,发出存储器访问请求。经过仲裁, AHB总线未授权DMA1存储器端口访问,而由CPU来访问总线。可以看到在服务DMA请求之前有一段额外的延时。这段中断发起的CPU传输,耗时为8个AHB周期。

        不难理解,当同时对一个从设备进行寻址且数据传输事务长度不是一个数据单元时,其他主设备(如DMA2,USB_HS, Ethernet…)也会碰到类似情形。所以,为了提高DMA对总线矩阵的访问性能,要尽量回避总线竞争。


四、总结

        本篇对STM32芯片内部的总线机制进行了一系列的介绍,部分信息来源自STM32的官方资料中对芯片系统架构的介绍。通过对总线概念的阐述可以去更好的为进一步认识STM32内部总线框架提供基础,从STM32的总线框架中,可以了解到STM32芯片内部总线的设计模型和基本的工作原理,从而对STM32的芯片总线内部结构有一个初步的认知。


↓↓↓更多技术内容和书籍资料获取,入群技术交流敬请关注“明解嵌入式”↓↓↓ 

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

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

相关文章

C++11左值和右值、左值引用和右值引用浅析

从字面意思来讲,左值就是“能用在赋值语句等号左侧的内容(它得代表一个地址)”;右值就是不能作为左值的值,即右值不能出现在赋值语句中等号的左侧。C中的一条表达式,要么就是右值,要么就是左值&…

钉钉监控Hippo4j线程池通知报警

🚀 线程池管理工具-Hippo4j 🚀 🌲 AI工具、AI绘图、AI专栏 🍀 🌲 如果你想学到最前沿、最火爆的技术,赶快加入吧✨ 🌲 作者简介:硕风和炜,CSDN-Java领域优质创作者&#…

软考03海明校验码

文章目录 前言一、练习一二、练习二总结 前言 海明校验码可以用来纠正错误 公式: 2k-1≥nk n为数据位,k为校验位 编码规则:校验位为2的次方,其他为数据位。 一、练习一 数据位为4,校验位最小为多少位? 答&…

《微服务架构设计模式》第十二章 部署微服务应用

内容总结自《微服务架构设计模式》 部署微服务应用 一、部署模式分类二、编程语言特定的发布包格式1、概述2、利弊 三、将服务部署为虚拟机1、概览2、利弊 四、将服务部署为容器1、概述2、利弊3、K8S部署 五、Serverless部署1、概述2、利弊3、示例 六、总结 一、部署模式分类 …

计算机丢失msvcp140.dll是什么意思?哪个修复方法更推荐

打开photoshop软件的时候,计算报错丢失msvcp140.dll是什么意思?软件也无法正常启动运行,这个主要的原因就是电脑系统中的msvcp140.dll文件丢失或者损坏了,运行需要该文件的程序或应用程序时,操作系统无法找到该特定的动…

低代码都做了什么?怎么实现 Low-Code?

前言 低代码的概念早在很多很多年前就已经出现了,比如最早期的Dreamweaver 1.0,使用这种可视化编辑工具根本不需要投入较高的学习成本就可以轻松实现一个Web页面。而低代码最大的初衷也正是让开发者或用户减少编码时间,从而把更多的时间和精力…

Python应用实例(二)数据可视化(五)

数据可视化(五)制作全球地震散点图:JSON格式 1.地震数据2.查看JSON数据3.创建地震列表4.提取震级5.提取位置数据6.绘制震级散点图7.另一种指定图表数据的方式 下载一个数据集,其中记录了一个月内全球发生的所有地震,再…

Unity3d-路径巡逻

使用U3D实现的简单巡逻方法 游戏对象逐个向组成路径的节点进行直线移动两种巡逻方案 根据列表顺序移动,到达最后一个后,直接返回第一个,重新开始循环根据列表顺序移动,到达最后一个后,根据顺序反向移动到第一个&#…

用 Pytest+Appium+Allure 做 UI 自动化的那些事~(有点干)

目录 前言: Appium 不常见却好用的方法 Appium 直接执行 adb shell 方法 Appium 直接截取元素图片的方法 Appium 直接获取手机端日志 Appium 直接与设备传输文件 Pytest 与 Unittest 初始化上的区别 1.Pytest 与 unitest 类似,有些许区别&#x…

【嘉立创EDA】客户端版本嘉立创专业版半离线版更新方法

文章路标👉 文章解决问题主题内容工程文件备份保护问题新版本更新通知文章解决问题 1️⃣ 嘉立创EDA专业版,是时下越发常用的PCBA设计软件之一。该环境除了在规划的设计开发过程中,为响应各用户的建议、需求,其迭代更新速度也是很快。为了使用最新的功能,用户需要使用最…

C++学习——类和对象(一)

C语言和C语言最大的区别在于在C当中引入了面向对象的编程思想,想要完全了解c当中的类和对象,就要从头开始一点一点的积累并学习。 一:什么是面向对象编程 我们之前学习的C语言属于面向过程的编程方法。举一个简单的例子来说:面向过…

Linux地盘上AMD处理器称王了

近日资讯,尽管从全局来看,Linux系统份额远不及Windows,但在程序员、开发者、硬核玩家圈子,Linux则备受推崇。 来自Steam的最新数据显示,在Linux游戏用户中,AMD处理器的份额占据绝对优势,达到了…

Spring Cloud—GateWay之限流

RequestRateLimiter RequestRateLimiter GatewayFilter 工厂使用 RateLimiter 实现来确定是否允许当前请求继续进行。如果不允许,就会返回 HTTP 429 - Too Many Requests(默认)的状态。 这个过滤器需要一个可选的 keyResolver 参数和特定于…

cpuset.cpus.effective: no such file or directory (修改 docker cgroup 版本的方法)

要切换使用 v1 版 cgroup,需要做如下配置: vim /etc/default/grubGRUB_CMDLINE_LINUX"systemd.unified_cgroup_hierarchy0"update-grubreboot完美解决

【条件与循环】——matlab入门

目录索引 if:else与elseif: for: if: if 条件语句块 endelse与elseif: if 条件代码块 elseif 条件代码块 else 代码块 endfor: for 条件循环体 end在matlab里面类似的引号操作都是包头又包尾的。上面的c…

TypeScript基础篇 - TS介绍

目录 Typescript的定义 type.ts 深入了解Typescript Typescript应该学到什么程度? Typescript学习方法 如何学好TS 小节:常见学习误区 一张ai生成图~ Typescript的定义 2012年微软发布的一门编程语言 Transcompiler【翻译编译器】Typescript——…

操作符详解(2)

文章目录 8. 条件操作符9. 逗号表达式10. 下标引用、函数调用和结构成员11. 表达式求值11.1 隐式类型转换11.2 算术转换11.3 操作符的属性 附: 8. 条件操作符 exp1 ? exp2 : exp3 int main() {int a 0;int b 0;if (a > 5){b 3;}else{b -3;}//(a > 5) ? …

【Elasticsearch】黑马旅游案例

目录 4.黑马旅游案例 4.1.酒店搜索和分页 4.1.1.需求分析 4.1.2.定义实体类 4.1.3.定义controller 4.1.4.实现搜索业务 4.2.酒店结果过滤 4.2.1.需求分析 4.2.2.修改实体类 4.2.3.修改搜索业务 4.3.我周边的酒店 4.3.1.需求分析 4.3.2.修改实体类 4.3.3.距离排序…

linux学习笔记(1)----基础知识

1.linux用户 ubuntu有三种用户: 1)初次创建的用户 2)root用户 3)普通用户 linux用户记录在etc/passwd这个文件内 linux用户密码在etc/shadow这个文件内 2.linux用户组 为了方便管理,将用户进行分组&#xff0c…

.NET Native AOT的静态库与动态库

.NET不仅可以使用 C静态库与动态库,也可以将.NET实现的函数导出为C静态库与动态库。在没有Native Aot之前,.NET只能通过P/Invoke享受C/C生态,而在Native Aot之后,不仅可以享受这些生态,还可以开发SDK供其他语言调用。 …