【.Net Micro Framework PortingKit – 11】NandFlash驱动开发

简介:

对.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分区如下:

 
  1. const BlockRange g_NandFlash_BlockStatus[] =  
  2.  
  3. {  
  4.  
  5.     { BlockRange::BLOCKTYPE_CONFIG    ,   0,   7 },  //128K  
  6.  
  7.     { BlockRange::BLOCKTYPE_DEPLOYMENT,   8,  47 },  //640K   
  8.  
  9.     { BlockRange::BLOCKTYPE_DEPLOYMENT,  48,  87 },  
  10.  
  11.     { BlockRange::BLOCKTYPE_DEPLOYMENT, 128, 167 },  
  12.  
  13.     { BlockRange::BLOCKTYPE_DEPLOYMENT, 208, 247 },  
  14.  
  15.     { BlockRange::BLOCKTYPE_DEPLOYMENT, 288, 327 },  
  16.  
  17.     { BlockRange::BLOCKTYPE_DEPLOYMENT, 328, 1007 },  
  18.  
  19.     { BlockRange::BLOCKTYPE_STORAGE_A , 1008,1015 },  
  20.  
  21.     { BlockRange::BLOCKTYPE_STORAGE_B , 1016,1023 },  
  22.  
  23. };  
  24.  

我们的NandFlash驱动不要放在\DeviceCode\Targets\Native\CortexM3\DeviceCode目录,因为不同的开发板虽然采用STM32系列的CPU,但是外围的Flash有可能型号不同,该NandFlash驱动要放在\Solutions\STM3210E\DeviceCode的目录,这样安排比较合理。

我们在该目录下创建Blockstorage目录,下有两个子目录addDevices和NandFlash,NandFlash目录放NandFlash驱动代码和配置信息,addDevices目录下的代码比较简单,就是把实现的NandFlash驱动加载到BlockStorageList中去,相关代码如下:

 
  1. void BlockStorage_AddDevices()  
  2.  
  3. {  
  4.  
  5.     BlockStorageList::AddDevice( &g_NandFlash_BS, &g_NandFlash_BS_DeviceTable, &g_NandFlash_BS_Config, FALSE );  
  6.  
  7. }  
  8.  

NandFlash的配置文件中主要的内容就是我们上面提到的const BlockRange g_NandFlash_BlockStatus[],此外还要根据NandFlash的实际参数,填写一些宏。

 
  1. #define FLASH_MANUFACTURER_CODE                 0x20  
  2.  
  3. #define FLASH_DEVICE_CODE                       0x73  
  4.  
  5. #define FLASH_BASE_ADDRESS                      0x00000000  
  6.  
  7. #define FLASH_SIZE                              0x01000000  //16M  128Mbit  
  8.  
  9. #define FLASH_BLOCK_COUNT                       1024          
  10.  
  11. #define FLASH_SECTOR_PER_BLOCK                  32   
  12.  
  13. #define FLASH_SECTOR_SIZE                       512  
  14.  
  15. #define FLASH_BLOCK_SIZE                        FLASH_SECTOR_PER_BLOCK*FLASH_SECTOR_SIZE  
  16.  
  17. … …  
  18.  

NandFlash驱动是核心内容,我们知道Cortex-M3平台下无论是访问SRAM还是NandFlash (或NandFlash、SD卡等)都是要通过FSMC实现,所以这里要编写NandFlash之前,一定要先配置好FSMC寄存器,配置好之后,其Flash 驱动代码和普通的ARM7或ARM9下NandFlash驱动类似。

具体的代码这里不列举了,可以参考EM-STM3210E开发板的示例代码,不过这里需要说明的是,地址部分四个字节,其中一个字节表示扇区偏移,三个字节表示扇区地址。但是我们的扇区(页)大小为512+16个字节,一个字节无法表示0~511的偏移,这个问题在示例代码中找不到答案,只能看相关手册了。

其实一个扇区(页)分三部分,A、B、C,A为扇区前256字节,B为扇区下个256字节,C区为16字节。所以下面的代码就能实现0~511的扇区偏移。

 
  1. WriteCommand(offset<256 ? COMMAND_AREA_A : COMMAND_AREA_B);  
  2.  
  3. WriteCommand(COMMAND_READ_1);  
  4.  
  5. WriteAddress(offset & 0xFF);  
  6.  
  7. WriteAddress((StartSector >>  0) & 0xFF);  
  8.  
  9. WriteAddress((StartSector >>  8) & 0xFF);  
  10.  
  11. WriteAddress((StartSector >> 16) & 0xFF);    
  12.  

此外还要说明的是,该Flash的擦写是以Block为边界的,这和一般的NandFlash以扇区为边界不同,但是擦写单位都为一个Block,这是相同的。所以这部分代码在Porting时要和以前平台的驱动要有些区别。

在NativeSample.proj文件中添加如下条目,就可以测试我们的NandFlash代码了。

 
  1. <ItemGroup> 
  2.  
  3.     <RequiredProjects Include="$(SPOCLIENT)\Solutions\Stm3210e\DeviceCode\Blockstorage\addDevices\dotNetMF.proj" /> 
  4.  
  5.     <DriverLibs Include="BlockStorage_AddDevices_NandFlash.$(LIB_EXT)" /> 
  6.  
  7.   </ItemGroup> 
  8.  
  9.   <ItemGroup> 
  10.  
  11.     <RequiredProjects Include="$(SPOCLIENT)\Solutions\Stm3210e\DeviceCode\Blockstorage\NandFlash\Driver\dotNetMF.proj" /> 
  12.  
  13.     <DriverLibs Include="NandFlash_BL.$(LIB_EXT)" /> 
  14.  
  15.   </ItemGroup> 
  16.  
  17.    <ItemGroup> 
  18.  
  19.     <RequiredProjects Include="$(SPOCLIENT)\Solutions\Stm3210e\DeviceCode\Blockstorage\NandFlash\Config\dotNetMF.proj" /> 
  20.  
  21.     <DriverLibs Include="NandFlash_BL_Config.$(LIB_EXT)" /> 
  22.  
  23.   </ItemGroup> 
  24.  
  25. NativeSample.cpp中的测试代码如下:  
  26.  
  27. BlockStorageDevice *deviceBlockStorageList::GetFirstDevice();      
  28.  
  29.      if(device!=NULL)  
  30.  
  31.      {          
  32.  
  33.         UINT8 bytRetdevice->EraseBlock(0x0);   //0x20000        
  34.  
  35.            debug_printf("EraseBlock:%s\r\n",bytRet? "OK":"ERROR");  
  36.  
  37.              
  38.  
  39.            BYTE bytWriteData[10];  
  40.  
  41.            for(int i=0;i<10;i++)  bytWriteData[i]=(BYTE)(i % 256);  
  42.  
  43.              
  44.  
  45.            bytRet=device->Write(10,10,bytWriteData,FALSE);  
  46.  
  47.            debug_printf("Write:%s\r\n",bytRet? "OK":"ERROR");  
  48.  
  49.    
  50.  
  51.            bytRet=device->Write(30,10,bytWriteData,FALSE);  
  52.  
  53.            debug_printf("Write:%s\r\n",bytRet? "OK":"ERROR");  
  54.  
  55.    
  56.  
  57.            bytRet=device->Write(513,10,bytWriteData,FALSE);  
  58.  
  59.            debug_printf("Write:%s\r\n",bytRet? "OK":"ERROR");  
  60.  
  61.                   
  62.  
  63.          BYTE bytReadData[1024];  
  64.  
  65.            bytRet=device->Read(5,1024,bytReadData);  
  66.  
  67.            debug_printf("Read:%s\r\n",bytRet? "OK":"ERROR");                   }  
  68.  

好了,NandFlash驱动我们编写完毕,下一篇将介绍SysTick驱动的实现。

 








本文转自yefanqiu51CTO博客,原文链接:http://blog.51cto.com/yfsoft/321222,如需转载请自行联系原作者

相关实践学习
基于EBS部署高性能的MySQL服务
如果您通常是通过ECS实例部署MySQL来使用数据库服务,您可以参考本实验操作来搭建高性能的MySQL服务。本实验为您演示如何通过EBS ESSD云盘部署一个高性能的MySQL服务。
相关文章
|
内存技术 移动开发
【.Net Micro Framework PortingKit–11】NandFlash驱动开发
对.Net Micro Framework系统来说,正常情况下Flash(包括NandFlash和NORFlash)分为六个区
602 0
【.Net Micro Framework PortingKit – 12】SysTick驱动开发
SysTick驱动有三个功用,一是我们上面所说的多任务和多线程支持;二是获得系统当前Tick,以此实现延时等待
614 0
【.Net Micro Framework PortingKit – 13】LCD驱动开发
LCD的驱动开发还是比较繁琐一些的,因为LCD的驱动代码分散在三个目录中(题外话,我觉得针对.Net Micro Framework来说,最难的驱动是网卡驱动(特别是wifi驱动)、其次是USB驱动,和它们相比,LCD驱动就是小菜了)
739 0
.Net Micro Framework研究—Digi开发板初探
写的比较基础全面,由于我们北航的研发团队先研究了Digi的开发板,所以直到今天Digi开发板才到我的手上,我的《Micro Framework研究》系列文章以后也会陆续推出
706 0
|
.NET 开发框架 内存技术
【.Net Micro Framework PortingKit – 14】TinyCLR编译与测试
由于TinyCLR的相关代码与硬件无关,我们所做的就是根据实际需要,添加不同的Feature,此外就是合理配置堆栈和代码存储位置。
1830 0
【.Net Micro Framework PortingKit - 07】NVIC中断处理
Cortex-M3的中断架构和以往的ARM7、ARM9、ARM11有了很大的区别,IRQ、FIQ的概念的已经消失,随之而来的是NVIC中断管理(支持最多256个中断优先级,128级抢断)及中断向量表
605 0
|
Windows
在Corex-M3开发板上移植.Net Micro Framework系列文章
.NET Micro Framework 将 .NET 的可靠性和效率与 Visual Studio&reg; 的高生产率结合起来,以针对价格较低、资源受限的小型设备开发应用程序,可帮助人们使用熟悉的 Visual Studio 工具来构建托管的嵌入式应用程序。
619 0
|
芯片
再谈.NET Micro Framework移植
从代码角度来说,不仅STM32F103的移植代码在不断完善,并且也已经移植和优化了基于STM32F207和STM32F407的相关代码。从硬件角度来说,也由最初完全借助第三方的硬件作为.NET Micro Framework开发板,演变为今天推出自行设计的开发板和物联网产品。
620 0
【.Net Micro Framework PortingKit(补) – 1】USB驱动开发
USB接口支持8个端点,数据传输支持三种模式:DMA、双缓冲、单缓冲,简单期间,我仅实现了单缓冲模式。首先,我们需要声明USB寄存器相对应的结构体,以期方便操作相关的寄存器。
611 0
|
物联网 芯片
Zigbee在.Net Micro Framework系统中的应用
Zigbee是IEEE 802.15.4协议的代名词。根据这个协议规定的技术是一种短距离、低功耗的无线通信技术。这一名称来源于蜜蜂的八字舞,由于蜜蜂(bee)是靠飞翔和“嗡嗡”(zig)地抖动翅膀的“舞蹈”来与同伴传递花粉所在方位信息,也就是说蜜蜂依靠这样的方式构成了群体中的通信网络。
796 0