1回答

1收藏

[分享] 四、GD32F207内部flash的读写操作

GD32 GD32 6768 人阅读 | 1 人回复 | 2016-02-28

本帖最后由 9robot 于 2016-2-28 15:23 编辑

      GD32F207内部有512k字节的flash,对于大多数应用来说,足够使用。同时内部flash支持在程序编程。利用flash可以当做EEPROM使用,同时可以实现IAP(这个以后会去试试)。内部flash前256k空间,CPU执行代码零等待,闪存控制器支持页擦除、整片擦除。32位数据、16位数据的编程(ps:我没找到16位数据编程的库函数,所以全部使用了32位数据编程来完成本实验)。对于GD32F207,内部flash分为256页,每页2k字节大小。

    这次只是进行页擦除,没有使用整片擦除。

  1. u32  GD32_BUF[GD32_SECTOR_SIZE/4];

  2. void GD32FMC_Write(u32 WriteAddr,u32 *pBuffer ,u16 NumToWrite)
  3. {
  4.         u32 secpos;//
  5.         u16 secoff;//
  6.         u16 secremain;//
  7.         u16 i;
  8.         u32 offaddr;//
  9.         if(WriteAddr<GD32_FMC_BASE||(WriteAddr>=(GD32_FMC_BASE+1024*GD32_FMC_SIZE))) return;//
  10.         FMC_Unlock();
  11.         offaddr=WriteAddr-GD32_FMC_BASE;//
  12.         secpos=offaddr/GD32_SECTOR_SIZE;//
  13.         secoff=(offaddr%GD32_SECTOR_SIZE)/4;//
  14.         secremain=GD32_SECTOR_SIZE/4-secoff;//???????à???????ó??
  15.         if(NumToWrite<=secremain)  secremain=NumToWrite;//
  16.         
  17.         while(1)
  18.         {
  19.                 GD32FMC_Read(secpos*GD32_SECTOR_SIZE+GD32_FMC_BASE,GD32_BUF,GD32_SECTOR_SIZE/4);//
  20.           for(i=0;i<secremain;i++)//
  21.                 {
  22.                  if(GD32_BUF[secoff+i]!=0XFFFF) break;//
  23.                 }
  24.                 if(i<secremain)//
  25.                 {
  26.                         FMC_ErasePage(secpos*GD32_SECTOR_SIZE+GD32_FMC_BASE);//????????
  27.                         for(i=0;i<secremain;i++)//
  28.                         {
  29.                           GD32_BUF[secoff+i]=pBuffer[i];
  30.                         }
  31.                         GD32FMC_Write_Nocheck(secpos*GD32_SECTOR_SIZE+GD32_FMC_BASE,GD32_BUF,GD32_SECTOR_SIZE);//
  32.                 }
  33.                 else
  34.                         GD32FMC_Write_Nocheck(WriteAddr,pBuffer,secremain);//
  35.                 if(NumToWrite==secremain) break;
  36.                 else
  37.                 {
  38.                   secpos++;
  39.                         secoff=0;
  40.                         pBuffer+=secremain;//
  41.                         WriteAddr+=secremain;//
  42.                         NumToWrite-=secremain;//
  43.                         
  44.                         if(NumToWrite>(GD32_SECTOR_SIZE/4))  secremain=GD32_SECTOR_SIZE/4;//
  45.                         else
  46.                                 secremain=NumToWrite;//
  47.                 }
  48.                 FMC_Lock();
  49.         }
  50. }
复制代码

Template.zip

341.28 KB, 下载次数: 159

分享到:
回复

使用道具 举报

回答|共 1 个

倒序浏览

沙发

糖悦之果飞

发表于 2016-2-29 10:10:13 | 只看该作者

亲,可以将内容一并发到经验频道,很有机会获得每月之星的呢http://jingyan.eeboard.com/
您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /3 下一条