RT-Thread学习之对FLASH进行分区管理_第1页
RT-Thread学习之对FLASH进行分区管理_第2页
RT-Thread学习之对FLASH进行分区管理_第3页
RT-Thread学习之对FLASH进行分区管理_第4页
RT-Thread学习之对FLASH进行分区管理_第5页
已阅读5页,还剩4页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

什么是分区管理FLASH分区管理是怎么一回事呢?我们可以以个人电脑来做类比,我们的电脑通常都分有很多个盘符:葭南(6)赳!吟:心 本世&通| Install(Ei] 旧 1 1 ——i1619GB可用.共居JOGB J153QB可目,共5010GB ~9犯1GB可月.会1对<5B 一〜B9可用.上。妈心日Amjs*Orffse1(G;J (HJl?_iUK可用,It13/GE RDflNH可月.St±1JJGE这些都是我们硬盘的分区,我这里装了两块硬盘,512GB的机械硬盘+128GB的固态硬盘,共分C〜H六个分区,我这里的C盘和H盘是固态硬盘,其它盘符是机械硬盘:分区名存储设备名偏移地址大小说昭1工盘"M固态硬盘”66GB系统盘-D盘""机械硬盘’50GB资料点正盘,“机械硬盘’139GB贲料盅"F盘""机械硬盘"139GB资料盘nGa"‘机械硬盘"137GB资料盘明盘”“固态硬盘”51GB软件安装+常用的料分区是为了方便我们对我们的资料进行管理,各个分区互不影响,比如格式化某个分区只会删除这个分区的内容而不会影响其它分区及整个硬盘等。同样的,在我们的STM32上也是可以进行分区管理的,这篇笔记我们来使用RT-Thread的FAL软件包来对我STM32片内FLASH及片外FLASH的分区管理。FAL软件包介绍FAL(FlashAbstractionLayer)Flash抽象层,是RT-Thread的一个软件包,是对Flash及基于Flash的分区进行管理、操作的抽象层,对上层统一了Flash及分区操作的API,并具有以下特性:支持静态可配置的分区表,并可关联多个Flash设备;分区表支持自动装载。避免在多固件项目,分区表被多次定义的问题;代码精简,对操作系统无依赖,可运行于裸机平台,比如对资源有一定要求的bootloader;统一的操作接口。保证了文件系统、OTA、NVM等对Flash有一定依赖的组件,底层Flash驱动的可重用性;自带基于Finsh/MSH的测试命令,可以通过Shell按字节寻址的方式操作(读写擦)Flash或分区,方便开发者进行调试、测试;FAL软件包使用

本笔记主要对潘多拉开发板的FAL例程进行一次梳理,所以部分表述来自于教程文档。我们这个实验建立如下分区表:分区名FLA5H设备名偏移地址大小说明t-partitior11"$tm32_onchipir0384KB匚分区kd-partition1-"stm32_onchiplh384*1024128KBd分区IFe_partition""norflashOr|0512KB身分区1,f_partiCion""norfla$hOri512*10241024KBf分区rM_partiUgn”"norflashO,1(512+1024)*1024512KBg分区"h_particion"■norflashO"(512*1024*512)*10241024KBh分区1、移植接口文件说明FAL软件包的目录如下,其中samples文件夹下为移植接口文件:int星期一文件夹intsarrpieshsrc।|hsrc।|-gitignoreuLICENSE2018/12/262016/12/11文本文智2018门2门1星期-READIME.md2D18/12/11HW...MarkdownFil#.,-READIME.md2D18/12/11HW...MarkdownFil#.,SConscript2016/12/11星期文件名称根立日前大小I也Ldg.hfal_flash_^fud_p<Qrt,-€fal_flash_ri:ni32#2_portc…README^mdFAL配苦文件K日—iam「交冲片外FLA5H名称根立日前大小I也Ldg.hfal_flash_^fud_p<Qrt,-€fal_flash_ri:ni32#2_portc…README^mdFAL配苦文件K日—iam「交冲片外FLA5H接回文件(使用肝ud)片内FLASH接回文件如,移通说明[文档卜布详细介绍其中fal_cfg.h为fal配置文件(Flash设备配置和分区表配置)/*flashdevicetAhlc却『i-ierine~AL_FLA5H_DE1v_TMLE3( 一一一占3tm3Zl^_onch.i|p_rLaaii1!4norflflsMOj/* 一一一一一"PartitionContinruracionEllifdefFiL_PART_HJL5_TA3LE_CFG/*par,cli:lonrabl*7tdefiner&L_PAHT_7a£iLE3( 一一(FAL_PS.RT_MJlGIC_KR.CDr\EaL[PAR]二二HR皿(frl[part二"G工匚*艮犯《EAL2PART-MAGiC2hRCDr<F“l[pART]苗息6:匚廿代口口「(EAL-pARH-kfcG二cTwRODrc_p-arzitian^p"anchip_fLaJh"Fdpar: "onaLipriasn^n334e-p-arzitlon^p工」part工七。口口尸『q_T&T:xtinnartl03ftit*白H1r.J,nQr_fLajh*R,"0.arflash^Hnor512+naar[[a四]1而,£512+1024+512)到-1C24„1Z8*1日卬512*1G24,1024*1C24hS12**1024*1C24.Qlr\口3X叽%叽%“『\ai?\fal是Flash抽象层,要操作Flash设备必然要将Flash的读、写、擦接口对接到fal抽象层中。在fal中,使用structfal_flash_dev结构体来让用户注册该Flash设备的操作接口。fal_flash_dev结构体定义如下所示:

structfal_flash_devcharname[faL_otv_NAME_MA)(];/*FLASH设羿的起始地址*/ulnt32_taddr;sizetItn;/1*FLASH设齐最小盖牙酒liiL小7size_tblk_size;structint(-lnit)(void);int("read)(longoffsetjulntE.t*bufjslz电tSizeJjint(wwriteXlcngoffset,constuintE_t*bu干,sizetszLze);int("eraie){lonEoffsetfsize_tsize);)cps;fal_flash_stm32f2_port.c为片内FLASH接口文件,这得根据实际芯片进行修改,主要是封装读、写、擦除函数,例如:Bcazicirtread|langofumt&t*toufsizetBise)sizen1;uinLj2_taddr=s^m3214_onctaxp_£lasti-addr+of!sec;if(l&MT+Size)>FEA5fl_ElTO_ADDRES5)rt_k^rincf("ERROR:上星5sdnucEUG专eflash5Xze1is[D^^jXn",(void*)(addr+-^ize));return-i;k―„*hu正—■*Cuxnt-6_匕 addrlet□inszze;片内Flash对接说明:TOC\o"1-5"\h\zconststructfal_Flash_de'/stffl3214_onchip_-Flash={\"oncliip_jFlash"t \gM总g0电由电由中, \C512*1024), \2^48, \(MULL,read#write, erase) \Flash设备名称为onchip_flash,设备容量为512K,最小擦除单元为2K,无初始化接口。fal_flash_sfud_port.c为片外FLASH接口文件,这使用SFUD万能SPIFlash通用驱动库来驱动。 片外NorFlash对接说明:

conststructfal_flash_devnor_flashS={"nor_flasliH,叫(16*1024*1024),4白町{fal_sfud_initjread>write#erase)Flash设备名称为nor_flash,设备容量为16M,最小擦除单元为4K。这里使用的read、write、erase接口最终调用SFUD框架中的接口,无需用户进行驱动开发2、fal软件包API接口说明这里主要列举出本实验需要用到的API说明,其它几个未用到的fal接口函数声明在fal.h文件中。查找Flash设备conststructfal_flash_dev-fal_flash_device.-FindCcoristrh^r*name)参数 描述name Flash设备名称return 如果直找成功,符返回Flash设备对象,直找失败返回NULL查找Flash分区conststructfal_partition-fal_partition^findCconstchar±name)参数 描述name Fla5h分区名称return 如果查找成功,将返回Flash分区对象,直找失败返回NULL获取分区表conststructfal_partit1an;fal_get_partition_.tableCsize_tlen)参数 描述len 分区表的长度return 分区表从分区读取数据

inrf3l_partitiOn_rf!acl(COn!itstructfal_partition*part,uinr32_taddr,uinrf?_tbuf,sizetsize)描逑分区对象相对分区的偏移地址描逑分区对象相对分区的偏移地址存故待读取数据的缓冲区待读取数艇的大小返回实际读取的数据大小往分区写入数据intfal_partition_write(conststructfal.partition uint32_taddrhconstuint8_t*buf,size_tsije)参数 描述part 分区对象addr 相对分区的偏移地址buf 存放待写入数据的缓冲区size 待写入数据的大小return 返回实际写入的数据大小擦除分区数据intfalrpartitian_era£eCcon5tstructfal-partition-part,uint32_taddrhsize_tsize)参数描述part分区对象addr相对分区的偏移地址size擦除区域的大小return返回实际擦除的区域大小2.7擦除整个分区数据

1ntfal_partition_erase_al1(conststructfal_partition*part)参数 描述part 分区对繇return 返回实际擦除的区域大小3、fal测试函数说明移植完成后,调用fal_init()初始化该库。测试程序主函数:int.main(vcid>/*初始把FAL.岸*7£己1;八测试w分区,/if〔I己2L_t■已st[ ■二口二==0)sj.cce^3!nf"dpa.rti ;LOGIsj.cce^3!nf"dpa.rti ;elsefailed!","d—tardt■二口二");LOG_E("FaL=3Htfailed!","d—tardt■二口二");约测试f分区Vif[±己ZL_tEEt1n±_raizt±t■=口二")==0)5J.cce^5!nf ■二口二n)5J.cce^5!nf ■二口二n);failed!nfn±par-titio^nfailed!nfn±par-titio^n);:…对d分区与f分区进行读写测试。(1)擦除分区测试:/*擦除整个分区*/ret=fal_partition_erase_all(partition);if(ret<0)LOG_E("Partition(%s)erasefailed!",partition->name);ret=-1;returnret;LOG_I("Erase(%s)partitionfinish!",partiton_name);/*读出分区数据并校验*/for(i=0;i<partition->len;)(rt_memset(buf,0x00,BUF_SIZE);len=(partition->len-i)>BUF_SIZE?BUF_SIZE:(partition->len-i);ret=fal_partition_read(partition,i,buf,len);if(ret<0)(LOG_E("Partition(%s)readfailed!",partition->name);ret=-1;returnret;)for(j=0;j<len;j++)(if(buf[j]!=0xFF)(LOG_E("Theeraseoperationdidnotreallysucceed!");ret=-1;returnret;))i+=len;)擦除成功则分区内容会变成0xFF。(2)读写测试/*往分区写0x00*/for(i=0;i<partition->len;)(rt_memset(buf,0x00,BUF_SIZE);len=(partition->len-i)>BUF_SIZE?BUF_SIZE:(partition->len-i);ret=fal_partition_write(partition,i,buf,len);if(ret<0)(LOG_E("Partition(%s)writefailed!",partition->name);ret=-1;returnret;)i+=len;

)LOG_I("Write(%s)partitionfinish!Writesize%d(%dK).",partiton_name,i,i/1024);/*读取分区数据并校验*/for(i=0;i<partition->len;)(rt_memset(buf,0xFF,BUF_SIZE);len=(partition->len-i)>BUF_SIZE?BUF_SIZE:(partition->len-i);ret=fal_partition_read(partition,i,buf,len);if(ret<0)(LOG_E("Partition(%s)readfailed!",partition->name);ret=-1;returnret;)for(j=0;j<len;j++)(if(buf[j]!=0x00)(LOG_E("Thewriteoperationdidnotreallysucceed!");ret=-1;returnret;i+=len;)读出来的数据与写入的数据相等则测试成功。程序运行结果:s?rtfiHTj■■曾国培6Km居H打TJILj餐的呼\if■NT-.(IXrsmoii1A口\if■NT-.(IXrsmoii1A口1[□TAL[「FU[TF4Lk;虬[IF.M.I:Fn-1[G-FiU[e.-i-al[l-l-AL[i-Fal[rF4L[eTai[T/rii[lyTa.1U-til:nsth>[.口Thr-tanOper-iringSyiLenJ-.Q.flbuildOec15守2C1WC™yrightbyrt-threjdte-sra门M◎uli-JMHtlflasheh^p-sizeU1城门216byl«.总同S3TlMh—1炉14ttal_tlash_1ra-iT:fiijrlxhd«u1c«| cncMoflashm”:田:白白83D00|Inn:加皿日|fclk_£l2«.:3MOOCiE州|1nlrlil-lzadfin[TaLTiacrLin(njtl5FlashdkMce| rarjlasli|addnoqo(mmxkmm»|ion:aMOifKXMXXi|mk_Li2CjQiOODOi(ma|lniTlillifldtmEalpjrTlrlDntable-—————-——™Inam |fl-u-h,dev|ffffsetjlengthjTjiircKlGnonchip_f]ashWCHp_T1型鼾ncf_rliiiH.hmsr_riaih仲or_TIA5hiwr_Flas-h6修曲就aOkDOIBDIXK)OkDOj-MC-ODI口骂OWb网口I。霹网之烟方|口片000日。便口*M雕6口OxOOOBCOOO0KCC*tDC<»-3nrThrseadrlash占b:5tL送工[\旧<1laverf2."ini<i-nlire51KtcU-i_Fl日死机丁F•"5口=十1整|1Flas-l-i■■■!«:; P-ArtitT.il--:.!partitlG-nFah111】口门二14七:1」IEEr*iSfrFqmiM)pJi-Xni&rtf1bl5h'mt1[fiC4_parEliTliwi)pjrcIcfionfinish'£1工6111072(1JflK).rurfTlTlDn(-tU-awclTlftnltast匚叱七口有击1.'fal]Lrase(f_parTlx.1m]nirdrtanfinish!rtrit& portionfinish'rt-ite5-iieISMNFGQ口2目网,F-1jMftTtiuni 口「」七umt使用SHELL命令测试FAL为了方便用户验证fal功能是否正常,以及Flash驱动是否正确工作,分区表配置是否合理,RT-Thread为fal提供了一套测试命令:iish才fa】|1」工篇口中:干mlprobe[dev_nameIpart_rwie]falre-a<iiish才fa】|1」工篇口中:干mlprobe[dev_nameIpart_rwie]falre-a<iaddrsizef>j1hfiteihiJdrdal..daUdhlfaler-a5eaddrsizefalbench<blk^size>recLd'size'bytessrarilngar'adclrwrite3口mebytuj"data1a-tjrtingdt'jddr1erase'siz-e'bytesstartinqataddr"benchmark常由perblocksize 仁能测诂1、探测命令Serial-CflMuishalProbedamhhd"lProbedansh>d

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论