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

简介: 对.Net Micro Framework系统来说,正常情况下Flash(包括NandFlash和NORFlash)分为六个区

对.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驱动类似。

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

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

WriteCommand(offset<256 ? COMMAND_AREA_A : COMMAND_AREA_B);

WriteCommand(COMMAND_READ_1);

WriteAddress(offset & 0xFF);

WriteAddress((StartSector >>  0) & 0xFF);

WriteAddress((StartSector >>  8) & 0xFF);

WriteAddress((StartSector >> 16) & 0xFF); 

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

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

<ItemGroup>

    <RequiredProjects Include="$(SPOCLIENT)/Solutions/Stm3210e/DeviceCode/Blockstorage/addDevices/dotNetMF.proj" />

    <DriverLibs Include="BlockStorage_AddDevices_NandFlash.$(LIB_EXT)" />

  </ItemGroup>

  <ItemGroup>

    <RequiredProjects Include="$(SPOCLIENT)/Solutions/Stm3210e/DeviceCode/Blockstorage/NandFlash/Driver/dotNetMF.proj" />

    <DriverLibs Include="NandFlash_BL.$(LIB_EXT)" />

  </ItemGroup>

   <ItemGroup>

    <RequiredProjects Include="$(SPOCLIENT)/Solutions/Stm3210e/DeviceCode/Blockstorage/NandFlash/Config/dotNetMF.proj" />

    <DriverLibs Include="NandFlash_BL_Config.$(LIB_EXT)" />

  </ItemGroup>

NativeSample.cpp中的测试代码如下:

BlockStorageDevice *device= BlockStorageList::GetFirstDevice();   

     if(device!=NULL)

     {       

        UINT8 bytRet= device->EraseBlock(0x0);   //0x20000     

           debug_printf("EraseBlock:%s/r/n",bytRet? "OK":"ERROR");

          

           BYTE bytWriteData[10];

           for(int i=0;i<10;i++)  bytWriteData[i]=(BYTE)(i % 256);

          

           bytRet=device->Write(10,10,bytWriteData,FALSE);

           debug_printf("Write:%s/r/n",bytRet? "OK":"ERROR");

 

           bytRet=device->Write(30,10,bytWriteData,FALSE);

           debug_printf("Write:%s/r/n",bytRet? "OK":"ERROR");

 

           bytRet=device->Write(513,10,bytWriteData,FALSE);

           debug_printf("Write:%s/r/n",bytRet? "OK":"ERROR");

               

         BYTE bytReadData[1024];

           bytRet=device->Read(5,1024,bytReadData);

           debug_printf("Read:%s/r/n",bytRet? "OK":"ERROR");                   }

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

相关实践学习
基于EBS部署高性能的MySQL服务
如果您通常是通过ECS实例部署MySQL来使用数据库服务,您可以参考本实验操作来搭建高性能的MySQL服务。本实验为您演示如何通过EBS ESSD云盘部署一个高性能的MySQL服务。
相关文章
|
8天前
|
开发框架 JavaScript 前端开发
分享7个.NET开源、功能强大的快速开发框架
分享7个.NET开源、功能强大的快速开发框架
|
15天前
|
开发框架 .NET C#
使用C#进行.NET框架开发:深入探索与实战
【5月更文挑战第28天】本文探讨了C#在.NET框架中的应用,展示了其作为强大编程语言的特性,如类型安全、面向对象编程。C#与.NET框架的结合,提供了一站式的开发环境,支持跨平台应用。文中介绍了C#的基础知识,如数据类型、控制结构和面向对象编程,以及.NET的关键技术,包括LINQ、ASP.NET和WPF。通过一个实战案例,展示了如何使用C#和ASP.NET开发Web应用,包括项目创建、数据库设计、模型和控制器编写,以及视图和路由配置。本文旨在揭示C#在.NET开发中的深度和广度,激发开发者探索更多可能性。
|
29天前
|
数据挖掘 定位技术
.NET Compact Framework下的GPS NMEA data数据分析(二)转
.NET Compact Framework下的GPS NMEA data数据分析(二)转
15 0
|
29天前
|
SQL Windows
保姆级:Windows Server 2012上安装.NET Framework 3.5
保姆级:Windows Server 2012上安装.NET Framework 3.5
|
29天前
|
人工智能 量子技术 C#
【专栏】.NET 开发:开启数字化新时代
【4月更文挑战第29天】.NET开发在数字化新时代中发挥关键作用,借助跨平台能力、高性能和现代编程语言支持,如C#,助力企业实现数字化转型。通过企业级应用开发、移动应用和云计算集成,.NET加速业务流程和提升用户体验。未来,.NET将涉足AI、ML、MR/AR及量子计算,持续推动技术创新和数字化转型。开发者应提升技能,适应高性能需求,把握发展机遇。
|
29天前
|
开发框架 前端开发 .NET
ASP.NET CORE 3.1 MVC“指定的网络名不再可用\企图在不存在的网络连接上进行操作”的问题解决过程
ASP.NET CORE 3.1 MVC“指定的网络名不再可用\企图在不存在的网络连接上进行操作”的问题解决过程
81 0
|
29天前
|
开发框架 前端开发 JavaScript
JavaScript云LIS系统源码ASP.NET CORE 3.1 MVC + SQLserver + Redis医院实验室信息系统源码 医院云LIS系统源码
实验室信息系统(Laboratory Information System,缩写LIS)是一类用来处理实验室过程信息的软件,云LIS系统围绕临床,云LIS系统将与云HIS系统建立起高度的业务整合,以体现“以病人为中心”的设计理念,优化就诊流程,方便患者就医。
30 0
|
29天前
|
开发框架 前端开发 .NET
进入ASP .net mvc的世界
进入ASP .net mvc的世界
36 0
|
29天前
mvc.net分页查询案例——mvc-paper.css
mvc.net分页查询案例——mvc-paper.css
7 0
|
29天前
|
开发框架 前端开发 .NET
C# .NET面试系列六:ASP.NET MVC
<h2>ASP.NET MVC #### 1. MVC 中的 TempData\ViewBag\ViewData 区别? 在ASP.NET MVC中,TempData、ViewBag 和 ViewData 都是用于在控制器和视图之间传递数据的机制,但它们有一些区别。 <b>TempData:</b> 1、生命周期 ```c# TempData 的生命周期是短暂的,数据只在当前请求和下一次请求之间有效。一旦数据被读取,它就会被标记为已读,下一次请求时就会被清除。 ``` 2、用途 ```c# 主要用于在两个动作之间传递数据,例如在一个动作中设置 TempData,然后在重定向到另
141 5