使用SDRAM之后,SDRAM可能当做数据区来使用。如果采用了分散加载文件的方式,SDRAM要是被划分为数据区,在调用main函数之前必须进行初始化。否则会出现HardFault_Handler。因为使用到了SDRAM中的地址,而此时SDRAM还没有初始化,因此出现地址越界。可以在启动代码中初始化:
Reset_Handler PROC
EXPORT Reset_Handler [WEAK]
IMPORT SystemInit
IMPORT __low_level_init
IMPORT __main
LDR R0, =SystemInit
BLX R0
LDR R0, =__low_level_init
BLX R0
LDR R0, =__main
BX R0
ENDP
Reset_Handler PROC
EXPORT Reset_Handler [WEAK]
IMPORT SystemInit
IMPORT __low_level_init
IMPORT __main
LDR R0, =SystemInit
BLX R0
LDR R0, =__low_level_init
BLX R0
LDR R0, =__main
BX R0
ENDP
在__low_level_init中调用EMC_Init()初始化SDRAM。