ST意法半导体
直播中

贺楠

8年用户 1026经验值
私信 关注
[问答]

STM32F407嵌入式SRAM映射为0x20020000,为什么?

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

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

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

但是我用的芯片为STM32F407VET6,并不是F42和F43系列的,按照手册上的表示,应该是0x20000000,而不是0x20020000,因此产生了矛盾。
在网上查询了许久,也没有找到答案,望各位大神指点指点小弟。

回帖(1)

李桂兰

2025-3-11 17:44:47

在STM32F407的IAP(In Application Programming)功能中,跳转到应用程序的代码时,通常需要检查应用程序的栈指针(SP)和复位向量(Reset Handler)是否有效。你提到的0x20020000是嵌入式SRAM的映射地址,而0x20000000是STM32F407的SRAM起始地址。你遇到的问题可能是由于SRAM的映射地址与预期的不一致,导致跳转代码无法正确执行。


问题分析




  1. SRAM映射地址



    • STM32F407的SRAM起始地址是0x20000000,但你发现取到的地址是0x20020000。这可能是因为你的应用程序的栈指针(SP)或复位向量(Reset Handler)指向了0x20020000,而不是0x20000000




  2. 跳转代码



    • 你提到的跳转代码可能包含如下语句:
      if (((*(__IO uint32_t*)ApplicationAddress) & 0x2FFE0000 ) == 0x20000000)
      {
      // 跳转到应用程序
      }

    • 这条语句的目的是检查应用程序的栈指针是否在SRAM的范围内(0x200000000x2001FFFF)。但由于你取到的地址是0x20020000,与0x20000000不匹配,所以无法进入if语句。




  3. 原因



    • 应用程序的栈指针(SP)或复位向量(Reset Handler)可能被设置为0x20020000,这可能是因为应用程序的链接脚本(Linker Script)或启动文件(Startup File)中配置了不同的SRAM大小或地址。




解决方案




  1. 检查应用程序的链接脚本和启动文件



    • 确保应用程序的链接脚本和启动文件中SRAM的起始地址和大小配置正确。通常,STM32F407的SRAM大小为192KB,起始地址为0x20000000




  2. 修改跳转代码



    • 如果应用程序的栈指针确实指向0x20020000,你可以修改跳转代码中的判断条件,使其适应新的SRAM地址范围。例如:
      if (((*(__IO uint32_t*)ApplicationAddress) & 0x2FFE0000 ) == 0x20020000)
      {
      // 跳转到应用程序
      }

    • 或者,你可以扩大SRAM的地址范围检查,以适应更大的SRAM地址:
      if (((*(__IO uint32_t*)ApplicationAddress) & 0x2FFE0000 ) >= 0x20000000 && ((*(__IO uint32_t*)ApplicationAddress) & 0x2FFE0000 ) <= 0x20020000)
      {
      // 跳转到应用程序
      }




  3. 调试和验证



    • 使用调试工具(如ST-Link、J-Link等)查看应用程序的栈指针(SP)和复位向量(Reset Handler)的值,确保它们指向正确的地址。




总结


你遇到的问题是由于应用程序的栈指针或复位向量指向了0x20020000,而不是0x20000000。通过检查应用程序的链接脚本和启动文件,并适当修改跳转代码中的判断条件,可以解决这个问题。确保SRAM的地址范围和应用程序的配置一致,跳转代码才能正确执行。

举报

更多回帖

发帖
×
20
完善资料,
赚取积分