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

我现在使用STM32F446ZET6芯片,外挂了16m的片外SDRAM。想把程序在SDRAM中运行,一直尝试没有成功,希望得到帮助,是否有相关的例子或参考的文档

[复制链接]
在细雨中呼喊 提问时间:2026-3-6 16:32 / 未解决
收藏 评论5 发布时间:2026-3-6 16:32

举报

5个回答
Xa__ 回答时间:2026-3-6 16:42:54

采用FMC外接SDRAM方案?

在细雨中呼喊 回答时间:2026-3-6 22:36:34

Xa__ 发表于 2026-3-6 16:42
采用FMC外接SDRAM方案?

是的,想做一个bootloader将程序从片外的flash中读出加载在SDRAM中运行。你有什么建议吗?

butterflyspring 回答时间:2026-3-9 14:21:13

在细雨中呼喊 发表于 2026-3-6 22:36
是的,想做一个bootloader将程序从片外的flash中读出加载在SDRAM中运行。你有什么建议吗?
...

注意外部传过来的程序是链接到 0xC000 0000 地址上的程序。

同时需要中断向量映射到这个地址上去。

理论上讲,应该类似与IAP模式。

目前没有看到过类似的例程,估计是这类应用不多吧。

另外访问外部SDRAM速度比较慢,所以程序运行速度也会受影响。

在细雨中呼喊 回答时间:2026-3-11 10:01:54

butterflyspring 发表于 2026-3-9 14:21
注意外部传过来的程序是链接到 0xC000 0000 地址上的程序。</p>
<p>

#define SDRAM_APP_ADDR 0xC0000000 // 程序在SDRAM的运行起始地址

typedef void (*pFunction)(void); // 函数指针:跳转至SDRAM中的程序

pFunction JumpToApp;

uint32_t app_stack = *(uint32_t*)SDRAM_APP_ADDR; //栈顶地址

JumpToApp = (pFunction)*(uint32_t*)(SDRAM_APP_ADDR + 4); //入口函数地址

__set_MSP(app_stack); //设置MSP并跳转

JumpToApp(); //执行入口函数

以上已经按照类似的思路处理了,但是执行进入JumpToApp()后,SDRAM中的程序应该是500ms LED灯闪烁。但是程序好像没有按预期运行,看不到LED闪烁。检查PC和SP地址都已经在SDRAM上了,因为地址都是0xC开头的。 另外那个500ms LED灯闪烁的程序,我在debug前加载ini的方式,直接将编译的axf文件放在SDRAM上打断点调试过是正常的。将这个程序编译成bin,通过bootloader使用上面的语句加载程序,却没有按预想的执行 不知道还有什么建议吗?

butterflyspring 回答时间:2026-3-11 17:09:43

可以参考下面的方式检测一下
1. 首先 闪灯程序是以 0xc0000000开始编译链接的

2. 如果放在SDRAM调试时可以正常工作的,那么在bootloader 传完后,读出来比较一下内容是否有异常。
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版