硬汉嵌入式论坛

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

[开发工具] __iar_data_init3问题

[复制链接]

24

主题

70

回帖

142

积分

初级会员

积分
142
发表于 2020-12-21 14:10:39 | 显示全部楼层 |阅读模式
STM32H743,环境为IAR,程序采用XIP方式,程序在QSPI中。(1).readwrite 数据运行地址在内部SRAM中,__iar_data_init3将.readwrite 数据从QSPI中拷贝到内部SRAM中没有问题,程序可正常执行,其它分配在SDRAM中的数据可正常读写。  

define symbol __ICFEDIT_intvec_start__ = 0x90000000;
/*-Memory Regions-*/
define symbol __ICFEDIT_region_ROM_start__ = 0x90000000;
define symbol __ICFEDIT_region_ROM_end__   = 0x97FFFFFF;
define symbol __ICFEDIT_region_RAM_start__ = 0x24000000;
define symbol __ICFEDIT_region_RAM_end__   = 0x2407FFFF;

/*-Sizes-*/
define symbol __ICFEDIT_size_cstack__ = 0x2000;
define symbol __ICFEDIT_size_heap__   = 0x2000;
/**** End of ICF editor section. ###ICF###*/

define memory mem with size = 4G;
define region ROM_region      = mem:[from __ICFEDIT_region_ROM_start__   to __ICFEDIT_region_ROM_end__];
define region RAM_region      = mem:[from __ICFEDIT_region_RAM_start__   to __ICFEDIT_region_RAM_end__];

define block CSTACK    with alignment = 8, size = __ICFEDIT_size_cstack__   { };
define block HEAP      with alignment = 8, size = __ICFEDIT_size_heap__     { };

initialize by copy { readwrite };
do not initialize  { section .noinit};

place at address mem:__ICFEDIT_intvec_start__ { readonly section .intvec };

place in ROM_region   { readonly };

place in RAM_region   { readwrite, block CSTACK, block HEAP };





(2).readwrite 数据运行地址在SDRAM中,__iar_data_init3将.readwrite 数据从SPI中拷贝到SDRAM中出现HardFault_Handler。请问下是什么原因?


define symbol __ICFEDIT_intvec_start__ = 0x90000000;
/*-Memory Regions-*/
define symbol __ICFEDIT_region_ROM_start__ = 0x90000000;
define symbol __ICFEDIT_region_ROM_end__   = 0x97FFFFFF;
define symbol __ICFEDIT_region_RAM_start__ = 0xC0000000;
define symbol __ICFEDIT_region_RAM_end__   = 0xC07FFFFF;;

/*-Sizes-*/
define symbol __ICFEDIT_size_cstack__ = 0x2000;
define symbol __ICFEDIT_size_heap__   = 0x2000;
/**** End of ICF editor section. ###ICF###*/

define memory mem with size = 4G;
define region ROM_region      = mem:[from __ICFEDIT_region_ROM_start__   to __ICFEDIT_region_ROM_end__];
define region RAM_region      = mem:[from __ICFEDIT_region_RAM_start__   to __ICFEDIT_region_RAM_end__];

define block CSTACK    with alignment = 8, size = __ICFEDIT_size_cstack__   { };
define block HEAP      with alignment = 8, size = __ICFEDIT_size_heap__     { };

initialize by copy { readwrite };
do not initialize  { section .noinit};

place at address mem:__ICFEDIT_intvec_start__ { readonly section .intvec };

place in ROM_region   { readonly };

place in RAM_region   { readwrite, block CSTACK, block HEAP };



回复

使用道具 举报

14

主题

232

回帖

274

积分

高级会员

积分
274
发表于 2020-12-21 17:55:54 | 显示全部楼层
我记得好像是__iar_data_init3运行的时候SDRAM还没有初始化?所以你这时候去读数据,必然会出现错误。
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
111540
QQ
发表于 2020-12-22 09:57:12 | 显示全部楼层
可供参考

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

回复

使用道具 举报

14

主题

232

回帖

274

积分

高级会员

积分
274
发表于 2020-12-22 13:24:07 | 显示全部楼层
eric2013 发表于 2020-12-22 09:57
可供参考

像使用内部SRAM一样定义使用STM32H7的外部SDRAM,含MDK和IAR两版

V3.0版本的教程中,没看到怎么使用SDRAM,但是在源码中看到了实现方法。但是你实现的也是在main起来以后,初始化完SDRAM以后使用的。楼主的_iar_data_init3,是在跳转到main之前的操作,所以我认为应该是SDRAM没有初始化造成的。
回复

使用道具 举报

24

主题

70

回帖

142

积分

初级会员

积分
142
 楼主| 发表于 2020-12-22 15:35:19 | 显示全部楼层
哦,有一点我没说清楚,SDRAM我在boot程序中已经初始化了,然后再从boot跳转到APP程序,我觉得APP程序应该是不用再次初始化SDRAM的。
硬汉提供的方法确实可行,上面说的方式1就是按这个做的,主要是有两点不太好的地方:(1)所有分配到sdram的变量都要加#pragma location = ".RAM_SDRAM"  (2)必须保证这些变量是do not initialize,那么对sdram中的全局变量在编译时赋予的初始值是没用的。 类似以下是不可行的#pragma location = ".RAM_SDRAM"   static int  iyyy=3; 要命的是以前的代码有很多这样赋初值的。
基于以上两点,我就把所有的变量全部分配到sdram中,但是IAR开始阶段把readwrite数据从QSPI拷贝到sdram时碰到了__iar_data_init3异常。
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
111540
QQ
发表于 2020-12-23 09:13:12 | 显示全部楼层
zhang0352505 发表于 2020-12-22 13:24
V3.0版本的教程中,没看到怎么使用SDRAM,但是在源码中看到了实现方法。但是你实现的也是在main起来以后 ...

SDRAM的这个玩法是应网友要求专门做了个。

这个可以设置do not initialize  { section .RAM_SDRAM };
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
111540
QQ
发表于 2020-12-23 09:16:11 | 显示全部楼层
utyang 发表于 2020-12-22 15:35
哦,有一点我没说清楚,SDRAM我在boot程序中已经初始化了,然后再从boot跳转到APP程序,我觉得APP程序应该 ...

boot中设计好了,APP里面可以不加。

这时就要特别注意你的APP程序设计了。比如那个SystemInit是不是又调用了一遍,这个会复位RCC。
回复

使用道具 举报

24

主题

70

回帖

142

积分

初级会员

积分
142
 楼主| 发表于 2020-12-23 13:10:38 | 显示全部楼层
@硬汉,谢谢,你提醒我了,因为APP程序的system_stm32h7xx.c是CUBEMX自动生成的,需要在SystemInit()这里对SDRAM做一下处理。
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-1 07:36 , Processed in 0.308934 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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