对.Net Micro Framework系统来说,正常情况下Flash(包括NandFlash和NORFlash)分为六个区,分别为:
1、 BLOCKTYPE_BOOTSTRAP(存放启动代码,一般为TinyBooter)
2、 BLOCKTYPE_CONFIG(配置区,存放配置信息)
3、 BLOCKTYPE_CODE(本地代码区,指TinyCLR代码)
4、 BLOCKTYPE_DEPLOYMENT(托管代码区,存放用户的C#程序)
5、 BLOCKTYPE_STORAGE_A(用户数据存储区)
6、 BLOCKTYPE_FILESYSTEM(文件系统)
其中2、3、4项为.Net Micro Framework系统所必须。
如果Flash为NandFlash,则存放在BLOCKTYPE_BOOTSTRAP区的启动代码是无法直接执行的,系统必须在ROM、NORFlash或其它线性执行存储区存放一个Bootload,由该Bootload加载TinyBooter,然后由TinyBooter引导TinyCLR启动(当然如果空间允许,TinyBooter也可以放在NORFlash,直接运行来引导TinyCLR,或Bootload直接引导TinyCLR也是可以的)。
TinyCLR一般常见大小为700k左右,其实也可以放在NORFlash中,不需要TinyBooter而直接运行,不过这样就不方便用MFDeploy对TinyCLR进行升级了。
常见的MF系统,TinyBooter启动后一般把TinyCLR从NandFlash拷贝到RAM中,TinyCLR实际是在RAM中执行的。这就需要RAM的大小至少要大于TinyCLR的大小,加上堆和栈的大小,理想的RAM大小至少要大于2M。
EM-STM3210E开发板上的Flash含四部分,片内Flash 512k(系统Flash2k,存放系统Bootload,不能更改,ISP功能就是由该Bootload来支持的),2M NOR Flash,8M SPI Flash,128Mb(16M字节) NandFlash。
Flash相对比较丰富,但是RAM资源却有些不足,片内含64K RAM,片外扩展了128KB SRAM。由于RAM相对偏小,所以TinyCLR的代码是不可能拷贝到RAM中执行的,如果TinyCLR达到常见大小,则片内用户FLASH也是放不下的,也只有放到2M的 NOR Flash中去了。不过我们这次Porting的.Net Micro Framework仅是最小集,TinyCLR大概250K左右,此外TinyBooter对我们也不是必须的,我们通过ISP方式下载TinyCLR。
NORFlash和SPI Flash对我们来说不必要,仅需实现NandFlash即可,Flash的型号为ST NAND128W3A2BNb,最终的NandFlash分区如下:
const BlockRange g_NandFlash_BlockStatus[] =
{
{ BlockRange::BLOCKTYPE_CONFIG , 0, 7 }, //128K
{ BlockRange::BLOCKTYPE_DEPLOYMENT, 8, 47 }, //640K
{ BlockRange::BLOCKTYPE_DEPLOYMENT, 48, 87 },
{ BlockRange::BLOCKTYPE_DEPLOYMENT, 128, 167 },
{ BlockRange::BLOCKTYPE_DEPLOYMENT, 208, 247 },
{ BlockRange::BLOCKTYPE_DEPLOYMENT, 288, 327 },
{ BlockRange::BLOCKTYPE_DEPLOYMENT, 328, 1007 },
{ BlockRange::BLOCKTYPE_STORAGE_A , 1008,1015 },
{ BlockRange::BLOCKTYPE_STORAGE_B , 1016,1023 },
};
我们的NandFlash驱动不要放在/DeviceCode/Targets/Native/CortexM3/DeviceCode目录,因为不同的开发板虽然采用STM32系列的CPU,但是外围的Flash有可能型号不同,该NandFlash驱动要放在/Solutions/STM3210E/DeviceCode的目录,这样安排比较合理。
我们在该目录下创建Blockstorage目录,下有两个子目录addDevices和NandFlash,NandFlash目录放NandFlash驱动代码和配置信息,addDevices目录下的代码比较简单,就是把实现的NandFlash驱动加载到BlockStorageList中去,相关代码如下:
void BlockStorage_AddDevices()
{
BlockStorageList::AddDevice( &g_NandFlash_BS, &g_NandFlash_BS_DeviceTable, &g_NandFlash_BS_Config, FALSE );
}
NandFlash的配置文件中主要的内容就是我们上面提到的const BlockRange g_NandFlash_BlockStatus[],此外还要根据NandFlash的实际参数,填写一些宏。
#define FLASH_MANUFACTURER_CODE 0x20
#define FLASH_DEVICE_CODE 0x73
#define FLASH_BASE_ADDRESS 0x00000000
#define FLASH_SIZE 0x01000000 //16M 128Mbit
#define FLASH_BLOCK_COUNT 1024
#define FLASH_SECTOR_PER_BLOCK 32
#define FLASH_SECTOR_SIZE 512
#define FLASH_BLOCK_SIZE FLASH_SECTOR_PER_BLOCK*FLASH_SECTOR_SIZE
… …
NandFlash驱动是核心内容,我们知道Cortex-M3平台下无论是访问SRAM还是NandFlash (或NandFlash、SD卡等)都是要通过FSMC实现,所以这里要编写NandFlash之前,一定要先配置好FSMC寄存器,配置好之后,其Flash 驱动代码和普通的ARM7或ARM9下NandFlash驱动类似。-->
- 该日志由 burglary 于11年前发表在综合分类下,最后更新于 2013年10月23日.
- 转载请注明: 【.Net Micro Framework PortingKit – 11】NandFlash驱动开发 | 学步园 +复制链接