在本书的《MDK编译过程及文件类型全解》章节将会讲解使用更简单的方法从SDRAM中分配变量,以及使用C语言标准库的malloc函数来分配SDRAM的空间,更有效地进行内存管理。使用指针的方式访问SDRAM存储器,完成初始化SDRAM后,我们就可以利用它存储数据了,由于SDRAM的存储空间是被映射到内核的寻址区域的,我们可以通过映射的地址直接访问SDRAM,访问这些地址时,FMC外设自动读写SDRAM,程序上无需额外操作。
通过地址访问内存,最直接的方式就是使用C语言的指针方式了:
/SDRAM起始地址存储空间2的起始地址/
#define SDRAM_BANK_ADDR ((uint32_t)0xD0000000) /SDRAM大小,8M字节/
#define IS42S16400J_SIZE 0x800000
uint32_t temp;
( uint8_t) (SDRAM_BANK_ADDR ) = (uint8_t)0xAA; /向SDRAM写入8位数据/
temp = ( uint8_t) (SDRAM_BANK_ADDR ); /从SDRAM读取数据/
( uint16_t) (SDRAM_BANK_ADDR+10 ) = (uint16_t)0xBBBB;/写/读 16位数据/
temp = ( uint16_t) (SDRAM_BANK_ADDR+10 );
( uint32_t) (SDRAM_BANK_ADDR+20 ) = (uint32_t)0xCCCCCCCC;/写/读 32位数据/
temp = ( uint32_t) (SDRAM_BANK_ADDR+20 );
为方便使用,代码中首先定义了宏SDRAM_BANK_ADDR表示SDRAM的起始地址,该地址即FMC映射的存储区域2的首地址;宏IS42S16400J_SIZE表示SDRAM的大小,所以从地址(SDRAM_BANK_ADDR)到(SDRAM_BANK_ADDR+IS42S16400J_SIZE)都表示在SDRAM的存储空间,访问这些地址,直接就能访问SDRAM。
配合这些宏,使用指针的强制转换以及取指针操作即可读写SDRAM的数据,使用上跟普通的变量无异。
直接指定变量存储到SDRAM空间,每次存取数据都使用指针来访问太麻烦了,为了简化操作,可以直接指定变量存储到SDRAM空间.
#define SDRAM_BANK_ADDR ((uint32_t)0xD0000000) /SDRAM起始地址存储空间2的起始地址/
uint8_t testValue attribute((at(SDRAM_BANK_ADDR)));/绝对定位方式访问SDRAM,这种方式必须定义成全局变量/
testValue = 0xDD;
这种方式使用关键字"attribute((at()))"来指定变量的地址,代码中指定testValue存储到SDRAM的起始地址,从而实现把变量存储到SDRAM上。要注意使用这种方法定义变量时,必须在函数外把它定义成全局变量,才可以存储到指定地址上。
更常见的是利用这种方法定义一个很大的数组,整个数组都指定到SDRAM地址上,然后就像使用malloc函数一样,用户自定义一些内存管理函数,动态地使用SDRAM的内存,我们在使用emWin写GUI应用的时候就是这样做的。
更多回帖