硬汉嵌入式论坛

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

定义const类型有初值的变量到SDRAM,应该如何初始化SDRAM

[复制链接]

32

主题

187

回帖

283

积分

高级会员

积分
283
发表于 2020-1-16 16:35:23 | 显示全部楼层 |阅读模式
看过一些介绍,是不是需要在main函数前面使用寄存器初始化SDRAM,我尝试做了,再进main前就进入硬件错误了
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107101
QQ
发表于 2020-1-16 16:43:00 | 显示全部楼层
像使用内部SRAM一样定义使用SDRAM和CCM RAM,可以随意定义到指定的RAM区域且无需具体地址
http://www.armbbs.cn/forum.php?m ... 9275&fromuid=58
(出处: 硬汉嵌入式论坛)
回复

使用道具 举报

32

主题

187

回帖

283

积分

高级会员

积分
283
 楼主| 发表于 2020-1-16 17:04:17 | 显示全部楼层
eric2013 发表于 2020-1-16 16:43
像使用内部SRAM一样定义使用SDRAM和CCM RAM,可以随意定义到指定的RAM区域且无需具体地址
http://www.armb ...

这种方法也不能定义有初值的变量吧?我仿真看,数据对不上
回复

使用道具 举报

32

主题

187

回帖

283

积分

高级会员

积分
283
 楼主| 发表于 2020-1-16 17:26:53 | 显示全部楼层
eric2013 发表于 2020-1-16 16:43
像使用内部SRAM一样定义使用SDRAM和CCM RAM,可以随意定义到指定的RAM区域且无需具体地址
http://www.armb ...

您提供的例程都是不需要初始化的变量,有初值的变量这样都不行
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107101
QQ
发表于 2020-1-16 17:44:46 | 显示全部楼层
这种要求的话,你要在这里就初始化SDRAM才行,也就是在程序使用SDRAM前就完成初始化。

QQ截图20200116174414.png
回复

使用道具 举报

32

主题

187

回帖

283

积分

高级会员

积分
283
 楼主| 发表于 2020-1-16 17:56:12 | 显示全部楼层
eric2013 发表于 2020-1-16 17:44
这种要求的话,你要在这里就初始化SDRAM才行,也就是在程序使用SDRAM前就完成初始化。

嗯,我是在这里用寄存器初始化,配置的话应该不会错,我是按照之前库初始化对着寄存器写的,但是直接进入了硬件错误...
回复

使用道具 举报

32

主题

187

回帖

283

积分

高级会员

积分
283
 楼主| 发表于 2020-1-16 18:04:52 | 显示全部楼层
eric2013 发表于 2020-1-16 17:44
这种要求的话,你要在这里就初始化SDRAM才行,也就是在程序使用SDRAM前就完成初始化。

我先在用寄存器配置ok了再移植进去
回复

使用道具 举报

32

主题

187

回帖

283

积分

高级会员

积分
283
 楼主| 发表于 2020-1-17 09:34:27 | 显示全部楼层
loliko 发表于 2020-1-16 18:04
我先在用寄存器配置ok了再移植进去

很奇怪,我在main里面用寄存器配置成功了,但是放在main之前去初始化,进入main里面使用SDRAM的内存就出现硬件错误
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107101
QQ
发表于 2020-1-17 09:49:51 | 显示全部楼层
loliko 发表于 2020-1-17 09:34
很奇怪,我在main里面用寄存器配置成功了,但是放在main之前去初始化,进入main里面使用SDRAM的内存就出 ...

运行的主频不同,上电后是用的内部RC时钟运行。后续才切换到HSE
回复

使用道具 举报

32

主题

187

回帖

283

积分

高级会员

积分
283
 楼主| 发表于 2020-1-17 09:52:35 | 显示全部楼层
eric2013 发表于 2020-1-17 09:49
运行的主频不同,上电后是用的内部RC时钟运行。后续才切换到HSE

那时钟可以在main之前初始化吧
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107101
QQ
发表于 2020-1-17 10:14:42 | 显示全部楼层
loliko 发表于 2020-1-17 09:52
那时钟可以在main之前初始化吧

默认也在system_stm32f4xx.c文件里面呢
回复

使用道具 举报

32

主题

187

回帖

283

积分

高级会员

积分
283
 楼主| 发表于 2020-1-17 15:46:58 | 显示全部楼层
eric2013 发表于 2020-1-17 10:14
默认也在system_stm32f4xx.c文件里面呢

搞定了,我还以为在main前配置必须用寄存器呢,在前面初始化hal库,再直接把原来的时钟以及sdram配置移过来就行了
回复

使用道具 举报

4

主题

21

回帖

33

积分

新手上路

积分
33
发表于 2021-11-11 23:14:53 | 显示全部楼层
老哥打扰了,我最近也遇到了需要在SDRAM初始化数据的问题,能给我看看你的代码吗?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107101
QQ
发表于 2021-11-12 09:26:15 | 显示全部楼层
1010186930 发表于 2021-11-11 23:14
老哥打扰了,我最近也遇到了需要在SDRAM初始化数据的问题,能给我看看你的代码吗?

在system_stm32f4xx.c的那个SystemInit函数里面就初始化好PLL和SDRAM。
回复

使用道具 举报

4

主题

21

回帖

33

积分

新手上路

积分
33
发表于 2021-11-12 10:28:55 | 显示全部楼层
eric2013 发表于 2021-11-12 09:26
在system_stm32f4xx.c的那个SystemInit函数里面就初始化好PLL和SDRAM。

硬汉你好,请问这里的初始化PLL是指初始化好系统时钟吗?例如plln,pllm,pllp,pllq之类
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107101
QQ
发表于 2021-11-12 10:32:37 | 显示全部楼层
1010186930 发表于 2021-11-12 10:28
硬汉你好,请问这里的初始化PLL是指初始化好系统时钟吗?例如plln,pllm,pllp,pllq之类

对就是这个。
回复

使用道具 举报

4

主题

21

回帖

33

积分

新手上路

积分
33
发表于 2021-11-15 11:01:56 | 显示全部楼层

硬汉你好,今天我试了一下,我在SystemInit里初始化了外部sdram,可以在程序中给定义在外部sdram的数组赋值。但将全局变量数组定义并初始化到sdram时,编译可以通过,但烧录的时候报错No Algorithm found for: C0000000H - C0000013H,且数组没有被赋值。数组是这样定义的,
  1. u16 testsram[10]  __attribute__((at(0XC0000000))) = {0x01, 0x02};//测试用数组
复制代码

想请教一下

在SystemInit初始化外部sdram

在SystemInit初始化外部sdram

烧录程序时报错

烧录程序时报错
回复

使用道具 举报

4

主题

21

回帖

33

积分

新手上路

积分
33
发表于 2021-11-15 11:40:05 | 显示全部楼层
1010186930 发表于 2021-11-15 11:01
硬汉你好,今天我试了一下,我在SystemInit里初始化了外部sdram,可以在程序中给定义在外部sdram的数组赋 ...

补充:这种方法sdram的初始值和设定值不同
定义在sdram的数组与初始化的值不同.jpg
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107101
QQ
发表于 2021-11-16 08:52:27 | 显示全部楼层
1010186930 发表于 2021-11-15 11:01
硬汉你好,今天我试了一下,我在SystemInit里初始化了外部sdram,可以在程序中给定义在外部sdram的数组赋 ...


void SystemInit(void)函数里面最好不要有什么局部变量调用,你的子程序里面应该有太多局部变量了。

执行函数SystemInit的时候,堆栈空间和RW变量空间都没有做初始化。

然后就是看map文件,这个地址分配值了没。

====================================
你这个方法的本质是存到内部Flash的,上电后加载到SDRAM,  干脆直接const存到内部Flash,上电加载即可。
回复

使用道具 举报

4

主题

21

回帖

33

积分

新手上路

积分
33
发表于 2021-11-16 09:57:23 | 显示全部楼层
eric2013 发表于 2021-11-16 08:52
void SystemInit(void)函数里面最好不要有什么局部变量调用,你的子程序里面应该有太多局部变量了。

...

硬汉您好,是这样的,我的应用场景是从nand flash遍历查找一份文件,文件10M,时间大概要600ms左右,有点慢。我希望把文件转成数组直接写在SDRAM里。我想问一下:
(1)如果按照您说的本质是存在内部flash,那我是不是写不了10M的数组
(2)既然是从内部flash加载到sdram,10M数组数据本身加载的速度是不是也很慢
谢谢!
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107101
QQ
发表于 2021-11-17 13:46:55 | 显示全部楼层
1010186930 发表于 2021-11-16 09:57
硬汉您好,是这样的,我的应用场景是从nand flash遍历查找一份文件,文件10M,时间大概要600ms左右,有点 ...

1、是的,写不了。
2、内部Flash往SDRAM加载是百兆字节级别的速率。
回复

使用道具 举报

4

主题

21

回帖

33

积分

新手上路

积分
33
发表于 2021-11-17 16:07:45 | 显示全部楼层
eric2013 发表于 2021-11-17 13:46
1、是的,写不了。
2、内部Flash往SDRAM加载是百兆字节级别的速率。

感谢硬汉哥的指点
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-17 16:33 , Processed in 0.248686 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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