你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

关于F407嵌入式SRAM映射为0x20020000的问题。

[复制链接]
luo__ 提问时间:2025-1-9 10:50 / 未解决

本人在做F407的IAP功能时,首先调用了以前在F103上面的跳转代码,并根据网上资料写出了在F407芯片下运行的IAP跳转代码。然后就出现问题了,发送跳转函数不执行,调试后发现下面的if语句无法进入。

图片.png

我很奇怪,因为不管是以前的IAP跳转程序还是网上的跳转程序,在这条语句上都是一致的,按理来说最不应该出问题的就是这句语句。然后通过调试发现,对地址取值按位或得到的数值为0x20020000,与0x20000000不匹配,所以进不去。然后我通过Prg查看寄存器值,如下所示:

图片.png

发现0x08008000地址的值确实为0x20020000。所以我将if语句中的判断换成了0x20020000,代码就正常运行,可以实现跳转了。关于这个问题,后来我查询了数据手册,确实有一定的记载,如下所示:

图片.png

但是我用的芯片为STM32F407VET6,并不是F42和F43系列的,按照手册上的表示,应该是0x20000000,而不是0x20020000,因此产生了矛盾。

在网上查询了许久,也没有找到答案,望各位大神指点指点小弟。

图片.png
收藏 评论8 发布时间:2025-1-9 10:50

举报

8个回答
xmshao 回答时间:昨天 17:54
看来,主要是好奇问题原因。


其实,这个MSP检查是可有可无的,你也没必要为了凑这个检查能通过而勉强改变写法。


这个MSP合法性检查跟使用的RAM起始地址及大小直接相关。它的作用就是检查栈顶落在


预期可用RAM空间。


从你提供的截图信息来看,那个MSP的值显然超出了128K空间,即超出了STM32F407的RAM可以空间。


建议你确认下你的APP工程默认使用的RAM空间起止范围,堆栈到底使用的哪个RAM区域。或说确认下,APP工程


是否是基于STM32F407创建的,而不是别的。


现在这个值有点巧,你可以增加一批有效全局变量,再看看这个MSP的值的变化,按理应该还要往高处走。


如果还没问题,尤其工程里有使用中断,建议中断里多几个局部变量,如果这都没问题,或许片内有一块根据


手册不该用 而你却用到了的RAM存在。呵呵~!
sklaoshiren 回答时间:昨天 11:30

M内核的栈空间是从高地址向低地址生长,128kRAM的末尾是0x20020000,栈首地址当然是0x20020000,F42和F43系列这个0x20020000是SRAM3的起点不是末尾,256kRAM的栈首地址是0x20040000。

这个判断语句可以删掉,这部分编译器已经帮你做了,RAM不够用编译直接报错

butterflyspring 回答时间:昨天 12:01
这个判断语句是为了保证APP的堆栈刚好落入到RAM 区间。


0x20020000刚好是RAM最高地址的下一位。


RAM是向下生长的,理论上是没问题的。


之所以是0x20000000, 我觉得是当时编译器(链接文件)对于栈顶生成都紧跟着RAM区的,通常不会用到最大。 所以不想改代码的话,调整一下RAM区域数量,有空间的话改一下栈顶即可。
luo__ 回答时间:昨天 14:36

sklaoshiren 发表于 2025-1-9 11:30
M内核的栈空间是从高地址向低地址生长,128kRAM的末尾是0x20020000,栈首地址当然是0x20020000,F42和F ...

[md]我查询发现STMF103系列和STMF407系列关于SRAM的在堆栈分布并没有不同,但是F103系列在对APP程序的首地址进行判断时,采用的都是0x20000000,而不是末尾的SRAM地址,这又是为什么呢?

luo__ 回答时间:昨天 14:39

butterflyspring 发表于 2025-1-9 12:01
这个判断语句是为了保证APP的堆栈刚好落入到RAM 区间。</p>
<p>

代码更改后已经能跑了,就是对这个点有点疑惑

sklaoshiren 回答时间:昨天 15:49

luo__ 发表于 2025-1-9 14:36
我查询发现STMF103系列和STMF407系列关于SRAM的在堆栈分布并没有不同,但是F103系列在对APP程序的首 ...

[md]这个没有用,写法就是有问题,掩码0x2FFE0000支持0x20000000~0x2001FFFF,128k肯定在范围内,实际判断不了堆栈是否超出RAM

xmshao 回答时间:14 小时前
顺便提下,我前面所说的是假设 堆栈和各种变量的内存分配交由编译器默认处理,而不是 由程序员指定安排的。
luo__ 回答时间:10 小时前

xmshao 发表于 2025-1-9 17:54
看来,主要是好奇问题原因。</p>
<p>

这个工程代码是基于STM32cubeMx建立的,选用的芯片也是STM32F407VETx,在芯片配置上没有关于RAM的配置,都是默认的。

图片.png

我查看IAP代码时,发现在IAP代码的首地址也是0x20020000,所以应该不是SRAM超出了范围所致。更像下面楼说的,这是由于SRAM的堆栈地址从高到低排序,而导致堆首地址反而是0x20020000。

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版