硬汉嵌入式论坛

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

[SDRAM] STM32H743定义数组到外部SDRAM会硬件报错

[复制链接]

0

主题

3

回帖

3

积分

新手上路

积分
3
发表于 2024-12-20 01:05:37 | 显示全部楼层 |阅读模式
本帖最后由 閃耀の電阻人 于 2024-12-20 01:48 编辑

打算将读取AD7606的数据放在外部SDRAM,直接操作地址太麻烦了,所以想使用__attribute__的方式定义到SDRAM,操作数组会灵活很多,避免混淆地址
所以参考了网上的用link的方式来定义



在.SCT里加了一句:

  RW_RAM1 0xD0000000 UNINIT 0x02000000 {;RW data
  .ANY (SDRAM_CACHE_AREA)
  }

这个是定义的代码:

/**
* SDRAM 类
*/
#define SDRAM_AREA __attribute__((section("SDRAM_CACHE_AREA"))) // 定义SDRAM空间,0x200 0000*8=268435456bit=256*1024*1024=256Mbit=32MByte
#define COUNTER_LEN 1024                                        // 保存16通道的FFT计算结果长度
#define CACHE_LAYERS 128                                        // 缓存深度,缓存中一次性存储16通道长度为FFT_LENGTH的实数虚数组数



定义一个128x16x2048的三维数组,钢好16MB:
float32_t FiFo_Data_Cache[CACHE_LAYERS][16][FFT_LENGTH * 2] SDRAM_AREA = {0}; // 数据缓存,定义在SDRAM




问题就是之前在F429里面运行没有问题的,现在放在H743里面,一启动就会跳转到 HardFault_Handler(void) 异常中断(测试SDRAM读写也是正常的),注释了上面的代码就能正常运行,所以感觉是这个定义方式的问题,
但是小白对M7的mpu不是很了解(第一次用H7的系列),在CubeMX里只使能了CPU DCache
下面的图是MX的M7配置



编译后,能看到link的大小,差不多是16MB(16 777 216)
QQ20241220-004639.png



在KEIL里查了,发现运行到启动的 _main 就进入中断 HardFault_Handler(void) 了,去看了一下关于H7的启动过程,上一步是配置RCC相关寄存器的复位,但还是不明白进入中断的原因
可以确定的是,不使用__attribute__定义的数组,单片机就没有问题
阿松大.png
所以我就在这里卡住了,希望佬们能给指导指导

回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115434
QQ
发表于 2024-12-20 08:47:11 | 显示全部楼层
把初始化 = {0}去掉

float32_t FiFo_Data_Cache[CACHE_LAYERS][16][FFT_LENGTH * 2] SDRAM_AREA; // 数据缓存,定义在SDRAM
回复

使用道具 举报

1

主题

47

回帖

50

积分

初级会员

积分
50
发表于 2024-12-20 13:49:05 | 显示全部楼层
做个二级跳转,执行当前程序时,确保SDRAM已完成底层驱动初始化
回复

使用道具 举报

0

主题

3

回帖

3

积分

新手上路

积分
3
 楼主| 发表于 2024-12-20 15:40:38 | 显示全部楼层
eric2013 发表于 2024-12-20 08:47
把初始化 = {0}去掉

float32_t FiFo_Data_Cache[CACHE_LAYERS][16][FFT_LENGTH * 2] SDRAM_AREA; // 数 ...

硬汉哥,初始化 = {0}去掉还是不行
我下了“V7-058_内部TCM,SRAM和外部SDRAM等六块内存的超方便使用方式”的例程,按例程配置了结果也是跳硬件一场中断
回复

使用道具 举报

0

主题

3

回帖

3

积分

新手上路

积分
3
 楼主| 发表于 2024-12-20 15:42:40 | 显示全部楼层
lililili 发表于 2024-12-20 13:49
做个二级跳转,执行当前程序时,确保SDRAM已完成底层驱动初始化

佬,能说详细一些吗
我找到过说在.s文件的_main汇编前面加一段SDRAM的初始化代码,我跟着试了一下也没有成功(可能是我代码的问题)
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115434
QQ
发表于 2024-12-21 08:51:58 | 显示全部楼层
閃耀の電阻人 发表于 2024-12-20 15:40
硬汉哥,初始化 = {0}去掉还是不行
我下了“V7-058_内部TCM,SRAM和外部SDRAM等六块内存的超方便使用方 ...

直接使用我这个例子的使用方式试试,看看还有问题没

根据你楼主位的描述,就是未初始化SDRAM,却使用了SDRAM
回复

使用道具 举报

4

主题

119

回帖

131

积分

初级会员

积分
131
发表于 2024-12-21 10:02:25 | 显示全部楼层
閃耀の電阻人 发表于 2024-12-20 15:42
佬,能说详细一些吗
我找到过说在.s文件的_main汇编前面加一段SDRAM的初始化代码,我跟着试了一下也没有 ...

如果SDRAM里有初始化数据,包括.bbs和.data,参考STM32Cube_FW_H7 Projects\STM32H743I-EVAL\Examples\FMC\FMC_SDRAM_DataMemory,在system_stm32h7xx.c增加SDRAM初始化代码。
回复

使用道具 举报

3

主题

72

回帖

81

积分

初级会员

积分
81
发表于 2024-12-23 10:33:40 | 显示全部楼层
我觉得不是初始化的问题,毕竟他已经指定了段了,所以数据已经不在bss/data段了,startup也不会处理了。
HardFault的时候看一下调用栈,这种情况一般能定位到时哪一句代码出问题的。
回复

使用道具 举报

6

主题

24

回帖

42

积分

新手上路

积分
42
发表于 2025-3-3 10:40:34 来自手机 | 显示全部楼层
閃耀の電阻人 发表于 2024-12-20 15:42
佬,能说详细一些吗
我找到过说在.s文件的_main汇编前面加一段SDRAM的初始化代码,我跟着试了一下也没有 ...

朋友你解决了吗,我也卡在这个问题,但是给SDRAM分配少一点内存是可以当做RAM正常使用的,但是一旦给多了例如32M,就会上电直接进硬报错中断
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115434
QQ
发表于 2025-3-3 11:15:30 | 显示全部楼层
sssuuu 发表于 2025-3-3 10:40
朋友你解决了吗,我也卡在这个问题,但是给SDRAM分配少一点内存是可以当做RAM正常使用的,但是一旦给多了 ...

之前做了一个案例,关键是这个分散加载设置,启动阶段不使用SDRAM,硬件上配置初始化完毕后再使用即可

【原创】像使用内部SRAM一样定义使用STM32H7的外部SDRAM,含MDK和IAR两版
https://www.armbbs.cn/forum.php? ... id=98697&fromuid=58
(出处: 硬汉嵌入式论坛)


QQ20250303-111456.png
回复

使用道具 举报

6

主题

24

回帖

42

积分

新手上路

积分
42
发表于 2025-3-3 19:21:08 | 显示全部楼层
eric2013 发表于 2025-3-3 11:15
之前做了一个案例,关键是这个分散加载设置,启动阶段不使用SDRAM,硬件上配置初始化完毕后再使用即可

...

好的,硬汉哥,配合你的方法再加了点函数解决了,用时三天
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-4-25 19:17 , Processed in 0.350894 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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