我使用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 };
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