查看: 5941|回复: 1

[经验] 四、GD32F207内部flash的读写操作

[复制链接]
  • TA的每日心情
    奋斗
    2024-9-22 22:20
  • 签到天数: 944 天

    连续签到: 1 天

    [LV.10]以坛为家III

    发表于 2016-2-28 14:56:58 | 显示全部楼层 |阅读模式
    分享到:
    本帖最后由 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字节大小。

    内部flash描述

    内部flash描述

    读操作很简单,就是利用指针哦

    读操作很简单,就是利用指针哦

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

    页擦除的基本顺序

    页擦除的基本顺序
    QQ截图20160228145228.png QQ截图20160228145335.png QQ截图20160228145435.png QQ截图20160228145448.png

    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

    回复

    使用道具 举报

  • TA的每日心情
    开心
    2018-11-19 16:39
  • 签到天数: 2 天

    连续签到: 1 天

    [LV.1]初来乍到

    发表于 2016-2-29 10:10:13 | 显示全部楼层
    亲,可以将内容一并发到经验频道,很有机会获得每月之星的呢http://jingyan.eeboard.com/
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

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



    手机版|小黑屋|与非网

    GMT+8, 2024-11-15 10:09 , Processed in 0.118524 second(s), 18 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.