|
使用SDRAM时执行完GUI_X_Config函数,在跳出该函数时,进入硬件异常HardFault_Handler,使用内部ram没有问题;外部sDram单独使用时没有问题,下面是部分代码,请高手指点:
#define EX_SRAM 1/*1 used extern sram, 0 used internal sram */
#if EX_SRAM
#define GUI_NUMBYTES (1024*1024*2)
#else
#define GUI_NUMBYTES (140*1024)
#endif
/* Define the average block size */
#define GUI_BLOCKSIZE 5000//0x80
/*SDRAM起始地址 存储空间2的起始地址*/
#define SDRAM_BANK_ADDR ((unsigned int)0xD0000000)
#define EXT_SDRAM_SIZE (8 * 1024 * 1024)
#define EXT_SDRAM_ADDR SDRAM_BANK_ADDR
/* LCD显存, 图层1, 分配2M字节 */
#define SDRAM_LCD_BUF1 SDRAM_BANK_ADDR
/* LCD显存, 图层2, 分配2M字节 */
#define SDRAM_LCD_BUF2 (SDRAM_LCD_BUF1 + 2 * 1024 * 1024)
/* emWin动态内存首地址 emWin动态内存使用,除了显存使用的8MB,后8MB给动态内存使用 */
#define SDRAM_APP_BUF (SDRAM_LCD_BUF2 + 2 * 1024 * 1024)
void GUI_X_Config(void)
{
#if EX_SRAM
//static U32 *aMemory;
//aMemory = (U32 *)SDRAM_APP_BUF;
static U32 aMemory[GUI_NUMBYTES / 4] __attribute__((at(SDRAM_APP_BUF)));
/* Assign memory to emWin */
GUI_ALLOC_AssignMemory(aMemory, GUI_NUMBYTES);
GUI_ALLOC_SetAvBlockSize(GUI_BLOCKSIZE);
#else
/* 32 bit aligned memory area */
static U32 aMemory[GUI_NUMBYTES / 4];
/* Assign memory to emWin */
GUI_ALLOC_AssignMemory(aMemory, GUI_NUMBYTES);
GUI_ALLOC_SetAvBlockSize(GUI_BLOCKSIZE);
#endif
}
下面时SDram的测试程序(可以写入也可读取):
#define testValue ((unsigned short *)0xD0000000)
void sdram_read_write_test(void)
{
unsigned short i = 0;
for(i = 0; i< 1000; i++)
{
testValue[i] = i;
}
memcpy(testbuff, (unsigned int *)testValue, sizeof(testbuff));
memset(testValue, 0, 0x800000);
i = 0;
}
请高手指点迷津。
|
|