硬汉嵌入式论坛

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

使用sdram定义并初始化数组

[复制链接]

4

主题

21

回帖

33

积分

新手上路

积分
33
发表于 2021-11-15 13:44:20 | 显示全部楼层 |阅读模式
使用stm32F429主控,内部ram不够用,想在外部的sdram定义并初始化全局变量数组。已经在system.stm32f4xx.c的SystemInit初始化了sdram,并在main函数中,将数组定义在外部sdram的地址。硬件仿真发现数组中的值和初始化的不同显示乱码,但后续给数组赋值是可以的,想请教有什么问题?

  1. u16 testsram[10]  __attribute__((at(0XC0000000))) = {0x01, 0x02};
复制代码
  1. void SystemInit(void)
  2. {
  3.   /* FPU settings ------------------------------------------------------------*/
  4.   #if (__FPU_PRESENT == 1) && (__FPU_USED == 1)
  5.     SCB->CPACR |= ((3UL << 10*2)|(3UL << 11*2));  /* set CP10 and CP11 Full Access */
  6.   #endif
  7.   /* Reset the RCC clock configuration to the default reset state ------------*/
  8.   /* Set HSION bit */
  9.   RCC->CR |= (uint32_t)0x00000001;

  10.   /* Reset CFGR register */
  11.   RCC->CFGR = 0x00000000;

  12.   /* Reset HSEON, CSSON and PLLON bits */
  13.   RCC->CR &= (uint32_t)0xFEF6FFFF;

  14.   /* Reset PLLCFGR register */
  15.   RCC->PLLCFGR = 0x24003010;

  16.   /* Reset HSEBYP bit */
  17.   RCC->CR &= (uint32_t)0xFFFBFFFF;

  18.   /* Disable all interrupts */
  19.   RCC->CIR = 0x00000000;

  20. #if defined (DATA_IN_ExtSRAM) || defined (DATA_IN_ExtSDRAM)
  21.   SystemInit_ExtMemCtl();
  22. #endif /* DATA_IN_ExtSRAM || DATA_IN_ExtSDRAM */

  23.   /* Configure the Vector Table location add offset address ------------------*/
  24. #ifdef VECT_TAB_SRAM
  25.   SCB->VTOR = SRAM_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal SRAM */
  26. #else
  27.   SCB->VTOR = FLASH_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal FLASH */
  28. #endif
  29.         HAL_Init();                     //初始化HAL库   
  30.         Stm32_Clock_Init(360,25,2,8);   //设置时钟,180Mhz
  31.         delay_init(180);                //初始化延时函数
  32.         SDRAM_Init();                   //初始化SDRAM
  33. }
复制代码



数组的值和定义的不同

数组的值和定义的不同

函数中可以正常赋值

函数中可以正常赋值
回复

使用道具 举报

3

主题

1233

回帖

1242

积分

至尊会员

积分
1242
发表于 2021-11-15 21:15:58 | 显示全部楼层
初始化SDRAM后,顺便做个自检程序,自检完毕后执行清零操作即可!
回复

使用道具 举报

4

主题

21

回帖

33

积分

新手上路

积分
33
 楼主| 发表于 2021-11-15 22:28:47 | 显示全部楼层
morning_enr6U 发表于 2021-11-15 21:15
初始化SDRAM后,顺便做个自检程序,自检完毕后执行清零操作即可!

但我想在sdram定义并且初始化数组,可以在程序中直接使用,省去赋值的过程
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

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

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

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

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

使用道具 举报

4

主题

21

回帖

33

积分

新手上路

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

执 ...

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

使用道具 举报

610

主题

3063

回帖

4913

积分

至尊会员

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

你可以每次上电初始化好后再从 nand 里面读取数据到 sdram 里面就可以了吧 对于初始化的时间来说这 600ms 应该还是可以接受的吧
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

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

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

使用道具 举报

4

主题

21

回帖

33

积分

新手上路

积分
33
 楼主| 发表于 2021-11-17 16:09:50 | 显示全部楼层
hpdell 发表于 2021-11-17 12:13
你可以每次上电初始化好后再从 nand 里面读取数据到 sdram 里面就可以了吧 对于初始化的时间来说这 600ms ...

这个读的速率还没有测试过,现在把文件放在了spi falsh了,测试下来读取很快,只要90ms
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-17 17:34 , Processed in 0.330876 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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