硬汉嵌入式论坛

 找回密码
 立即注册
查看: 13591|回复: 69
收起左侧

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

  [复制链接]

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106649
QQ
发表于 2018-9-5 03:24:56 | 显示全部楼层 |阅读模式
基于V6测试例子:
IAP: IAP.7z (3.03 MB, 下载次数: 646)
APP: APP.7z (3.02 MB, 下载次数: 644)

特别注意,程序是加载到SDRAM里面执行的,而SDRAM是用的FMC总线,所以需要大家务必在IAP里面把所有FMC所接外设的驱动全部配置好,进入APP后不可再设置FMC,切记切记!!
对于我们V6板子来说,特别注意不可以在APP里面配置LED了(FMC扩展接口驱动的),在IAP里面配置好即可


APP说明:
SDRAM的首地址0xC000 0000,而中断向量表不放在SDRAM里面,我们要将其在main函数里面复制到内部SRAM里面,以加快中断进入速度。
所以option选项里面的配置如下,内部SRAM的前0x400大小分配给中断向量表使用。

1.png

复制中断向量表到内部SRAM
2.png

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


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

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

3、复制程序和程序跳转
99.png


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




评分

参与人数 1金币 +20 收起 理由
byccc + 20 赞一个!

查看全部评分

回复

使用道具 举报

0

主题

38

回帖

38

积分

新手上路

one is enough

积分
38
发表于 2018-9-5 06:31:13 | 显示全部楼层
哈哈,沙发 收藏了
one is enough
回复

使用道具 举报

0

主题

38

回帖

38

积分

新手上路

one is enough

积分
38
发表于 2018-9-5 06:31:15 | 显示全部楼层
哈哈,沙发 收藏了
one is enough
回复

使用道具 举报

5

主题

85

回帖

100

积分

初级会员

积分
100
发表于 2018-9-5 08:43:57 | 显示全部楼层
mark.   
回复

使用道具 举报

36

主题

2039

回帖

2147

积分

至尊会员

积分
2147
发表于 2018-9-5 10:01:25 | 显示全部楼层
感谢分享
Ever tried. Ever failed. No matter. Try Again. Fail again. Fail better.
回复

使用道具 举报

11

主题

38

回帖

71

积分

初级会员

积分
71
发表于 2018-9-5 11:35:15 | 显示全部楼层
想问一下,加载到SDRAM运行有什么好处呢?
回复

使用道具 举报

9

主题

103

回帖

130

积分

初级会员

积分
130
发表于 2018-9-5 11:36:07 | 显示全部楼层
问一下Table 13这个截图是哪个文档?我们一个项目是把图片数据 字库等上电加载到SDRAM并且通过校验后再正常工作,但是用一阵子后图片数据就显示不正常了,不知道是SDRAM问题还是什么野指针修改了这些数据,因为我们没加MPU.
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106649
QQ
 楼主| 发表于 2018-9-5 11:42:46 | 显示全部楼层
zhang062061 发表于 2018-9-5 11:35
想问一下,加载到SDRAM运行有什么好处呢?

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

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106649
QQ
 楼主| 发表于 2018-9-5 11:46:06 | 显示全部楼层
xy201207 发表于 2018-9-5 11:36
问一下Table 13这个截图是哪个文档?我们一个项目是把图片数据 字库等上电加载到SDRAM并且通过校验后再正常 ...

估计硬件设计问题居多,存个图片,字库都是基本操作,按理不该出问题的。
回复

使用道具 举报

1

主题

35

回帖

38

积分

新手上路

积分
38
发表于 2018-9-5 11:47:43 | 显示全部楼层
先收藏,,,,感谢分享,,,
回复

使用道具 举报

11

主题

38

回帖

71

积分

初级会员

积分
71
发表于 2018-9-5 11:49:16 | 显示全部楼层
eric2013 发表于 2018-9-5 11:42
没啥好处,就是程序可以很大。

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

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106649
QQ
 楼主| 发表于 2018-9-5 11:50:42 | 显示全部楼层
zhang062061 发表于 2018-9-5 11:49
明白,F429的程序默认只能存在内部flash,内部flash只有2M,确实受限。但是存在SDRAM掉电就没了吧

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

使用道具 举报

9

主题

103

回帖

130

积分

初级会员

积分
130
发表于 2018-9-5 11:54:43 | 显示全部楼层
eric2013 发表于 2018-9-5 11:42
没啥好处,就是程序可以很大。

回复

使用道具 举报

9

主题

103

回帖

130

积分

初级会员

积分
130
发表于 2018-9-5 11:58:22 | 显示全部楼层
eric2013 发表于 2018-9-5 11:46
估计硬件设计问题居多,存个图片,字库都是基本操作,按理不该出问题的。

先问问这个文档是哪个文档呀,怎么没找到
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106649
QQ
 楼主| 发表于 2018-9-5 12:03:52 | 显示全部楼层
xy201207 发表于 2018-9-5 11:58
先问问这个文档是哪个文档呀,怎么没找到

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

使用道具 举报

2

主题

569

回帖

575

积分

金牌会员

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

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

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

这个还是留给ST去搞把
回复

使用道具 举报

2

主题

569

回帖

575

积分

金牌会员

积分
575
发表于 2018-9-5 13:32:34 | 显示全部楼层
eric2013 发表于 2018-9-5 13:21
这个还是留给ST去搞把

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

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106649
QQ
 楼主| 发表于 2018-9-6 00:52:00 | 显示全部楼层
补充个知识点,BootROM和XiP
QQ截图20180906005122.png
回复

使用道具 举报

5

主题

578

回帖

593

积分

版主

Rank: 7Rank: 7Rank: 7

积分
593
发表于 2018-9-9 23:28:58 | 显示全部楼层
加载外部二进制文件,可以使用汇编指令incbin
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106649
QQ
 楼主| 发表于 2018-9-10 00:22:15 | 显示全部楼层
myxiaonia 发表于 2018-9-9 23:28
加载外部二进制文件,可以使用汇编指令incbin

回复

使用道具 举报

5

主题

578

回帖

593

积分

版主

Rank: 7Rank: 7Rank: 7

积分
593
发表于 2018-9-10 08:57:13 | 显示全部楼层

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

使用道具 举报

36

主题

2039

回帖

2147

积分

至尊会员

积分
2147
发表于 2018-9-10 11:40:57 | 显示全部楼层
如果加载到CCM RAM的话,貌似有点问题。
Ever tried. Ever failed. No matter. Try Again. Fail again. Fail better.
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106649
QQ
 楼主| 发表于 2018-9-10 14:14:21 | 显示全部楼层
byccc 发表于 2018-9-10 11:40
如果加载到CCM RAM的话,貌似有点问题。

正常应该是没问题的。
回复

使用道具 举报

3

主题

14

回帖

23

积分

新手上路

积分
23
发表于 2018-9-11 16:04:02 | 显示全部楼层
如何能通过st-link将程序下载到sdram中?现在429总共能用的sram只有256k,仿真稍微大点的程序必须下载到flash里。在SRAM里面仿真下载飞快,不用每次擦写芯片,适合调试的时候反复下载
回复

使用道具 举报

0

主题

26

回帖

26

积分

新手上路

积分
26
发表于 2018-9-11 16:05:39 | 显示全部楼层
eric2013 发表于 2018-9-10 14:14
正常应该是没问题的。

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

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106649
QQ
 楼主| 发表于 2018-9-11 16:09:10 | 显示全部楼层
xiatian_xjtu 发表于 2018-9-11 16:04
如何能通过st-link将程序下载到sdram中?现在429总共能用的sram只有256k,仿真稍微大点的程序必须下载到fla ...

这个我们早期的F1板子有做外部SRAM,后面发现坑人问题太多,已经放弃这种方式了。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106649
QQ
 楼主| 发表于 2018-9-11 16:24:56 | 显示全部楼层
lsx_007 发表于 2018-9-11 16:05
STM32F4 CCM RAM没有code address,不能将代码放在CCM运行,只可以放数据。另外,曾今尝试将FFT代码放在 ...

的确是
QQ截图20180911162438.png
回复

使用道具 举报

0

主题

26

回帖

26

积分

新手上路

积分
26
发表于 2018-9-11 16:44:18 | 显示全部楼层

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

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106649
QQ
 楼主| 发表于 2018-9-11 16:45:51 | 显示全部楼层
lsx_007 发表于 2018-9-11 16:44
硬汉,有没有测试过 FFT代码放在内部的SRAM运行与在Flash中运行的速度对比,我测试结果flash还快一些。另 ...

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

使用道具 举报

5

主题

85

回帖

100

积分

初级会员

积分
100
发表于 2018-9-11 17:09:50 | 显示全部楼层
硬汉老师,MPU 的配置是干啥的啊
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106649
QQ
 楼主| 发表于 2018-9-11 17:22:10 | 显示全部楼层
lidp000 发表于 2018-9-11 17:09
硬汉老师,MPU 的配置是干啥的啊

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

使用道具 举报

14

主题

61

回帖

103

积分

初级会员

积分
103
发表于 2018-9-12 09:57:37 | 显示全部楼层
本帖最后由 rgw5267 于 2018-9-12 09:59 编辑

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

STM32的脑残的FMC给SDRAM分配的地址在External device, 给NAND分配的却在External RAM区间, 而NAND无法直接执行程序, 我们可以通过地址映射交换两者的地址空间, 使SDRAM地址映射到External RAM. 具体方法为在main函数最开始执行
  1. SYSCFG->MEMRMP = SYSCFG->MEMRMP | SYSCFG_MEMRMP_SWP_FMC_0;
复制代码

这样SDRAM的原地址0xc0000000就映射到了0x80000000(我是挂在bank1), 可以直接运行程序.  在bootloader中直接将程序拷贝到该地址就行了.
记得app中的中断向量地址和lds文件的地址也要修改.



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


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


回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106649
QQ
 楼主| 发表于 2018-9-12 14:56:30 | 显示全部楼层
rgw5267 发表于 2018-9-12 09:57
还有另外一个方法. 硬汉可以尝试一下.  先放一张图

非常感谢

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

QQ截图20180912145623.png
回复

使用道具 举报

14

主题

61

回帖

103

积分

初级会员

积分
103
发表于 2018-9-12 23:31:58 | 显示全部楼层
eric2013 发表于 2018-9-12 14:56
非常感谢

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

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

使用道具 举报

20

主题

92

回帖

152

积分

初级会员

积分
152
发表于 2018-9-25 15:34:19 | 显示全部楼层
eric2013 发表于 2018-9-5 11:50
对,这种的都是上电后从外部flash或者SD卡等存储介质加载程序到SDRAM运行即可。

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

使用道具 举报

5

主题

578

回帖

593

积分

版主

Rank: 7Rank: 7Rank: 7

积分
593
发表于 2018-9-25 19:51:19 | 显示全部楼层
eric2013 发表于 2018-9-5 11:42
没啥好处,就是程序可以很大。

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

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

使用道具 举报

5

主题

578

回帖

593

积分

版主

Rank: 7Rank: 7Rank: 7

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

动态加载程序啊
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106649
QQ
 楼主| 发表于 2018-9-26 09:00:15 | 显示全部楼层
tovax 发表于 2018-9-25 15:34
把存储介质上的程序加载到SDRAM内存运行倒是很好的思路
请教一个类似的问题,关于u-boot的:
u-bo ...

这个没整过,帮不上了
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106649
QQ
 楼主| 发表于 2018-9-26 09:02:09 | 显示全部楼层
myxiaonia 发表于 2018-9-25 19:51
keil有例程,直接将程序编译到sdram地址,c库启动时候自动复制到sdram,然后直接就在sdram上运行了

也 ...

是不是类似这个:http://www.armbbs.cn/forum.php?m ... hlight=%D4%AD%B4%B4

这种方法也挺好的,灵活。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-4-27 22:40 , Processed in 0.566409 second(s), 37 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表