STM32总线和时钟树(速记版)

news2024/11/24 6:30:52

一、存储器结构

1.1 STM32内存结构

型号说明

        以STM32F103RBT6这个型号的芯片为例,该型号的组成为7个部分,其命名规则如下:

        ST 是公司名,意法半导体。M 代表Cortex-M内核。32 代表32位微控制器。

        F103 是芯片系列。

        R 代表引脚数。B 代表内嵌FLASH容量128K字节的内嵌FLASH。

        T 代表封装方式。6 代表工作温度范围。

内存空间

        以STM32F103RBT6为例,内部存储空间包括128KB的FLASH20KB的SRAM

        由于FLASH每次写入前都要擦除,适合存放代码和只读数据。SRAM读写快速,但是断电丢失,适合存放临时数据。

KEIL的target设置界面-F103RB
KEIL的target设置界面-F429IGT6

        通过 Keil 的 target 设置界面,可以看到内部FLASH和内部RAM的起始映射地址和大小设置,这里一般选择了芯片型号会有默认值。

        关于下载地址,在IAP使用BootLoader程序,跳转到APP程序的方式下,比如用户自设BootLoader的代码大小为0x4000,那么就应该把BootLoader放在内部Flash起始地址0x0800 0000的位置,大小设置为0x4000(可以给大);对应的把APP程序放在起始地址0x0800 4000的位置,大小设置为对应程序大小。

        FLASH用来存储编译好的程序文件,SRAM用来存储程序运行所需的临时数据。

        0x0000 0000 ~ 0x0007 FFFF,也就是代码区的这512KB的字节启动内存空间,是预留的。

STM32有三种启动方式,

        FLASH启动,代码存放在0x0800 0000

        系统存储器启动,代码存放在0x1FFF F000

        SRAM启动,代码存放在0x2000 0000

        可以通过BOOT引脚设置。

        Boot引脚决定了字节启动内存空间被映射到哪一块区域。

        不管是FLASH启动、系统存储区启动还是RAM启动,代码第一步都是去0x0000 0000去找MSP指针,去0x0000 0004去找PC指针。

        根据映射关系,实际找的位置可以是FLASH的0x0800 0000,系统存储区的0x1FFF F000,SRAM的0x2000 0000。 

        另外,系统自带的BootLoader程序,是放在0x1FFF F000的,固定大小,禁止修改。

内存映射

        STM32的内存和外设的地址,不管内部还是外部,都被映射在一个4GB的虚拟地址空间内。

        可访问的存储器空间被分为 8个主要块,每个块为512MB。

        分别作为 代码区SRAM区片上外设1G的外部存储器扩展、1G的片外外设、不同厂商的专用外设总线(包括NVIC、调试组件等)

        其中1G的外部存储器扩展,拿来给FSMC1、FMSC2使用。1G的片外外设,高位拿了512M给FSMC使用。

CCM RAM

        CCM RAM,核心耦合内存,是给F4系列专用的全速 64KB RAM,官方文档指出芯片的SRAM大小为128K+64K,后面的64K就是指CCM RAM。

        CCM RAM 大小为 0x1000_0000 ~ 0x1000_FFFF,不经过总线矩阵,直接与内核相连,仅供内核访问。其地址位于代码区,与常规SRAM区不连续,DMA与外设也无法直接使用它们。可以用编译器指令去写链接脚本文件(.icf),把数据定义在CCM RAM中,extern出来使用。

以F429系列为例,典型的存储器映射布局

        代码区的 0x0800 0000 ~0x080F FFFF (1MB),存储程序代码

        SRAM区的 0x20000 0000~0x2003 FFFF (256KB),作为堆栈

        片上外设的 0x4000 0000~0x4000 FFFF,用于APB1上的外设;

                           0x4001 0000~0x400F FFFF,用于APB2上的外设。

关于 FSMC 和 FMC

        FMC是STM32F429/439专有的,因为驱动SDRAM时需要定时刷新,而FSMC存在于F1和F4中我们常用的芯片中。FMC 支持 8/16/32位数据宽度,LCD一般是16位宽度的,

        FMC 将外部存储器划分为 6 个固定大小为 256M 字节的存储块,也就是总共管理 1.5GB 空间。每个块又被分为 4 个存储区,一个区 64 M。

        FSMC 只支持 BANK1~4。

        0x6000 0000~0x6FFF FFFF       BANK1     SRAM使用

        0x7000 0000~0x7FFF FFFF       BANK2    

        0x8000 0000~0x8FFF FFFF       BANK3     FLASH使用

        0x9000 0000~0x9FFF FFFF       BANK4     PC卡使用

        0xC000 0000~0xCFFF FFFF      BANK5 

        0xD000 0000~0xDFFF FFFF      BANK6        SDRAM使用 

1.2 STM32启动过程

概括

        .s启动文件,汇编程序,系统上电复位后首先执行。

1、初始化主堆栈指针MSP,指向栈顶

2、初始化 PC 指针,指向下一条要执行的指令地址

3、初始化中断向量表(复位中断服务函数中初始化中断向量表)

4、调用SystemInit函数初始化系统时钟

5、调用 C 库函数 _main 初始化用户堆栈,调用main函数

ResetHandler是弱定义,用户可以自己实现。 

如果KEIL勾选了使用微库,则.s文件的__MICROLIB宏被定义,由_main初始化堆栈。如果没有定义 __MICROLIB,则才用双段存储器模式,且声明标号 __user_initial_stackheap 具有全局属性,让用户自己来初始化堆栈。

STM32片上SRAM结构

C语言内存管理分为:代码段数据段BSS段、mmap映射

_main初始化用户堆栈,片上SRAM区作为 数据段、BSS段、堆、栈、mmap映射 的区域。

mmap是linux系统编程涉及的映射文件

系统ISP启动流程

正常情况下,程序从Flash启动时的流程如下:

1. 程序从Flash启动,根据中断向量表找到复位中断处理函数的地址。(0x0800 0004处是中断向量表的起始地址,也是中断向量表的起始,记录了复位中断处理函数的地址)。配置系统时钟。执行_main,完成堆栈的初始化。

2. 执行复位中断处理函数,初始化系统环境后跳转到main函数

3. 在main函数的死循环中运行,直到有中断发生

4. 中断发生时,跳转到中断向量表起始处,根据中断信号源跳找到相应的中断处理函数

5. 中断处理函数执行完后返回到main函数继续运行。

系统IAP启动流程

在Flash中存储了两套程序:

        Bootloader程序:自举程序。负责接收数据(APP应用程序代码)并将其存储到Flash中。

        APP应用程序:我们真正的应用程序。

程序从Flash启动,根据中断向量表找到复位中断处理函数的地址。

        执行复位中断处理函数后,跳转到Bootloader的main函数。该函数检查并保存新的APP程序到Flash,然后跳转到第二套程序运行。

        一旦进入新的APP程序,根据中断向量表找到复位中断处理函数,进入App程序的main函数运行。

        为确保中断能正确跳转到APP程序的中断处理函数,需要在APP程序中修改中断向量表的偏移,确保中断发生时能正确执行APP程序的中断处理函数

        SCB->VTOR寄存器存放中断向量表的偏移量

二、 系统架构

STM32主系统由AHB总线矩阵构成。 

AHB总线矩阵,可以实现主控总线被控总线的访问

2.1 主控和被控总线 

八条主控总线包括:

Cotex内核的 I、D、S 总线。也就是指令、数据、系统总线。

DMA-存储器总线。                        DMA-存储器总线有2条。

DMA-外设总线。

以太网-DMA总线。

USB-DMA总线。

七条被控总线包括: 

内部FLASH ICode总线

内部FLASH DCode总线

主要内部 SRAM1 (112KB)

辅助内部 SRAM2 (16KB)

辅助内部 SRAM3 (64KB)          (仅适用于F42x和F43x)

AHB总线

FSMC总线

        主控总线通过总线矩阵来连接被控总线, 总线矩阵用于主控总线之间的访问仲裁管理,仲裁采用循环调度算法。 其实就是外设请求先来后到。

通过指令总线获取程序指令。访问对象是内部FLASH/SRAM

通过数据总线获取常量调试访问。访问对象是内部FLASH

通过系统总线获取内部SRAM片上外设,访问对象是内部SRAMAHB/APB的外设数据。 

通过DMA-存储器总线(1、2)访问内部SRAM和FSMC。 

通过DMA-外设总线访问AHB/APB外设内部SRAM和FSMC

通过以太网-DMA总线访问内部SRAM和FSMC

通过USB-DMA总线访问内部SRAM和FSMC

        SRAM可放程序缓存,因此 I 总线可访问内部FLASH和SRAM。

         I、D、S总线都能依靠依靠FSMC访问外部存储器。I、D、S总线各自都有自己的地址线、数据线、控制线。

        立即数不放在存储器或内存中,一般是常数。

        FLASH放程序和指令。SRAM只可能放指令的缓存。

        外部存储器可能放代码也可能放指令,因此 I、D、S总线均可依靠FSMC访问外部存储器。 

 2.2 AHB/APB 总线桥和时钟源

外设分为高速外设和低速外设。

1、高速外设
        由于高速外设实在是太多了,一个总线不够,所以分了三个,分别是 AHB1/AHB2/AHB3,所有“高速外设”寄存器组分批挂接在 AHB1/AHB2/AHB3 上。

2、低速外设
        “低速外设”的速度比较低,不能直接挂在“总线矩阵”上,所以先经过“桥”后再引出“低速总线”,挂在低速总线上。由于“低速外设”比较多,所以就分了两个低速总线,分别是 APB1/APB2,所有的“低速外设”分批挂接在 APB1/APB2 上。

AHB-APB总线桥

        将系统时钟分频后,传递到APB1、APB2两条总线,再传递到挂载的外设上。

APB1总线APB2总线

        负责外设时钟使能,并为外设提供时钟信号

MCU 的系统时钟可以选择 HSILSIHSELSE 四种时钟源,

一般设置为16M、32K、8M、32.768K,单位(HZ)

系统时钟F1一般是72MHZ,

F429的SYSCLK根据板子功率有

        SYSCLK 180MHZ,AHB是1分频,180MHZ,APB2是90MHZ,APB1是45MHZ 

        SYSCLK 168MHZ,AHB是1分频,168MHZ,APB2是84MHZ,APB1是42MHZ 

HSE和HSI经过 /M 分频之后传递到锁相环,

锁相环会使晶振走过*N倍频器,

之后如果再走过/P分频则可以直接作为系统时钟SYSCLC,

如果走过/Q分频则可以作为其他外设的时钟。

系统时钟之后会去到AHB总线的时钟

AHB时钟经过总线桥会去到APB1和APB2(这俩实际上是由AHB1桥接过来的)

 

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

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

相关文章

算法基础知识——11种距离度量

简介:个人学习分享,如有错误,欢迎批评指正。 前言:距离的作用 数据聚类:距离度量在聚类算法(如K-means、层次聚类)中用于衡量数据点之间的相似性或差异性,帮助确定聚类的中心和边界…

10款开源管理工具大比拼:哪个最适合您的团队?

国内外主流的 10 款开源项目管理系统对比:PingCode、Worktile、Gitee、开源中国 (OSChina)、禅道 (ZenTao)、OpenProject、Redmine、Leantime、MeisterTask、Freedcamp。 在选择合适的开源项目管理工具时,你是否感到困惑和不安?市场上众多的选…

Python | Leetcode Python题解之第338题比特位计数

题目: 题解: class Solution:def countBits(self, n: int) -> List[int]:bits [0]for i in range(1, n 1):bits.append(bits[i & (i - 1)] 1)return bits

SSTI模版注入(初步)

SSTI模版注入(初步) ssti可能造成任意文件读取和RCE远程控制后台系统 漏洞成因:渲染模版时,没有严格控制对用户的输入; 使用了危险的模版,导致用户可以混合flask程序进行交互。 flask是基于python开发的…

【C++高阶】哈希—— 位图 | 布隆过滤器 | 哈希切分

✨ 人生如梦,朝露夕花,宛若泡影 🌏 📃个人主页:island1314 🔥个人专栏:C学习 ⛺️ 欢迎关注:👍点赞 👂&am…

Ubuntu系统安装CH340驱动

今天在使用USB转UART模块连接设备时发现我的Ubuntu虚拟机无法识别USB设备,这个模块使用的CH340芯片,在Windows主机中可以识别到串口并连接,所以初步判断为虚拟机中缺少ch340驱动。实际上自Linux内核版本2.6.24起,Linux主线内核已内…

云原生-Docker安全-容器逃逸系统内核漏洞(解决docker.com无法访问)

云原生-Docker安全-容器逃逸&系统内核漏洞 细节部分在权限提升章节会详解,常用: CVE-2016-5195 CVE-2019-16884 CVE-2021-3493 CVE-2021-22555 CVE-2022-0492 CVE-2022-0847 CVE-2022-23222 云原生-Docker安全-容器逃逸&docker版本漏洞 CVE…

基于Java的医院急诊系统

TOC springboot327基于Java的医院急诊系统 第1章 绪论 1.1选题动因 当前的网络技术,软件技术等都具备成熟的理论基础,市场上也出现各种技术开发的软件,这些软件都被用于各个领域,包括生活和工作的领域。随着电脑和笔记本的广泛…

【中等】 猿人学web第一届 第7题 动态字体,随风漂移

文章目录 获取字体文件映射关系获取页面英雄排序python 代码 这道题是 动态字体文件加密,找出动态字体文件中对应数字相同规律即可 数据接口 https://match.yuanrenxue.cn/api/match/7 数据接口没有加密值 cookie字段也没有 获取字体文件映射关系 多次观察 字体文件…

2.2 Oracle与SQL Server简介

欢迎来到我的博客,很高兴能够在这里和您见面!欢迎订阅相关专栏: 工💗重💗hao💗:野老杂谈 ⭐️ 全网最全IT互联网公司面试宝典:收集整理全网各大IT互联网公司技术、项目、HR面试真题.…

仿Muduo库实现高并发服务器——事件监控Poller模块

Poller模块在整个项目的使用 下面代码是对I/O复用接口函数的基本使用。 回顾上篇文章:事件监控管理模块 这个模块是将触发事件的描述符,给到外面,让外面去做对应的处理。 #define MAX_EPOLLEVENTS 1024 class Poller {private:int _epfd;s…

三级_网络技术_18_路由器的配置及使用

1.在Cisco路由器上用于永久保存路由器的开机诊断程序、引导程序和操作系统软件的存储器是()。 Flash NVRAM RAM ROM 2.在Cisco路由器中主要用来永久保存路由器的开机诊断程序、引导程序和操作系统,以完成路由器初始化进程的存储器是()。 RAM Disk Flash RO…

Linux平台使用OPUS对Audio PCM数据进行编解码

1)Audio编解码入门级小知识,分享给将要学习或者正在学习Audio编解码开发的同学。 2)内容属于原创,若转载,请说明出处。 3)提供相关问题有偿答疑和支持。 Opus编码是一个开源的音频编码格式,具…

ArduPilot二次开发零基础教程

文章目录 前言一、概述二、开发环境搭建三、多旋翼MAVROS自主控制接口四、无人船(车)MAVROS自主控制接口五、二次开发基础六、控制LED灯七、自定义串口驱动八、Guided控制接口九、输出自定义PWM信号十、添加自定义MAVLINK消息和QGC通信十一、自定义日志十…

[MRCTF2020]套娃1

打开题目,查看源代码,有提示 有两层过滤 1.过滤"_"与"%5f" 。 这里要求的参数必须是"b_u_p_t"但是不能检测出"_"。这里看着很作弄人。其实这里要用到php里非法参数名的问题。可以参考一下博客 ?b.u.p.t2333…

探索Pandas的魔力:Python数据分析的终极武器

文章目录 探索Pandas的魔力:Python数据分析的终极武器背景:为何选择Pandas?引言:Pandas是什么?安装Pandas:一键安装的便捷基础函数:Pandas的五大法宝应用场景:Pandas的实战演练常见问…

浏览器调试工具-Chrome Dev Tools

浏览器调试模式下的各个调试工具是常用的工具集,能够帮助开发者理解、调试和优化网页。 1.打开方式 直接在浏览器中按下F12键右键点击页面上的任一元素,选择“检查”(Inspect)在浏览器右上角点击菜单按钮,选择“更多…

Redis:缓存击穿,缓存穿透,缓存雪崩

缓存穿透 缓存和数据库中都没有的数据,可用户还是源源不断的发起请求,导致每次请求都会到数据库,从而压垮数据库。 这将导致这个不存在的数据每次请求都要到存储层去查询,失去了缓存的意义。 *** 解决方案** 对空值进行缓存标…

音乐生成模型应用

重磅推荐专栏: 《大模型AIGC》 《课程大纲》 《知识星球》 本专栏致力于探索和讨论当今最前沿的技术趋势和应用领域,包括但不限于ChatGPT和Stable Diffusion等。我们将深入研究大型模型的开发和应用,以及与之相关的人工智能生成内容(AIGC)技术。通过深入的技术解析和实践经…

根据年月计算当月有哪几个周,及每周的起止日期

示例 传参数年、月,返回包含当月的所有周数、及周的起止日期,支持跨月 特殊情况请自行修改函数 console.log(getWeeksInMonth(2024, 9));返回如下 源码 源码以elementUI的周选择框的起止日期作为参考 function getWeeksInMonth(year, month) {// 计…