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

stm32f439中怎么让程序在片外SDRAM中执行

[复制链接]
r123qq 提问时间:2014-4-4 14:46 /
想把程序从片内FLASH启动,将片外NOR FLASH中的应用加载到片外SDRAM中,然后跳转到片外SDRAM程序地址执行,可总是跳转不成功?
有哪位做过类似的项目,敬请指教。
收藏 评论9 发布时间:2014-4-4 14:46

举报

9个回答
pythonworld 回答时间:2014-4-4 21:03:03

RE:stm32f439中怎么让程序在片外SDRAM中执行

主要是操作指令指针:
指令指针寄存器ip,里面放置的不是指令,而是一个指向下一个将要去获取的指令的内存地址(所以它是一个指针)。它们的关系就是,CPU从指令指针寄存器ip 获得指令的内存地址,然后取出指令,放置到指令寄存器IR。接下来,指令指针寄存器ip自己加1(也就是指向下一条指令)。细节不了解.
wkuang 回答时间:2014-4-6 23:49:53

RE:stm32f439中怎么让程序在片外SDRAM中执行

要想代码在SRAM中运行。有几个步骤需要做。
1、中断向量表需要修改,这样才能把中断向量表重新映射一遍。
#ifdef VECT_TAB_SRAM
NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0);
#else
NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);
#endif

2、分散加载要设置,就是设置你的代码段和数据段在ram的运行地址,就是arm手册中的运行域。
3、你的代码相当于boot 和app模式,boot在flash中执行,然后把app从nor flash搬到sram所在地址。
你的运行域地址就是代码搬移到sram所在的地址
wdzfd 回答时间:2014-4-7 09:18:46

RE:stm32f439中怎么让程序在片外SDRAM中执行

这个你参考下
https://www.stmcu.org.cn/bbs/article_244_539846.html
你需要编写另外一段BOOTLOADER代码负责上电搬移代码到RAM内。
r123qq 回答时间:2014-4-7 11:11:19

回复:stm32f439中怎么让程序在片外SDRAM中执行

回复第 3 楼 于2014-04-06 23:49:53发表:
要想代码在SRAM中运行。有几个步骤需要做。
1、中断向量表需要修改,这样才能把中断向量表重新映射一遍。
#ifdef VECT_TAB_SRAM
NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0);
#else
NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);
#endif

2、分散加载要设置,就是设置你的代码段和数据段在ram的运行地址,就是arm手册中的运行域。
3、你的代码相当于boot 和app模式,boot在flash中执行,然后把app从nor flash搬到sram所在地址。
你的运行域地址就是代码搬移到sram所在的地址
 
谢谢楼上的指导。不过看楼主的代码,好象是让它在片内SRAM上运行。我的意图是想让它在片外SDRAM上运行。
我跟踪过去看NVIC_SetVectorTable这个函数的源代码,它好象只有片内SRAM,片内FLASH两个定义。
我需要再增加一个到片外SDRAM的定义?   
我自己在网上查资料是说,如果是片外SDRAM的话,好象不是直接跳转到片外SDRAM上执行,而是要配置SYSCFG_MEMRMP,将它映射到0x0000000那个地方。
现在我的程序是这样子的:
#define APPLICATION_ADDRESS                0xd0000000
 
  RCC_APB2PeriphResetCmd(RCC_APB2Periph_SYSCFG, ENABLE);
        SYSCFG_MemoryRemapConfig(SYSCFG_MemoryRemap_SDRAM);
       
      #define NVIC_VectTab_SDRAM             ((uint32_t)0x10000000)
        NVIC_SetVectorTable(NVIC_VectTab_SDRAM, 0x0); 
               
               
      /* Jump to user application */
      JumpAddress = *(__IO uint32_t*) (APPLICATION_ADDRESS + 4);
      Jump_To_Application = (pFunction) JumpAddress;
      /* Initialize user application's Stack Pointer */
      __set_MSP(*(__IO uint32_t*) APPLICATION_ADDRESS);
        Jump_To_Application();
 
不过它并没有执行,请楼主帮我看一看,多谢。
 

 
Eagleson 回答时间:2014-4-7 13:58:37

RE:stm32f439中怎么让程序在片外SDRAM中执行

是类似于IAP这样的功能么?
hilbertdavid 回答时间:2014-4-7 14:41:14

回复:stm32f439中怎么让程序在片外SDRAM中执行

 在启动文件里面要加入代码
 
dzc2001 回答时间:2014-4-9 11:00:00

回复:stm32f439中怎么让程序在片外SDRAM中执行

 这个挺麻烦的吧,效率可以么。
fengye5340 回答时间:2014-4-19 09:24:37

回复:stm32f439中怎么让程序在片外SDRAM中执行

楼主可以参考一些ARM9移植的例子,做一个bootloader.里面要实现NOR FLASH到SDRAM的复制,内存的管理(SDRAM的初始化及分配)。比如S3C2440的一些例程,再结合STM32的启动文件和sct文件进行修改。
11qiaoqi 回答时间:2015-3-23 16:18:21
我想弱弱的问下楼主,程序在外扩SDRAM中运行,运行效率高吗?能达到多搞的速率?
我做了类似的试验,运行速率很低,能否一起讨论下?

所属标签

相似问题

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