硬汉嵌入式论坛

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

[SDRAM] 将变量定义到SDRAM,就进入HardFault_Handler

[复制链接]

4

主题

5

回帖

17

积分

新手上路

积分
17
发表于 2021-11-25 14:12:09 | 显示全部楼层 |阅读模式
硬汉哥,你好。近期使用STM32H743替换STM32F429,外挂了SDRAM。将变量定义到SDRAM,就进入HardFault_Handler。这样的方式在F429上面是正常的。SDRAM的读写也是正常的。下面是配置,麻烦帮忙看下是否有错误,谢谢。LR_IROM1 0x08000000 0x00200000  {    ; load region size_region
        ER_IROM1 0x08000000 0x00200000  {  ; load address = execution address
                *.o (RESET, +First)
                *(InRoot$$Sections)
                .ANY (+RO)
        }   
        
        RW_IRAM1 0x20000000 0x00020000  {  ; RW data - 128KB DTCM
                .ANY (+RW +ZI)
        }

        RW_IRAM2 0x24000000 0x00080000  {  ; RW data - 512KB AXI SRAM
                .ANY (+RW +ZI)
        }

        RW_IRAM3 0x30000000 0x00048000  {  ; RW data - 128KB SRAM1(0x30000000) + 128KB SRAM2(0x3002 0000) + 32KB SRAM3(0x30040000)
                *(.RAM_D1)
        }
        
        RW_IRAM4 0xC0000000 0x01000000 { ; RW data
        *(.SDRAM)
    }
}

下载 (4).png

__attribute__((section (".RAM_D1"))) static uint8_t gCCMRam[RAM_CCM_SIZE * 1024];
__attribute__((section (".SDRAM")))  static uint8_t gExternalRam[RAM_EXTERNAL_SIZE * 1024];






回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
111540
QQ
发表于 2021-11-25 15:06:11 | 显示全部楼层
这个要配置下,此贴

像使用内部SRAM一样定义使用STM32H7的外部SDRAM,含MDK和IAR两版
http://www.armbbs.cn/forum.php?m ... 8697&fromuid=58
(出处: 硬汉嵌入式论坛)
回复

使用道具 举报

4

主题

5

回帖

17

积分

新手上路

积分
17
 楼主| 发表于 2021-11-25 15:20:19 | 显示全部楼层
问题解决,多谢多谢。修改两处。
RW_IRAM4 0xC0000000 UNINIT 0x01000000 { ; RW data
        *(.SDRAM)
    }
__attribute__((section (".SDRAM"),zero_init))  static uint8_t gExternalRam[RAM_EXTERNAL_SIZE * 1024];

回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
111540
QQ
发表于 2021-11-25 15:33:32 | 显示全部楼层
nncrazy 发表于 2021-11-25 15:20
问题解决,多谢多谢。修改两处。
RW_IRAM4 0xC0000000 UNINIT 0x01000000 { ; RW data
        *(.SDRAM) ...

对,就是这两处。
回复

使用道具 举报

4

主题

5

回帖

17

积分

新手上路

积分
17
 楼主| 发表于 2021-11-25 15:37:48 | 显示全部楼层
为什么F429是不需要增加,H7需要增加呢?麻烦指定一下,谢谢。
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
111540
QQ
发表于 2021-11-25 15:55:32 | 显示全部楼层
nncrazy 发表于 2021-11-25 15:37
为什么F429是不需要增加,H7需要增加呢?麻烦指定一下,谢谢。

估计是芯片内部结构的问题,不过不管是F429还是H7,配置下是最靠谱的。
回复

使用道具 举报

4

主题

98

回帖

110

积分

初级会员

积分
110
发表于 2021-11-25 16:04:41 | 显示全部楼层
main函数之前初始化数据时因为没有配置SDRAM,出现错误。这个方法只是适合bss数据,而且应该在MPU配置后手动置零变量。应该参考STM32H743I-EVAL\Examples\FMC\FMC_SDRAM_DataMemory。
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
111540
QQ
发表于 2021-11-25 16:20:53 | 显示全部楼层
turnip 发表于 2021-11-25 16:04
main函数之前初始化数据时因为没有配置SDRAM,出现错误。这个方法只是适合bss数据,而且应该在MPU配置后手 ...

对这种方法是最好的,就是配置太麻烦了,是ST是倒腾了个寄存器配置。不方便普及。
当前普及的方法也很好用。
回复

使用道具 举报

0

主题

244

回帖

244

积分

高级会员

积分
244
发表于 2021-11-25 20:08:17 | 显示全部楼层
这个图是ST的启动文件,一个s(汇编),一个是c文件,名称一般是startup_stm32XXXXX.s和system_stm32XXXXX.c。
启动的时候第一件事是初始化必要的外设,就是从S文件调用C文件的函数,这里如果定义了相对应的宏,启用外部SDRAM,
那么就会初始化外部SDRAM,这样就可以直接把变量定义在SDRAM的区域了。
ST这里的启动过程就是先初始化必要的外设,再执行软件的初始化(包括RW数据和零初始化的数据)。
startup.png
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
111540
QQ
发表于 2021-11-25 22:39:12 | 显示全部楼层
regbbs 发表于 2021-11-25 20:08
这个图是ST的启动文件,一个s(汇编),一个是c文件,名称一般是startup_stm32XXXXX.s和system_stm32XXXXX.c ...

他这个通用性差,是寄存器配置的。所以没什么人用,没普及起来。
回复

使用道具 举报

8

主题

52

回帖

76

积分

初级会员

积分
76
发表于 2022-1-5 16:10:49 | 显示全部楼层
eric2013 发表于 2021-11-25 22:39
他这个通用性差,是寄存器配置的。所以没什么人用,没普及起来。

因为数据量较大,我将很多变量直接定义在了SDRAM。
1)SystemInit()里配置了时钟、外部SDRAM。
2)sct里定义了SDRAM段。
3)变量定义声明了SDRAM段。
但是,奇怪的是,有些地方正常使用,有些地方使用立即进入异常中断。
成功的例子:USBX里无论是堆栈,还是变量,都定义在SDRAM里,运行下来都OK,与SRAM一样。
失败的例子:在FILEX里,就是不能用SDRAM,一旦使用,运行就不正常。有时不能设置路径,有些不能建议文件,有时写文件失败。而将SDRAM改为AXISRAM,所有故障都消失了。
我将SD卡测试、SDRAM测试都重运行,发现测试都OK。但是在SDRAM测试尾部加了一个strcat,立即进入异常中断。


1.png
2.png
3.png
4.png
5.png
回复

使用道具 举报

8

主题

52

回帖

76

积分

初级会员

积分
76
发表于 2022-1-5 21:45:35 | 显示全部楼层
找到问题了,哎,真是想多了。心里还是有点虚,不知道是不是这个原因。
之前,测试10次,总有8、9次都是错了,偶尔对一次。
现在测试了100多次,都是正确的。
str_cat改回strcat也ok了。

在申请内存的时候,用的是一个指针变量 data,实际使用的是另一个指针变量 file,但用之前是赋值过的 file = data。
data的值是0xd0000000+,是SDRAM内存,但出错的时候,file的值是0x24000000+,是AXISRAM内存。
用单步测试,file的值就是0xd0000000,但全速运行,出错的时候停下来,发现file是0x24000000+。
真不知道为什么错?编译的问题???不敢这样想呀。。。
是不是我进入一个盲区了
看下面两个图
1.png
2.png
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-1 07:23 , Processed in 0.346387 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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