eric2013 发表于 2018-9-5 03:24:56

STM32F429的程序加载到SDRAM的运行方法

基于V6测试例子:
IAP:
APP:

特别注意,程序是加载到SDRAM里面执行的,而SDRAM是用的FMC总线,所以需要大家务必在IAP里面把所有FMC所接外设的驱动全部配置好,进入APP后不可再设置FMC,切记切记!!
对于我们V6板子来说,特别注意不可以在APP里面配置LED了(FMC扩展接口驱动的),在IAP里面配置好即可。
static/image/hrline/4.gif
APP说明:
SDRAM的首地址0xC000 0000,而中断向量表不放在SDRAM里面,我们要将其在main函数里面复制到内部SRAM里面,以加快中断进入速度。
所以option选项里面的配置如下,内部SRAM的前0x400大小分配给中断向量表使用。


复制中断向量表到内部SRAM


配置生成xxx.bin文件,生成后使用emWin的小软件B2C.exe转换成C数组,方便我们我们测试


static/image/hrline/4.gif
IAP说明:
1、要配置0xC000 0000地址区可以执行程序,这里得配置MPU才行,所有直接将H7的HAL库中MPU复制粘贴整理到bsp_mpu.c文件,配置简单省事



2、将APP程序转接成了C数组,方便直接添加到工程里面复制到SDRAM中


3、复制程序和程序跳转


static/image/hrline/4.gif
程序测试效果
IAP程序是LED2闪烁,而APP是LED4闪烁,用户仅需下载IAP的程序到V6板子即可,然后按下按键K1就看到程序跳转到SDRAM里面运行





片羽之神 发表于 2018-9-5 06:31:13

哈哈,沙发 收藏了

片羽之神 发表于 2018-9-5 06:31:15

哈哈,沙发 收藏了

lidp000 发表于 2018-9-5 08:43:57

mark.   

byccc 发表于 2018-9-5 10:01:25

感谢分享:victory:

zhang062061 发表于 2018-9-5 11:35:15

想问一下,加载到SDRAM运行有什么好处呢?

xy201207 发表于 2018-9-5 11:36:07

问一下Table 13这个截图是哪个文档?我们一个项目是把图片数据 字库等上电加载到SDRAM并且通过校验后再正常工作,但是用一阵子后图片数据就显示不正常了,不知道是SDRAM问题还是什么野指针修改了这些数据,因为我们没加MPU.

eric2013 发表于 2018-9-5 11:42:46

zhang062061 发表于 2018-9-5 11:35
想问一下,加载到SDRAM运行有什么好处呢?

没啥好处,就是程序可以很大。

eric2013 发表于 2018-9-5 11:46:06

xy201207 发表于 2018-9-5 11:36
问一下Table 13这个截图是哪个文档?我们一个项目是把图片数据 字库等上电加载到SDRAM并且通过校验后再正常 ...
估计硬件设计问题居多,存个图片,字库都是基本操作,按理不该出问题的。

烟花绽放 发表于 2018-9-5 11:47:43

先收藏,,,,感谢分享,,,

zhang062061 发表于 2018-9-5 11:49:16

eric2013 发表于 2018-9-5 11:42
没啥好处,就是程序可以很大。

明白,F429的程序默认只能存在内部flash,内部flash只有2M,确实受限。但是存在SDRAM掉电就没了吧

eric2013 发表于 2018-9-5 11:50:42

zhang062061 发表于 2018-9-5 11:49
明白,F429的程序默认只能存在内部flash,内部flash只有2M,确实受限。但是存在SDRAM掉电就没了吧

对,这种的都是上电后从外部flash或者SD卡等存储介质加载程序到SDRAM运行即可。

xy201207 发表于 2018-9-5 11:54:43

eric2013 发表于 2018-9-5 11:42
没啥好处,就是程序可以很大。

{:8:}

xy201207 发表于 2018-9-5 11:58:22

eric2013 发表于 2018-9-5 11:46
估计硬件设计问题居多,存个图片,字库都是基本操作,按理不该出问题的。

先问问这个文档是哪个文档呀,怎么没找到:L

eric2013 发表于 2018-9-5 12:03:52

xy201207 发表于 2018-9-5 11:58
先问问这个文档是哪个文档呀,怎么没找到

参考手册,用户手册,编程手册这三个手册里面检索Table 13

leiyitan 发表于 2018-9-5 13:19:44

希望搞出一个通用的底层框架或操作系统,做成一个可以让用户自己随意安装APP的东西…感觉像安卓的虚拟机了

eric2013 发表于 2018-9-5 13:21:57

leiyitan 发表于 2018-9-5 13:19
希望搞出一个通用的底层框架或操作系统,做成一个可以让用户自己随意安装APP的东西…感觉像安卓的虚拟机了

这个还是留给ST去搞把:lol

leiyitan 发表于 2018-9-5 13:32:34

eric2013 发表于 2018-9-5 13:21
这个还是留给ST去搞把

反正现在单片机都上硬盘内存条了,直接像电脑这么玩得了,换不同单片机就像换台式电脑主板,软件就直接开发APP.这种事情让ST自己去做挺好的:D

eric2013 发表于 2018-9-6 00:52:00

补充个知识点,BootROM和XiP

myxiaonia 发表于 2018-9-9 23:28:58

加载外部二进制文件,可以使用汇编指令incbin

eric2013 发表于 2018-9-10 00:22:15

myxiaonia 发表于 2018-9-9 23:28
加载外部二进制文件,可以使用汇编指令incbin

{:33:}

myxiaonia 发表于 2018-9-10 08:57:13

eric2013 发表于 2018-9-10 00:22


这样做以后程序看上去又能简洁不少

byccc 发表于 2018-9-10 11:40:57

如果加载到CCM RAM的话,貌似有点问题。

eric2013 发表于 2018-9-10 14:14:21

byccc 发表于 2018-9-10 11:40
如果加载到CCM RAM的话,貌似有点问题。

正常应该是没问题的。

xiatian_xjtu 发表于 2018-9-11 16:04:02

如何能通过st-link将程序下载到sdram中?现在429总共能用的sram只有256k,仿真稍微大点的程序必须下载到flash里。在SRAM里面仿真下载飞快,不用每次擦写芯片,适合调试的时候反复下载

lsx_007 发表于 2018-9-11 16:05:39

eric2013 发表于 2018-9-10 14:14
正常应该是没问题的。

STM32F4 CCM RAM没有code address,不能将代码放在CCM运行,只可以放数据。另外,曾今尝试将FFT代码放在内部的SRAM运行,结果比Flash中还慢一点点,有点奇怪。

eric2013 发表于 2018-9-11 16:09:10

xiatian_xjtu 发表于 2018-9-11 16:04
如何能通过st-link将程序下载到sdram中?现在429总共能用的sram只有256k,仿真稍微大点的程序必须下载到fla ...
这个我们早期的F1板子有做外部SRAM,后面发现坑人问题太多,已经放弃这种方式了。

eric2013 发表于 2018-9-11 16:24:56

lsx_007 发表于 2018-9-11 16:05
STM32F4 CCM RAM没有code address,不能将代码放在CCM运行,只可以放数据。另外,曾今尝试将FFT代码放在 ...
的确是{:8:}

lsx_007 发表于 2018-9-11 16:44:18

eric2013 发表于 2018-9-11 16:24
的确是

硬汉,有没有测试过 FFT代码放在内部的SRAM运行与在Flash中运行的速度对比,我测试结果flash还快一些。另外STM32F303内部的CCM 是连接了I-code总线可以运行程序,测试过CCM里面运行FFT代码,速度比在Flash中运行要快很多。

eric2013 发表于 2018-9-11 16:45:51

lsx_007 发表于 2018-9-11 16:44
硬汉,有没有测试过 FFT代码放在内部的SRAM运行与在Flash中运行的速度对比,我测试结果flash还快一些。另 ...

这个我没有试过,回头我试试看。到时我们交流。

lidp000 发表于 2018-9-11 17:09:50

硬汉老师,MPU 的配置是干啥的啊

eric2013 发表于 2018-9-11 17:22:10

lidp000 发表于 2018-9-11 17:09
硬汉老师,MPU 的配置是干啥的啊

F1,F4一般用不到,等到了H7用到的多,需要设置L1 Cache缓存。

rgw5267 发表于 2018-9-12 09:57:37

本帖最后由 rgw5267 于 2018-9-12 09:59 编辑

还有另外一个方法. 硬汉可以尝试一下.先放一张图


STM32的脑残的FMC给SDRAM分配的地址在External device, 给NAND分配的却在External RAM区间, 而NAND无法直接执行程序, 我们可以通过地址映射交换两者的地址空间, 使SDRAM地址映射到External RAM. 具体方法为在main函数最开始执行SYSCFG->MEMRMP = SYSCFG->MEMRMP | SYSCFG_MEMRMP_SWP_FMC_0;
这样SDRAM的原地址0xc0000000就映射到了0x80000000(我是挂在bank1), 可以直接运行程序.在bootloader中直接将程序拷贝到该地址就行了.
记得app中的中断向量地址和lds文件的地址也要修改.



lds文件修改位置
MEMORY
{
      FLASH (RX)   : ORIGIN =0x80000000, LENGTH = 3M
      SRAM (RWX)   : ORIGIN = 0x20000000, LENGTH = 192K
      CCMRAM (RWX) : ORIGIN = 0x10000000, LENGTH = 64K
}SystemInit函数中的中断向量地址
#ifdef VECT_TAB_SRAM
SCB->VTOR = SRAM_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal SRAM */
#else
SCB->VTOR = 0x80000000 | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal FLASH */
#endif

SDRAM前3M分配给了APP, 后面的都指向了FreeRTOS的栈空间. 程序已经验证过, 就是太慢太慢了. 我的SDRAM是16位的, 并且只能运行在96MHz.
运行有多慢, 原来从NAND读10M内容到SDRAM需要30S, 现在需要大概10分钟吧.


eric2013 发表于 2018-9-12 14:56:30

rgw5267 发表于 2018-9-12 09:57
还有另外一个方法. 硬汉可以尝试一下.先放一张图



非常感谢:handshake

看手册这个还可以优化下使用ICode总线,不使用System总线,性能还可以提升一点。


rgw5267 发表于 2018-9-12 23:31:58

eric2013 发表于 2018-9-12 14:56
非常感谢

看手册这个还可以优化下使用ICode总线,不使用System总线,性能还可以提升一点。
...

试了一下映射到0x00000000, 好处是nand不用改地址了, 坏处是更慢了. 目前不知道为什么更慢的原因

tovax 发表于 2018-9-25 15:34:19

eric2013 发表于 2018-9-5 11:50
对,这种的都是上电后从外部flash或者SD卡等存储介质加载程序到SDRAM运行即可。

把存储介质上的程序加载到SDRAM内存运行倒是很好的思路{:8:}
请教一个类似的问题,关于u-boot的:
u-boot在执行前半段初始化序列时是在flash中执行的,这是的调试信息和代码信息是编译的时候对应生成的,调试器运行很正常;但是到了后半段,程序被拷贝到SDRAM中运行,调试器就找不到调试信息(c源码、行号等)了,只能看到汇编代码,不知道有没有好的方法可以解决这种运行调试问题?

myxiaonia 发表于 2018-9-25 19:51:19

eric2013 发表于 2018-9-5 11:42
没啥好处,就是程序可以很大。

keil有例程,直接将程序编译到sdram地址,c库启动时候自动复制到sdram,然后直接就在sdram上运行了

也可以在sdram上调试程序,好处就是不需要每次都下载,我在amo上发过一个帖子,就是在lpc1788上用sdram调试程序

myxiaonia 发表于 2018-9-25 19:52:27

leiyitan 发表于 2018-9-5 13:19
希望搞出一个通用的底层框架或操作系统,做成一个可以让用户自己随意安装APP的东西…感觉像安卓的虚拟机了

动态加载程序啊

eric2013 发表于 2018-9-26 09:00:15

tovax 发表于 2018-9-25 15:34
把存储介质上的程序加载到SDRAM内存运行倒是很好的思路
请教一个类似的问题,关于u-boot的:
u-bo ...

这个没整过,帮不上了

eric2013 发表于 2018-9-26 09:02:09

myxiaonia 发表于 2018-9-25 19:51
keil有例程,直接将程序编译到sdram地址,c库启动时候自动复制到sdram,然后直接就在sdram上运行了

也 ...

是不是类似这个:http://www.armbbs.cn/forum.php?mod=viewthread&tid=86207&highlight=%D4%AD%B4%B4

这种方法也挺好的,灵活。
页: [1] 2
查看完整版本: STM32F429的程序加载到SDRAM的运行方法