r123qq 发表于 2014-4-4 14:46:27

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

想把程序从片内FLASH启动,将片外NOR FLASH中的应用加载到片外SDRAM中,然后跳转到片外SDRAM程序地址执行,可总是跳转不成功?
有哪位做过类似的项目,敬请指教。

pythonworld 发表于 2014-4-4 21:03:03

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

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

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-25908 发表于 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中运行,运行效率高吗?能达到多搞的速率?
我做了类似的试验,运行速率很低,能否一起讨论下?
页: [1]
查看完整版本: stm32f439中怎么让程序在片外SDRAM中执行