硬汉嵌入式论坛

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

[FMC] STM32H750 第49章使用ICF定义变量时进入HARDFAULT及其解决方法

[复制链接]

5

主题

7

回帖

22

积分

新手上路

积分
22
发表于 2022-8-18 16:46:40 | 显示全部楼层 |阅读模式
我使用IAR 9.30.1 编了一个程序在STM32H750里运行。这个程序用于校验能否使用ICF来定义一个存在SDRAM里变量
ICF大致如下
define symbol __ICFEDIT_region_SDRAM2BANK1_start__    = 0xC0000000;
define symbol __ICFEDIT_region_SDRAM2BANK1_end__     = 0xC001F400;

define region SDRAM2BANK1_region = mem:[from __ICFEDIT_region_SDRAM2BANK1_start__ to __ICFEDIT_region_SDRAM2BANK1_end__];
place in SDRAM2BANK1_region { section .SDRAM2BANK1 };

C中如下:
#pragma location = ".SDRAM2BANK1"
uint32_t G_DataInSdram[128];


int main(void)
{

     bsp_Init();                /* 硬件初始化 */

    for( int i = 0 ; i < 128 ; i ++ ){
      G_DataInSdram[i] = i;
    }


   while(1);
}
确定MPU无误后烧写调试,发现还没进main函数就hardfault了。

解决方法:
在ICF中添加 do not initialize  { section .SDRAM2BANK1 };

猜想:
如果不定义 do not initialize ,linker会在main之前自动为G_DataInSdram做初始化。
但是此时FMC还未被投入使用,也就是说这是在往MCU中一块reserve的内存区中定义变量。所以报hardfault
如果显示要求linkerbu初始化改变量,直到FMC启动后再手动初始化。此时MCU可以通过FMC访问到这块内存。故不报HARDFAULT

不知道怎么查证,纯属猜想哈

回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
111540
QQ
发表于 2022-8-19 09:30:37 | 显示全部楼层
是的,这个有例子。

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

使用道具 举报

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

本版积分规则

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

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

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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