【STM32】为什么STM32的Flash地址要设置到0x08000000

STM32内存笔记 而且,如果你在函数里面进行这个操作的话,指针地址位于stack,但分配的内存属于heap,函数结束后,不会影响heap里面已经被分配的空间。所以,在初始化对象类型时,以及结构体时,如果直接申明结构体变量的话,它是属于stack的,会被销毁。其中stack作为系统的栈,所有函数里面定义的局部变量都是占用stack的空间的,递归调用函数要注意栈溢出问题。ROM又被称为“只读存储器”,ROM所存数据,一般是装入整机前事先写好的,整机工作过程中只能读出,而不像随机存储器那样能快速地、方便地加以改写。 阅读详情
AI摘要

STM32的Flash地址设为0x08000000是为了解决内核从0x00000000读取中断向量表的问题,通过内存重映射功能,将0x08000000的内容映射到0x00000000。在MDK中,通过分散加载配置确保中断向量表存于0x08000000。此外,STM32支持从不同位置启动,如内部Flash、系统存储器或SRAM,所以不能直接使用0x00000000。M7内核更灵活,可以从多个地址启动。

参考【不是问题的问题】: 为什么STM32的Flash地址要设置到0x08000000

这边涉及到分散加载文件,启动文件等等,先挖坑,搞定IAP升级以后再填。

为什么STM32的Flash地址要设置到0x08000000

主flash启动时,是从0x0800 0000启动,但是M3,M4内核芯片上电复位后,要固定从0x0000 0000地址读取中断向量表,获取复位中断服务程序的入口地址后,进入复位中断服务程序,其中0x0000 0000是栈顶地址,0x0000 0004存的是复位中断服务程序地址。
在这里插入图片描述
在这里插入图片描述
既然ARM规定了M3,M4内核要从地址0x0000 0000读取中断向量表,而STM32设置Flash地址到0x0800 0000怎么办?

STM32支持了个内存重映射功能,将地址0x0800 0000开始的内容重映射到首地址0x0000 0000中,这样就解决了从0x0000 0000读取中断向量表的问题。

怎么保证0x08000 0000首地址存的就是中断向量表,我们不可以随意设置吗?

保证中断向量表存到0x0800 0000,这个涉及到分散加载的一个小知识,以MDK为例,如果大家看xxx.S启动文件,里面通过AREA定义了一个名叫RESET的段,这段存的就是中断向量表。

; Vector Table Mapped to Address 0 at Reset
                AREA    RESET, DATA, READONLY
                EXPORT  __Vectors
                EXPORT  __Vectors_End
                EXPORT  __Vectors_Size

这个名字很重要,MDK对应的xxx.sct分散加载里面通过下面这句将这个RESET段放在了0x0800 0000优先存储。

; *************************************************************
; *** Scatter-Loading Description File generated by uVision ***
; *************************************************************

LR_IROM1 0x08000000 0x00200000  {    ; load region size_region
  ER_IROM1 0x08000000 0x00200000  {  ; load address = execution address
   *.o (RESET, +First)
   *(InRoot$Sections)
   .ANY (+RO)
   .ANY (+XO)
  }
  RW_IRAM2 0x24000000 0x00080000  {  ; RW data
   .ANY (+RW +ZI)
  }
}

这样我们就解决了0x0800 0000首地址存储中断向量表,一旦程序开始运行后,我们就可以随意设置中断向量表的位置了。比如想将中断向量表存到内部SRAM,我们就可以操作寄存器SCB->VTOR 重新安排,然后将0x0800 0000的内容复制到设置的地址内即可。

为什么不直接使用0x0000 0000?

这是因为STM32不仅可以从内部Flash启动,还可以从系统存储器(可以实现串口ISP,USB DFU等程序下载方式,这个程序是ST固化好的程序代码)和从内部SRAM启动,
我们将内部Flash安排到0x0000 0000显然是不行的。这样会导致系统存储器或者内部SRAM无法重映射到0x0000 0000了。
在这里插入图片描述

M3和M4,M7是怎么个执行情况呢

M7内核芯片比较灵活了,改变了固定从0x0000 0000地址读取中断向量表的问题,以STM32H7为例,可以从 0x0000 0000 到 0x3FFF 0000 所有地址进行启动。

STM32的启动地址是0x08000000还是0x00000000? 对于CPU来说它是永远从0x00000000地址去加载执行程序的,然后单片机会通过Boot管脚的配置去将Main FLASH(0x0800 0000)重映射或者芯片出厂自带的Bootloader(0x1FFF 0000)重映射,故而代码是下载到 0x80000000 往后的存储空间中,却说运行又是从 0x00000000地址运行的。从0x2000 0000到0x2000 xxxx即为程序所运行的范围,该段内存分布为:RW段、ZI段:其中RW段为可读写的非0数据段,ZI段包括了0数据段、堆区、栈区。 阅读详情

相关推荐

keil中设置的flash(irom)的起始地址为0x08000000,这个0x08000000的意义------stm32地址映射图解析

STM32的存储映射是靠基地址和地址偏移实现的。 32位的M3有4GB的寻址空间,其中用于片上外设的有512MB,基地址为0x40000000 M3各外设基地址,包括片上外设、片上静态RAM和FLASH。特别要注意的是所有外设都是挂载在总线上,有AHP、APB1、APB2总线。从各外设基地址定义就可以很清楚知道该外设是挂在哪个总线上。 左边是实际的外设物理地址(flash也属于外设),右边是虚拟的地址,对应32位的M3的4GB的寻址空间 上图是STM32的存储器地址映射图,地址范围为:0x0000_000

dianqicyuyan的博客 7239

STM32的Flash地址是0x08000000,从0x00000000不可以?

ARM芯片的地址重映射 映射就是一一对应的意思。重映射就是重新分配这种一一对应的关系普通的单片机把可执行代码和数据存放到存储器中。单片机中的CPU从储器中取指令代码和数据。其中存储器中每个物理存储单元与其地址是一一对应而且是不可变的。如下图,CPU读取0x00000000地址上存储单元的过程ARM芯片中有些物理存储单元的地址可以根据设置变换。就是说一个物理存储单元现在对应一个地址,经过设置以后,这个存储单元就对应了另外一个地址了(重映射就是重新分配这种一一对应的关系)如下图。

木牛的博客 1994

stm32F1 SCB->VTOR开机默认是0,如何理解?

1.使用stm32cubemx生成新的f1工程,SystemInit函数中默认没有设置SCB->VTOR,则SCB->VTOR默认为0,程序正常运行。 2.在设计IAP的时候,为社么在app程序中需要设置SCB->VTOR,而bootloader中不需要? 3.程序的SCB->VTOR = 0x0800 0000 | offset; 4.那么对于bootloader来说,只是offset = 0而已,为什么连0x0800 0000都可以不设了呢? 5.想请教各位大佬,这个应该怎么理解

liming0931的专栏 6965

记spi nor flash的调试心得

flash 调试心得前言调试目的调试步骤检查驱动flash操作改写复位访问模式tips 前言 在工作中或者在开发板上或多或少都会遇到norflash,现如今spi接口的也是运用的非常广泛。今天我们就来聊一聊在嵌入式设备上调试flash的一些心得。 调试目的 一般flash在嵌入式平台上运用,是用于uboot、内核文件系统以及数据分区的存储。所以在调试flash只需要达到可读可写可擦除,那么一般就说调试OK了,我们一般在uboot下调试flash,因为一般平台上可以通过其他方式比如网络,串口等方式直接下载ub

weixin_41884251的博客 5006

STM32/ESP32烧录地址解析:从0x08000000到0x6000

在嵌入式开发中,烧录地址并非固定魔法数字,而是由芯片存储映射、链接脚本约定和镜像分区布局共同决定。bin文件不带地址信息,烧录器需要指定起始偏移;CPU启动则依赖中断向量表、别名映射和Bootloader跳转。理解Memory Map、VMA/LMA与分区表后,能避免“烧录成功却不启动”、地址覆盖、OTA升级失败等问题。STM32常见主Flash从0x08000000开始,ESP32则按二级bootloader、分区表、应用镜像分配0x1000、0x8000、0x10000等偏移;带Bootloader的系

weixin_42531588的博客 290

J-Flash烧录STM32时,如何正确处理Hex文件的起始地址与扇区?避坑指南来了

本文深入解析了J-Flash烧录STM32时Hex文件起始地址与扇区配置的关键问题,提供了详细的避坑指南和实战案例。通过正确配置起始地址、扇区选择和擦除方法,开发者可以避免烧录失败和程序运行异常,确保Hex文件与Flash扇区的完美匹配。

weixin_30614109的博客 340

为什么STM32设置Flash地址0x08000000而不是0x00000000?STM32的启动过程

引用文章,如有侵权请联系作者删除如果0x00000000-0x001 F FFFF之前是映射在系统存储器或者嵌入式SRAM上的,现在改变BOOT0、BOOT1的电平为0、X。0x00000000-0x001 FFFFF就被重新映射在了主FLASH上,这就是单片机的地址重映射。重映射就是本来是和张三进行映射的的,现在改为了和李四映射。

weixin_44057803的博客 1万+

STM32 IAP实战:Keil MDK下Bootloader与APP内存规划及Ymodem协议详解

在嵌入式系统开发中,固件升级是产品维护和功能迭代的关键环节。IAP(在应用编程)技术允许微控制器在运行过程中通过通信接口(如串口、USB、以太网等)对自身Flash存储器进行重新编程,从而实现固件的远程或现场更新。其核心原理在于对芯片内存空间进行合理划分,将程序分为Bootloader和APP两部分,并通过中断向量表重映射等机制确保两者协同工作。这项技术的价值在于极大地提升了产品的可维护性和灵活性,降低了后期升级的硬件成本和人力投入。在物联网设备、工业控制器、消费电子等需要后期功能更新或缺陷修复的应用场景中

weixin_34401479的博客 348

【不是问题的问题】为什么STM32的Flash地址要设置到0x08000000

本文原贴地址:http://www.armbbs.cn/forum.php?mod=viewthread&tid=109321 目录 一、背景知识: 二、引出问题: (1) 你怎么保证0x08000 0000首地址存的就是中断向量表,我们不可以随意设置吗? (2) 既然设置到0x0800 0000这么麻烦,为什么不直接使用0x0000 0000? 三、了解了M3和M4,M7是怎么个执行情况呢? 我们言简意赅的普及下这个知识点,争取让大家不伤脑细胞 一、背景知识: M3,M4内.

Simon223的博客 3855

解密STM32内存布局与启动机制:从硬件到软件的完整链路

本文深入解析STM32内存布局与启动机制,从硬件地址映射到软件启动流程,详细介绍了FLASH、SRAM和外设寄存器的内存分配。通过分析BOOT模式选择、时钟树初始化和启动文件汇编代码,揭示STM32从复位到main函数的完整链路,并提供实战中的内存管理技巧与高级话题探讨。

weixin_29186249的博客 248

ARM学习(16)CortexM4外设地址了解以及SPI异常问题分析

CortexM4外设地址,SPI通信原理简介,SPI异常问题分析

张一西的博客 1170

带外部FLASH的stm32启动流程

1.Bootloader程序地址 2.APP程序地址 3.程序空间

qq_51679661的博客 2137

STM32 Flash下载配置全解析:从地址映射到Keil实战

嵌入式开发中,Flash编程是连接编译产物与物理执行的关键环节。其本质是将可执行镜像按芯片存储架构(如哈佛变体)精确烧录至非易失性存储器,并确保复位后能正确加载中断向量与启动代码。理解Flash的块擦除特性、地址映射规则(如0x08000000起始)及SRAM运行时空间(0x20000000),是规避HardFault、启动失败等典型问题的技术前提。该过程深度依赖调试协议(SWD)、编程算法匹配与链接配置一致性,广泛应用于STM32固件烧录、量产部署与硬件级调试。本文聚焦STM32F1系列在Keil MDK

weixin_29859471的博客 58

STM32从Flash地址0x08000000的启动重映射

origin: http://www.it610.com/article/5070966.htm 摘要: 在初写STM32程序时,遇到一个困惑,STM32的Flash在MDK里被设置为起始地址0x08000000,而CM3手册规定芯片复位时要从0x00000000地址开始取出中断向量,那STM32怎么样执行代码呢?地址重映射?或者在0x00000000里有对应有实际存储器?仔细阅读手册,发现这件

yazhouren的专栏 7986

Jitsi中的Prosody(谐音:破扫敌)介绍

凭借其灵活的插件系统、强大的安全性和出色的性能,Prosody 成为许多企业和开发者构建定制化通信解决方案的首选。在 Jitsi 的多方视频会议场景中,Prosody 不仅处理基本的信令任务,还需要与其他组件(如 Jitsi Videobridge)协作,确保视频流的正确分发和控制。Prosody 提供了丰富的插件系统,允许开发者通过模块扩展其功能。Prosody 就是一个实现 XMPP 协议的服务器,它支持 XMPP 协议的标准功能,如消息传递、群组聊天、传送状态信息等,并提供了高效、可扩展的服务。

江左散人的专栏 1165

LSF实践专题(15):LSF队列优先级以及抢占功能初探

在LSF暂停作业时,会向作业发送一个SIGTSTP信号,并且将作业状态变成SSUSP(system suspend),表示被系统暂停,这时,最好是作业的应用能够捕获和处理SIGTSTP信号,否则,即使在LSF中,作业会被认为暂停了,并且释放了slots资源,但是在实际OS中,作业进程仍然在继续,并且不会释放CPU等计算资源。是指LSF自动将低优先级作业暂停(suspend),将空余出来的资源交给高优先级队列中的作业使用,等到高优先级队列的作业结束后,再将被暂停的作业恢复(resume)并继续运行。

richycn的博客 1919

别再乱填了!手把手教你配置Keil的IROM1和IRAM1,让STM32程序跑得更稳

本文详细解析了Keil中IROM1和IRAM1的配置方法,帮助开发者正确设置STM32的内存映射,避免程序崩溃和数据丢失问题。通过实战案例和高级技巧,如CCM RAM的应用,提升嵌入式系统的稳定性和性能。

weixin_29194255的博客 451

ADXL355 STM32 HAL 库 SPI 驱动实战:从零构建高精度加速度数据采集系统

本文详细介绍了如何使用STM32 HAL库通过SPI接口驱动ADXL355高精度加速度计,构建稳定可靠的数据采集系统。从硬件连接到寄存器配置,再到数据采集与处理,提供了完整的实战代码和优化技巧,特别适合工业级振动监测等应用场景。

weixin_28738397的博客 324

STM32实战:使用ST-LINK Utility烧写bin文件全流程与避坑指南

在嵌入式开发中,固件烧录是程序从源码到硬件运行的必经环节,尤其针对STM32这类主流MCU,掌握高效的烧录方法能显著提升开发调试与量产效率。bin文件作为不含地址信息的裸程序镜像,与hex文件不同,烧录时必须手动指定正确的Flash起始地址(如0x08000000),否则极易出现“烧录成功但程序不运行”的故障。内容从烧录的底层逻辑讲起,详细说明ST-LINK Utility的驱动安装、SWD接线、Keil中自动生成bin文件等准备工作,并完整演示了连接、擦除、设置地址、校验烧录的操作流程。同时针对连接不上、

weixin_34159110的博客 496

S32DS使用手把手教程:从零实现CAN通信配置

深入讲解S32DS使用过程中如何从零开始配置CAN通信,涵盖关键步骤与实用技巧,帮助开发者快速上手S32DS使用中的常见问题与调试方法。

weixin_42405592的博客 1126

Ubuntu终端AI编程助手配置:Claude Code接入DeepSeek模型全攻略

在软件开发领域,AI编程助手正成为提升开发效率的重要工具。其核心原理是通过大语言模型理解自然语言指令,生成、解释或调试代码。这类工具的技术价值在于将AI能力无缝集成到开发工作流中,减少上下文切换,实现更流畅的人机协作。常见的应用场景包括代码生成、错误调试、代码重构和技术问答等。本文聚焦于在Ubuntu系统中,将流行的终端AI助手Claude Code的后端模型从原版Claude替换为DeepSeek。通过配置环境变量实现API端点和模型的映射,这一过程涉及Node.js环境管理、npm包安装和关键环境变量设

weixin_42527654的博客 377
上一篇: 【原理图】电路中的VCC VDD VSS VEE GND含义 以及STM32电源
下一篇: 【STM32】在手册中查看IO的功能说明
熟练的魔法师
博客等级 码龄8年 2714粉丝 77原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值