OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 5126|回复: 3

程序数组定义在外部SDRAM能初始化吗

[复制链接]

5

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
153
金钱
153
注册时间
2019-9-25
在线时间
65 小时
发表于 2021-7-27 13:59:41 | 显示全部楼层 |阅读模式
10金钱
使用stm32f429阿波罗板,想在keil里将一个结构体数组放在外部SDRAM,但调试发现数组里存放的数值和定义的不一样,SDRAM用的例程驱动使用是正常的,是不是程序里定义在外部SRAM的数组不能初始化啊,只能赋值?有没有大佬请教一下
  1. typedef struct tab1
  2. {
  3.         u16 unicode;
  4.         char* numdot;
  5. }signtable;
  6. signtable test[] __attribute__((at(0XC01F4000)))={{0x1234,"1-1"}};
复制代码





unicode里面一直是0x6E

unicode里面一直是0x6E

最佳答案

查看完整内容[请看2#楼]

做两条简单的验证应该就可以把问题找出来 一, 把指定的定址0XC01F4000改为内部RAM, 看是否赋值正常, 这能这能排除是否外部RAM的原因。 二, 在内部ram定义另一个signtable的变量abc, 在代码里把test的内容抄到abc, 然后看abc的内容是否跟赋值一样, 这能排除Debug Mode下更新的问题。 但我认为外部RAM是不能用这种方式赋值的, 因为编译器会让代码在所有外设都还没配置前就已经要完成对变量的初始赋值, 外置都没配, ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

3

主题

1907

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4105
金钱
4105
注册时间
2018-8-14
在线时间
696 小时
发表于 2021-7-27 13:59:42 | 显示全部楼层
本帖最后由 edmund1234 于 2021-7-27 15:14 编辑

做两条简单的验证应该就可以把问题找出来
一, 把指定的定址0XC01F4000改为内部RAM, 看是否赋值正常, 这能这能排除是否外部RAM的原因。
二, 在内部ram定义另一个signtable的变量abc, 在代码里把test的内容抄到abc, 然后看abc的内容是否跟赋值一样, 这能排除Debug Mode下更新的问题。


但我认为外部RAM是不能用这种方式赋值的, 因为编译器会让代码在所有外设都还没配置前就已经要完成对变量的初始赋值, 外置都没配, 怎么可能赋值给外部RAM呢?你说是吗?

回复

使用道具 举报

5

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
153
金钱
153
注册时间
2019-9-25
在线时间
65 小时
 楼主| 发表于 2021-7-27 15:18:42 | 显示全部楼层
edmund1234 发表于 2021-7-27 14:56
做两条简单的验证应该就可以把问题找出来
一, 把指定的定址0XC01F4000改为内部RAM, 看是否赋值正常, 这 ...

我觉得你后面说的很有道理,外部SDRAM还没初始化,所以这种赋值方式不行。所以是不是要等外部SDRAM初始化后用其他方式对数组成员赋值
回复

使用道具 举报

1

主题

6

帖子

0

精华

新手入门

积分
17
金钱
17
注册时间
2020-11-29
在线时间
2 小时
发表于 2021-7-28 08:12:44 | 显示全部楼层
应该检查的项目有:
1 . 外部的SRAM中使用时, 是否有 MPU 写入权限,无权限是不能操作的。
2 . 在赋值时,SystemInit()中赋值后,在main中使用时是不会生效的。主要原因是,系统在startup_stm32f429xx.s文件中有一段 汇编命令

  1. LDR        R0, =SystemInit                       
  2. BLX        R0         // 转换系统运行模式然后从 r0开始运行       
  3. LDR    R0, =__main
  4. BX     R0
  5. ENDP
复制代码

这个会导致你的这个 SRAM 中的一些数据会在main 中再次被初始化
3. 在 cortex-M4 中,core_cm4.h  有一些指令是
SCB_EnableICache();   // 使能指令预取缓存
SCB_EnableDCache(); // 使能数据预取缓存
你对RAM的赋值的数据不会直接写入硬件,而是需要一个有其他大量的变量需要使用 缓存 时需要将缓存给其他 变量用时才会写入硬件。 也可以使用命令 SCB_CleanDCache();  // 读数据之前先清理一下数据缓存
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-2-27 09:31

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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