STM32系统架构介绍
STM32系统架构
- 1. CM3/4系统架构
- 2. CM3/4系统架构-----存储器组织结构
- 2.1 寄存器地址映射(特殊的存储器)
- 2.2 寄存器地址计算
- 2.3 寄存器的封装
- 3. CM3/4系统架构-----时钟系统
STM32 和 ARM 以及 ARM7是什么关系?
ARM是一个做芯片标准的公司,它负责的是芯片内核的架构设计;ARM7和STM32是ST等芯片公司生产的某一种类型的芯片。ST是一个不做标准的芯片公司,根据 ARM 公司提供的芯片内核标准设计自己的芯片。所以,任何一个做 Cortex-M3 芯片,他们的内核结构都是一样的,不同的是他们的存储器容量,片上外设,IO 以及其他模块的区别。不同公司设计的 Cortex-M3 芯片他们的端口数量,串口数量,控制方法这些都是有区别的,这些资源他们可以根据自己的需求理念来设计。
1. CM3/4系统架构
注意:CM3和CM4系统架构有差异,上面为CM3系统架构,下列为CM4系统架构。
主系统由 32 位多层 AHB 总线矩阵构成,可实现以下部分的互连:
八条主控总线 七条被控总线 内核I总线(不适用于CM3) 内部 Flash ICode 总线 内核D总线 内部 Flash DCode 总线 内核S总线 主要内部 SRAM1 (112 KB) DMA1存储器总线 辅助内部 SRAM2 (16 KB) DMA2 存储器总线描述 辅助内部 SRAM3 (64 KB) DMA2 外设总线(不适用于CM3) AHB1 外设(包括 AHB-APB 总线桥和 APB 外设) 以太网 DMA 总线 AHB2 外设(不适用于CM3) USB OTG HS DMA 总线(不适用于CM3) FSMC(不适用于CM3) 借助总线矩阵,可以实现主控总线到被控总线的访问,这样即使在多个高速外设同时运行期间,系统也可以实现并发访问和高效运行。64 KB CCM(内核耦合存储器)数据 RAM 不属于总线矩阵,只能通过 CPU 对其进行访问。
总线接口 描述 S0:
I 总线此总线用于将CM3/4内核的指令总线连接到总线矩阵。内核通过此总线获取指令。 此总线访问的对象是包含代码的存储器(内部 Flash/SRAM 或通过 FSMC 的外部存储器) S1:
D 总线此总线用于将CM3/4数据总线和 64 KB CCM 数据 RAM 连接到总线矩阵。内核通过此总线进行立即数加载和调试访问。此总线访问的对象是包含代码或数据的存储器(内部Flash 或通过 FSMC 的外部存储器)。 S2:
S 总线此总线用于将CM3/4内核的系统总线连接到总线矩阵。此总线用于访问位于外设 或 SRAM 中的数据。也可通过此总线获取指令(效率低于 ICode)。此总线访问的对象是 112 KB、64 KB 和 16 KB 的内部 SRAM、包括 APB 外设在内的 AHB1 外设、AHB2 外设以及通过 FSMC 的外部存储器。 S3/4:
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 的外部存储器。 总线矩阵 总线矩阵用于主控总线之间的访问仲裁管理。仲裁采用循环调度算法。 AHB/APB 总线桥 (APB) 借助两个 AHB/APB 总线桥 APB1 和 APB2,可在 AHB 总线与两个 APB 总线之间实现完全同步的连接,从而灵活选择外设频率。
STM32 芯片是已经封装好的成品,主要由内核和片上外设组成。若与电脑类比,内核与外设就如同电脑上的 CPU 与主板、内存、显卡、硬盘的关系。STM32F103 采用的是 Cortex-M3 内核,内核即 CPU,由 ARM 公司设计。ARM 公司并不生产芯片,而是出售其芯片技术授权。芯片生产厂商 (SOC) 如 ST、TI、Freescale,负责在内核之外设计部件并生产整个芯片,这些内核之外的部件被称为核外外设或片上外设。如 GPIO、USART(串口)、I2C、SPI 等都叫做片上外设。
Cortex-M处理器基于一种加载-存储架构,数据需要从存储器中加载和处理后,使用多个单独的指令写回存储器。例如:要增加SRAM中存储的数据值,处理器需要使用一条指令从SRAM中读出数据,并且将数据放到处理器的寄存器中,然后使用第二条指令增加寄存器中的数据值,最后使用第三条指令将数据值写回寄存器。
内核即CPU内部的各种译码和执行电路。指令对中断控制器(NVIC)、系统计时器(SysTick)、三阶流水线(取指、解码、执行)、浮点单元(FPU)和指令跟踪接口(ITM)等的操作,其实都是对其寄存器的操作,它们都是由内部寄存器构成的。对这些寄存器的了解参考( cortex-m3与cortex-m4中的寄存器)。
内核的主要组成部分:
- 内核Core:处理器最核心的部分,负责几乎所有的运算和控制程序运行过程,包括中断响应服务。内核由多个部分构成,包括
中断控制器(NVIC)、系统计时器(SysTick)、三阶流水线(取指、解码、执行)、浮点单元(FPU)和指令跟踪接口(ITM)- 调试系统:主要用于固件的调试和监视系统的运行状态。它支持JTAG或2针串行线调试(SWD),支持多处理器和实时跟踪。
- 寄存器组:
通用寄存器组:包括堆栈指针、连接寄存器、程序计数器等。
程序状态寄存器(xPSR):用于存储程序的状态信息。
中断屏蔽寄存器组:用于控制中断的屏蔽。
控制寄存器(CONTROL):用于控制处理器的各种功能。- 存储器保护单元MPU:是内核中的一个模块,用于控制和管理存储器的访问权限。它并不是ARM内核的一部分,而是处理器内部的一个独立模块。
- 内存管理单元MMU:将虚地址转换成物理地址。
指令的执行过程与寄存器的关系:
- 指令获取与执行:ARM处理器在执行指令时,首先
从内存中获取指令,并将其存储在寄存器中。处理器通过寄存器读取指令并执行相应的操作。例如,当处理器执行一条ARM指令时,程序计数器(PC)的值会增加4个字节;而执行一条Thumb指令时,PC的值会增加2个字节- 寄存器的作用:ARM处理器有37个寄存器,包括31个通用寄存器和6个状态寄存器。通用寄存器用于存储数据和地址,而状态寄存器用于标识CPU的工作状态和程序的运行状态。寄存器在指令执行过程中起着关键作用,它们存储指令、数据和地址,帮助处理器高效地执行任务
- 工作模式与寄存器:ARM处理器支持7种运行模式,包括用户模式、快速中断模式、外部中断模式、管理模式、数据访问终止模式、系统模式和未定义指令中止模式。不同的运行模式下,寄存器的使用权限和功能有所不同。例如,用户模式下,程序不能直接访问所有系统资源,而特权模式下则可以。
- 异常处理与寄存器:在异常发生时,处理器会切换到相应的异常处理模式,并保存当前的执行状态。异常处理过程中,寄存器的使用也非常重要。例如,当发生异常时,系统会将下一条指令存入链接寄存器(LR),并将当前程序状态字(CPSR)保存到备份程序状态字(SPSR),然后跳转到异常处理函数。处理完成后,系统会恢复之前的执行状态。
详细的介绍参考下列文档:
- 《Cortex-M3权威指南(中文)》
- 《CM3技术参考手册》
- 《STM32中文参考手册_V10》
- 《Cortex M3与M4权威指南》
- 《STM32F3与F4系列Cortex M4内核编程手册》
- 《STM32F4xx参考手册_V4(中文版)》
2. CM3/4系统架构-----存储器组织结构
程序存储器、数据存储器、寄存器和 I/O 端口排列在同一个顺序的 4 GB 地址空间内。
STM32是一个32位单片机,可以很方便的访问4GB以内的存储空间(2^32 = 4GB),Cortex M3/M4内核将STM32芯片架构中的所有结构,包括:FLASH、SRAM、外设及相关寄存器等全部组织在同一个4GB的线性地址空间内,我们可以通过C语言来访问这些地址空间,从而操作相关外设(读/写)。数据字节以小端格式(小端模式)存放在存储器中,数据的高字节保存在内存的高地址中,而数据的低字节保存在内存的低地址中。
存储器本身是没有地址信息的,我们对存储器分配地址的过程就叫存储器映射。这个分配一般由芯片厂商做好了,芯片厂商将所有的存储器及外设资源都映射在一个4GB的地址空间上(8个块),从而可以通过访问对应的地址,访问具体的外设。存储器空间包括程序代码、数据、外设以及处理器内部的调试支持部件。
4GB空间分成8个块,每个块512MB,其中有很多保留区域,这是因为一般的芯片制造厂家是不可能把4GB空间用完的,同时,为了方便后续型号升级,会将一些空间预留。
存储器组织结构如图所示:
【详情见 <CM3/CM4存储器映射>】
MPU为监控总线传输的可编程设备,需要通过软件(一般是嵌入式OS)配置。若MPU存在,应用程序可以将存储器空间分为多个部分,并为每个部分定义访问权限。当违反访问规则时,错误异常就会产生,错误异常处理则会分析问题,而且如果可能,将错误加以修复。一般情况下,OS会设置MPU以保护OS内核和其他特权任务使用的数据,防止恶意用户程序的破坏。而且OS也可以选择将不同用户任务使用的存储器隔离开来。这些处理有助于检测系统错误,并且提高了系统在处理错误情况时的健壮性。MPU也可以将系统配置为只读,防止意外擦除SRAM中的数据或覆盖指令代码。MPU默认禁止,若应用不需要存储器保护特性,就无须将其初始化。
NVIC处理异常,可以处理多个中断请求IRQ和一个不可屏蔽中断NMI请求,IRQ一般由片上外设或外部中断输入通过I/O端口产生,NMI可用于看门狗定时器或掉电检测。处理器内部有SysTick定时器,它可以产生周期性的定时中断请求,可用于嵌入式OS计时或没有OS的应用中的简单定时控制。
注意:对CM3/4的操作其实就是对存储器映射中的寄存器的操作,通过对寄存器的操作来操作内存或其他外设等。
2.1 寄存器地址映射(特殊的存储器)
给存储器分配地址的过程叫存储器映射,寄存器是一类特殊的存储器,它的每个位都有特定的功能,可以实现对外设/功能的控制,给寄存器的地址命名的过程就叫寄存器映射。
举个简单的例子,大家家里面的纸张就好比通用存储器,用来记录数据是没问题的,但是不会有具体的动作,只能做记录,而你家里面的电灯开关,就好比寄存器了,假设你家有8个灯,就有8个开关(相当于一个8位寄存器),这些开关也可以记录状态,同时还能让电灯点亮/关闭,是会产生具体动作的。为了方便区分和使用,我们会给每个开关命名,比如厨房开关、大厅开关、卧室开关等,给开关命名的过程,就是寄存器映射。
我们以GPIO的ODR寄存器为例,其参考手册的描述如图所示:
①寄存器名字:每个寄存器都有一个对应的名字,以简单表达其作用,并方便记忆,这里GPIOx_ODR表示寄存器英文名,x可以从A~G,说明有7个这样的寄存器)。
②寄存器偏移量及复位值:地址偏移量表示相对该外设基地址的偏移,GPIOB 的外设基地址是:0x4002 0400。那么GPIOB_ODR寄存器的地址就是:0x4002 0414。复位值表示该寄存器在系统复位后的默认值,可以用于分析外设的默认状态。
③寄存器位表:描述寄存器每一个位的作用(共32bit),这里表示ODR寄存器的第15位(bit),位名字为 ODR15,rw表示该寄存器可读写(r,可读取;w,可写入)。
④位功能描述:描述寄存器每个位的功能,这里表示位015,对应ODR0ODR15,每个位控制一个IO口的输出状态。
由 < 3.2 库开发和寄存器的关系 > 学习可知:#define GPIOB_ODR *(unsigned int *)(0x40020414) GPIOB_ODR = 0XFFFF;stm32f407xx.h 里面使用结构体方式对 STM32F407 的寄存器做了详细映射。
注意:CM3/4的内部寄存器和外设寄存器的映射和操作封装文件位于标准外设库/HAL库中,详情见< 3.5 库开发和寄存器的关系>
2.2 寄存器地址计算
某个寄存器地址,由三个参数决定:
- 总线基地址(BUS_BASE_ADDR)
- 外设基于总线基地址的偏移量(PERIPH_OFFSET)
- 寄存器相对外设基地址的偏移量(REG_OFFSET)
寄存器地址 = BUS_BASE_ADDR + PERIPH_OFFSET + REG_OFFSET
总线基地址(BUS_BASE_ADDR)
外设基于总线基地址的偏移量(PERIPH_OFFSET)
寄存器相对外设基地址的偏移量(REG_OFFSET)
2.3 寄存器的封装
【详情见 < 3.6 C语言对寄存器的封装>】
3. CM3/4系统架构-----时钟系统
【详情见 <CM3/CM4时钟系统>】
相关文章:
STM32系统架构介绍
STM32系统架构 1. CM3/4系统架构2. CM3/4系统架构-----存储器组织结构2.1 寄存器地址映射(特殊的存储器)2.2 寄存器地址计算2.3 寄存器的封装 3. CM3/4系统架构-----时钟系统 STM32 和 ARM 以及 ARM7是什么关系? ARM 是一个做芯片标准的公司,…...
Android Studio:EditText常见4种监听方式
1. 文本变化监听(TextWatcher) TextWatcher 主要用于监听 EditText 里的文本变化,它有三个方法: beforeTextChanged(文本变化前)onTextChanged(文本正在变化时)afterTextChanged&a…...
window patch按块分割矩阵
文章目录 1. excel 示意2. pytorch代码3. window mhsa 1. excel 示意 将一个三维矩阵按照window的大小进行拆分成多块2x2窗口矩阵,具体如下图所示 2. pytorch代码 pytorch源码 import torch import torch.nn as nn import torch.nn.functional as Ftorch.set_p…...
机器学习(李宏毅)——BERT
一、前言 本文章作为学习2023年《李宏毅机器学习课程》的笔记,感谢台湾大学李宏毅教授的课程,respect!!! 读这篇文章必须先了解self-attention、Transformer,可参阅我其他文章。 二、大纲 BERT简介self-…...
数据科学之数据管理|统计学
使用python学习统计 目录 01 统计学基础 7 一、 统计学介绍 7 二、 数据和变量 8 02 描述统计 10 一、 描述统计概述 10 二、 分类变量的描述 11 三、 等距数值变量的描述 13 四、 等比数值变量的描述 16 五、 常用软件包介绍 16 六、 数值变量的描述统计 18 (一)…...
深度学习-111-大语言模型LLM之基于langchain的结构化输出功能实现文本分类
文章目录 1 langchain的结构化输出1.1 推荐的使用流程1.2 模式定义1.3 返回结构化输出1.3.1 工具调用(方式一)1.3.2 JSON模式(方式二)1.3.3 结构化输出法(方式三)2 文本分类2.1 定义分类模式2.2 配置分类提示模板2.3 初始化分类模型2.4 分类示例3 参考附录1 langchain的结构化输…...
常见的排序算法:插入排序、选择排序、冒泡排序、快速排序
1、插入排序 步骤: 1.从第一个元素开始,该元素可以认为已经被排序 2.取下一个元素tem,从已排序的元素序列从后往前扫描 3.如果该元素大于tem,则将该元素移到下一位 4.重复步骤3,直到找到已排序元素中小于等于tem的元素…...
C++17 中的 std::gcd:探索最大公约数的现代 C++ 实现
文章目录 一、std::gcd 的基本用法(一)包含头文件(二)函数签名(三)使用示例 二、std::gcd 的实现原理三、std::gcd 的优势(一)简洁易用(二)类型安全ÿ…...
力扣刷题(数组篇)
日期类 #pragma once#include <iostream> #include <assert.h> using namespace std;class Date { public:// 构造会频繁调用,所以直接放在类里面(类里面的成员函数默认为内联)Date(int year 1, int month 1, int day 1)//构…...
OpenWRT中常说的LuCI是什么——LuCI介绍(一)
我相信每个玩openwrt的小伙伴都或多或少看到过luci这个东西,但luci到底是什么东西,可能还不够清楚,今天就趁机来介绍下,openwrt中的luci,到底是个什么东西。 什么是LuCI? 首先,LuCI是OpenWRT中…...
机器学习核心算法解析
机器学习核心算法解析 机器学习是人工智能的核心技术之一,它通过从数据中学习模式并做出预测或决策。本文将深入解析机器学习的核心算法,包括监督学习、无监督学习和强化学习,并通过具体案例和代码示例帮助读者理解这些算法的实际应用。 1. …...
【目标检测json2txt】label从COCO格式json文件转YOLO格式txt文件
目录 🍀🍀1.COCO格式json文件 🌷🌷2.YOLO格式txt文件 💖💖3.xml2json代码(python) 🐸🐸4.输入输出展示 🙋🙋4.1输入json 🍂🍂4.2输出txt 整理不易,欢迎一键三连!!! 送你们一条美丽的--分割线-- 🍀🍀1.COCO格式json文件 COCO数…...
LVDS接口总结--(5)IDELAY3仿真
仿真参考资料如下: https://zhuanlan.zhihu.com/p/386057087 timescale 1 ns/1 ps module tb_idelay3_ctrl();parameter REF_CLK 2.5 ; // 400MHzparameter DIN_CLK 3.3 ; // 300MHzreg ref_clk ;reg …...
Flink内存配置和优化
在 Apache Flink 1.18 的 Standalone 集群中,内存设置是一个关键配置,它直接影响集群的性能和稳定性。 Flink 的内存配置主要包括 JobManager 和 TaskManager 的内存分配。 以下是如何在 Standalone 模式下配置内存的详细说明。 JobManager 内存配置 Jo…...
网络安全之笔记--Linus命令
Linux命令 文件和目录操作 ls 列出目录内容 常用选项 -a:显示所有文件和目录(包括隐藏文件,以.开头的文件)。 -l:以长格式显示文件和目录的详细信息。 -h:与-l配合使用,以更易读的方式显示文件大…...
deepseek和chatgpt对比
DeepSeek 和 ChatGPT 都是自然语言处理领域的工具,但它们的设计目标和功能有所不同。 功能定位: ChatGPT 是一个基于 OpenAI GPT-3 或 GPT-4 的聊天机器人,旨在进行人机对话、文本生成、问题解答等,广泛应用于教育、客服、创意写作…...
微服务与网关
什么是网关 背景 单体项目中,前端只用访问指定的一个端口8080,就可以得到任何想要的数据 微服务项目中,ip是不断变化的,端口是多个的 解决方案:网关 网关:就是网络的关口,负责请求的路由、转发、身份校验。 前段还是访问之前的端口8080即可 后端对于前端来说是透明的 网…...
Unity中实现动态图集算法
在 Unity 中,动态图集(Dynamic Atlas)是一种在运行时将多个纹理合并成一个大纹理图集的技术,这样可以减少渲染时的纹理切换次数,提高渲染效率。 实现原理: 动态图集的核心思想是在运行时动态地将多个小纹理…...
本地部署DeepSeek Nodejs版
目录 1.下载 Ollama 2.下载DeepSeek模型 3.下载 ollama.js 1.下载 Ollama https://ollama.com/ 下载之后点击安装,等待安装成功后,打开cmd窗口,输入以下指令: ollama -v 如果显示了版本号,则代表已经下载成功了。…...
字节跳动后端二面
📍1. 数据库的事务性质,InnoDB是如何实现的? 数据库事务具有ACID特性,即原子性、一致性、隔离性和持久性。InnoDB通过以下机制实现这些特性: 🚀 实现细节: 原子性:通过undo log实…...
TUSB422 MCU 软件用户指南
文章目录 TUSB422 MCU 软件用户指南 目录表格图表1. 介绍2. 配置2.1 通用配置2.2 USB-PD 3.0 支持2.3 VDM 支持 3. 代码 ROM/RAM 大小优化4. 通过 UART 调试4. 移植到其他微控制器 TUSB422 MCU 软件用户指南 摘要 本文档是 TUSB422 微控制器基于 Type-C 端口控制(…...
Django在终端创建项目(pycharm Windows)
1.选择目录 选择或新建一个文件夹,作为项目保存的地方 2.右键在终端打开 3.确定django-admin.exe安装位置 找到自己安装django时,django-admin.exe安装的位置,例如 4.运行命令 使用django-admin.exe的绝对路径,在刚才打开的终端…...
wordpress主题制作
工具/原料 <P><BR>使用divcss语言编写的html静态页面一个</P> <P>Macromedia Dreamweaver软件<BR></P> WordPress主题结构分析 1 1、index.php首页模板(最基本) ---- 1、header.php头部 ---- 2、sidebar.php侧边…...
echarts 3d中国地图飞行线
一、3D中国地图 1. 一定要使用 echarts 5.0及以上的版本; 2. echarts 5.0没有内置中国地图了。点击下载 china.json; 3. 一共使用了四层地图。 (1)第一层是中国地图各省细边框和展示南海诸岛; (2)第二层是…...
视频基础操作
1.1. 例子 读取mp4格式的视频,将每一帧改为灰度图,并且打上水印(“WaterMark”),并将其输出保存为out.mp4,在这个例子中可以看到视频读取,每帧数据处理,视频保存的整体流程简单示例 import cv…...
微信小程序 - 组件和样式
组件和样式介绍 在开 Web 网站的时候: 页面的结构由 HTML 进行编写,例如:经常会用到 div、p、 span、img、a 等标签 页面的样式由 CSS 进行编写,例如:经常会采用 .class 、#id 、element 等选择器 但在小程序中不能…...
在本地校验密码或弱口令 (windows)
# 0x00 背景 需求是验证服务器的弱口令,如果通过网络侧校验可能会造成账户锁定风险。在本地校验不会有锁定风险或频率限制。 # 0x01 实践 ## 1 使用 net use 命令 可以通过命令行使用 net use 命令来验证本地账户的密码。打开命令提示符(CMD࿰…...
【Elasticsearch】Elasticsearch检索方式全解析:从基础到实战(二)
接着上一篇文章;我们继续来研究es的复杂检索 文章目录 (1) bool用来做复合查询(2)Filter【结果过滤】(3)term(4)Aggregation(执行聚合) (1) bool用来做复合查询 复合语…...
游戏引擎学习第96天
讨论了优化和速度问题,以便简化调试过程 节目以一个有趣的类比开始,提到就像某些高端餐厅那样,菜单上充满了听起来陌生或不太清楚的描述,需要依靠服务员进一步解释。虽然这听起来有些奇怪,但实际上,它反映…...
(Xshell 8 + Xftp 8)下载安装miniconda至服务器指定目录+配置虚拟环境
一一一一 Xshell 8 Xftp 8均已登录,miniconda.sh安装包已经放在服务器指定目录中 二二二二 赋予脚本执行权限 chmod x Miniconda3-latest-Linux-x86_64.sh安装miniconda ./Miniconda3-latest-Linux-x86_64.sh -p /data1/huyan/zhangyifeng/miniconda3一直Enter…...








