你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。
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管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号
手机版
快速回复
返回顶部
返回列表
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中执行
我做了类似的试验,运行速率很低,能否一起讨论下?