你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。
chrome
firefox
safari
ie8及以上
ST
意法半导体官网
STM32
中文官网
ST
全球论坛
登录/注册
首页
技术问答
话题
资源
创客秀
视频
标签
积分商城
每日签到
stm32f439中怎么让程序在片外SDRAM中执行
[复制链接]
r123qq
提问时间:2014-4-4 14:46 /
想把程序从片内FLASH启动,将片外NOR FLASH中的应用加载到片外SDRAM中,然后跳转到片外SDRAM程序地址执行,可总是跳转不成功?
有哪位做过类似的项目,敬请指教。
赞
0
收藏
0
评论
9
分享
发布时间:2014-4-4 14:46
举报
请先
登录
后回复
9个回答
pythonworld
回答时间:2014-4-4 21:03:03
a0a.1 0b0c
RE:stm32f439中怎么让程序在片外SDRAM中执行
主要是操作指令指针:
指令指针寄存器ip,里面放置的不是指令,而是一个指向下一个将要去获取的指令的内存地址(所以它是一个指针)。它们的关系就是,CPU从指令指针寄存器ip 获得指令的内存地址,然后取出指令,放置到指令寄存器IR。接下来,指令指针寄存器ip自己加1(也就是指向下一条指令)。细节不了解.
赞
0
评论
回复
支持
反对
wkuang
回答时间:2014-4-6 23:49:53
a0a.1 0b0c
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所在的地址
赞
0
评论
回复
支持
反对
wdzfd
回答时间:2014-4-7 09:18:46
a0a.1 0b0c
RE:stm32f439中怎么让程序在片外SDRAM中执行
这个你参考下
https://www.stmcu.org.cn/bbs/article_244_539846.html
你需要编写另外一段BOOTLOADER代码负责上电搬移代码到RAM内。
赞
0
评论
回复
支持
反对
r123qq
回答时间:2014-4-7 11:11:19
a0a.1 0b0c
回复: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();
不过它并没有执行,请楼主帮我看一看,多谢。
赞
0
评论
回复
支持
反对
Eagleson
回答时间:2014-4-7 13:58:37
a0a.1 0b0c
RE:stm32f439中怎么让程序在片外SDRAM中执行
是类似于IAP这样的功能么?
赞
0
评论
回复
支持
反对
hilbertdavid
回答时间:2014-4-7 14:41:14
a0a.1 0b0c
回复:stm32f439中怎么让程序在片外SDRAM中执行
在启动文件里面要加入代码
赞
0
评论
回复
支持
反对
dzc2001
回答时间:2014-4-9 11:00:00
a0a.1 0b0c
回复:stm32f439中怎么让程序在片外SDRAM中执行
这个挺麻烦的吧,效率可以么。
赞
0
评论
回复
支持
反对
fengye5340
回答时间:2014-4-19 09:24:37
a0a.1 0b0c
回复:stm32f439中怎么让程序在片外SDRAM中执行
楼主可以参考一些ARM9移植的例子,做一个bootloader.里面要实现NOR FLASH到SDRAM的复制,内存的管理(SDRAM的初始化及分配)。比如S3C2440的一些例程,再结合STM32的启动文件和sct文件进行修改。
赞
0
评论
回复
支持
反对
11qiaoqi
回答时间:2015-3-23 16:18:21
a0a.1 0b0c
我想弱弱的问下楼主,程序在外扩SDRAM中运行,运行效率高吗?能达到多搞的速率?
我做了类似的试验,运行速率很低,能否一起讨论下?
赞
0
评论
回复
支持
反对
所属标签
相似问题
关于
意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
微信公众号
手机版
快速回复
返回顶部
返回列表
RE:stm32f439中怎么让程序在片外SDRAM中执行
指令指针寄存器ip,里面放置的不是指令,而是一个指向下一个将要去获取的指令的内存地址(所以它是一个指针)。它们的关系就是,CPU从指令指针寄存器ip 获得指令的内存地址,然后取出指令,放置到指令寄存器IR。接下来,指令指针寄存器ip自己加1(也就是指向下一条指令)。细节不了解.
RE:stm32f439中怎么让程序在片外SDRAM中执行
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所在的地址
RE:stm32f439中怎么让程序在片外SDRAM中执行
https://www.stmcu.org.cn/bbs/article_244_539846.html
你需要编写另外一段BOOTLOADER代码负责上电搬移代码到RAM内。
回复: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所在的地址
谢谢楼上的指导。不过看楼主的代码,好象是让它在片内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();
不过它并没有执行,请楼主帮我看一看,多谢。
RE:stm32f439中怎么让程序在片外SDRAM中执行
回复:stm32f439中怎么让程序在片外SDRAM中执行
回复:stm32f439中怎么让程序在片外SDRAM中执行
回复:stm32f439中怎么让程序在片外SDRAM中执行
我做了类似的试验,运行速率很低,能否一起讨论下?