GD32的flash特征

1、在flash的前256K字节空间内,CPU执行指令零等待;在此范围外,CPU读取指令存在较长延时;
2、对于flash大于512KB(不包括等于512KB)的GD32F10x_CL和GD32F10x_XD,使用了两片闪存;前512KB容量在第一片闪存(bank0)中,后续的容量在第二片闪存(bank1)中;
3、对于flash容量小于等于512KB的GD32F10x_CL和GD32F10x_HD,只使用了bank0;
4、对 于 GD32F10x_MD , 闪 存 页 大 小 为 1KB 。 GD32F10x_CL 和 GD32F10x_HD ,GD32F10x_XD,bank0的闪存页大小为2KB,bank1的闪存页大小为4KB;
5、支持32位整字或16位半字编程,页擦除和整片擦除操作;

GD32的flash结构

GD32F10x_MD

GD32F10x_CL,GD32F10x_HD 和 GD32F10x_XD

GD32的flash读操作

flash可以像普通存储空间一样直接寻址访问。

value=*(uint32_t*)FlashAddr;
uint16_t IAP_ReadFlag(void)
{return *(volatile uint16_t*)(FLASH_ADDR);
}

GD32的flash擦除操作

页擦除

每一页可以被独立擦除,步骤如下:

  1. 确保FMC_CTLx寄存器不处于锁定状态;
  2. 检查FMC_STATx寄存器的BUSY位来判定闪存是否正处于擦写访问状态,若BUSY位为1,则需等待该操作结束,BUSY位变为0;
  3. 置位FMC_CTLx寄存器的PER位;
  4. 将待擦除页的绝对地址(0x08XX XXXX)写到FMC_ADDRx寄存器;
  5. 通过将FMC_CTLx寄存器的START位置1来发送页擦除命令到FMC;
  6. 等待擦除指令执行完毕,FMC_STATx寄存器的BUSY位清0;
  7. 如果需要,使用DBUS读并验证该页是否擦除成功。

代码上直接调用GD的库函数即可:

void fmc_erase_page(uint32_t Page_Address)
{fmc_unlock();  //fmc解锁/* clear all pending flags */fmc_flag_clear(FMC_FLAG_BANK0_END);fmc_flag_clear(FMC_FLAG_BANK0_WPERR);fmc_flag_clear(FMC_FLAG_BANK0_PGERR);/* erase the flash pages */fmc_page_erase(Page_Address);/* clear all pending flags */fmc_flag_clear(FMC_FLAG_BANK0_END);fmc_flag_clear(FMC_FLAG_BANK0_WPERR);fmc_flag_clear(FMC_FLAG_BANK0_PGERR);fmc_lock();  //fmc上锁
}

要擦除连续的几页:

void fmc_erase_pages(void)
{uint32_t erase_counter;/* unlock the flash program/erase controller */fmc_unlock();/* clear all pending flags */fmc_flag_clear(FMC_FLAG_BANK0_END);fmc_flag_clear(FMC_FLAG_BANK0_WPERR);fmc_flag_clear(FMC_FLAG_BANK0_PGERR);/* erase the flash pages */for(erase_counter = 0; erase_counter < page_num; erase_counter++){fmc_page_erase(FMC_WRITE_START_ADDR + (FMC_PAGE_SIZE * erase_counter));fmc_flag_clear(FMC_FLAG_BANK0_END);fmc_flag_clear(FMC_FLAG_BANK0_WPERR);fmc_flag_clear(FMC_FLAG_BANK0_PGERR);}/* lock the main FMC after the erase operation */fmc_lock();
}

整片擦除

void fmc_erase_page(uint32_t Page_Address)
{fmc_unlock();  //fmc解锁/* clear all pending flags */fmc_flag_clear(FMC_FLAG_BANK0_END);fmc_flag_clear(FMC_FLAG_BANK0_WPERR);fmc_flag_clear(FMC_FLAG_BANK0_PGERR);/* erase whole chip */fmc_mass_erase();/* clear all pending flags */fmc_flag_clear(FMC_FLAG_BANK0_END);fmc_flag_clear(FMC_FLAG_BANK0_WPERR);fmc_flag_clear(FMC_FLAG_BANK0_PGERR);fmc_lock();  //fmc上锁
}

GD32的flash写操作

往flash的某个地址写入数据前,一般要先擦除该地址。
16位半字编程:

void IAP_WriteFlag(uint16_t flag)
{fmc_unlock();fmc_page_erase(IAP_FLAG_ADDR); fmc_halfword_program(IAP_FLAG_ADDR,flag);fmc_lock();
}

32位整字编程:

void fmc_program(void)
{/* unlock the flash program/erase controller */fmc_unlock();address = FMC_WRITE_START_ADDR;/* program flash */while(address < FMC_WRITE_END_ADDR){fmc_word_program(address, data0);address += 4;fmc_flag_clear(FMC_FLAG_BANK0_END);fmc_flag_clear(FMC_FLAG_BANK0_WPERR);fmc_flag_clear(FMC_FLAG_BANK0_PGERR); }/* lock the main FMC after the program operation */fmc_lock();
}

GD32的flash读、擦除、写操作相关推荐

  1. Python 学习笔记(3)对txt文件的读与写操作(下)

    上一章节我们讨论了如何对txt文本文件进行读写操作,这一张将讨论如何进行二进制文件的写与读.<Python 学习笔记(3)对txt文件的读与写操作(上)>的链接如下https://blog ...

  2. python 经典脚本文件_Python3.5文件读与写操作经典实例详解

    本文实例讲述了Python3.5文件读与写操作.分享给大家供大家参考,具体如下: 1.文件操作的基本流程: (1)打开文件,得到文件句柄并赋值给一个变量 (2)通过句柄对文件进行操作 (3)关闭文件 ...

  3. C++编程的“读”与“写”操作

    学编程和学单片机时,有时会对"读操作"和"写操作"含糊.虽然也会用,但是没彻底搞懂里面的原理,直到今天才恍然大悟.在介绍"读"与" ...

  4. 读保护_GD32VF103之片上flash读、写、擦除

    GD32VF103提供了128k的片上flash存储器,可以存放代码和数据,页大小为1kB,所以有128个页.闪存控制器(FMC)提供了片上闪存需要的所有功能,包括页擦除.整片擦除.32位或16位编程 ...

  5. NOR FLASH读、写、擦原理与实现(1)——性能简述与术语解释

    这段时间,由于项目需要,我得对FLASH的运作原理做初步的理解,并且对其实现方法进行研究.我将通过几篇博客将我的学习历程记录下来,并且希望跟诸位有缘看到博客的人共同讨论.学习.以下笔记将以芯片&quo ...

  6. Python 学习笔记(3)对txt文件的读与写操作(上)

    目录 1.file 对象 2.open() 方法 3.txt文件的读与写 3.1.写txt文件 3.2.读txt文件 3.2.在文件末尾续写文件 4.写在最后 1.file 对象 file 对象使用 ...

  7. Python open()函数文件打开、读、写操作详解

    python的文件读写和打开操作都有自己特定的函数和方法,操作起来很简单.下面就来简单的了解下python文件的基本操作方法有哪些. 一.Python open()函数文件打开操作 打开文件会用到op ...

  8. Pandas:1.创建、读和写操作

    一.创建DataFrame 1.创建表格DataFrame fruits = pd.DataFrame([[30, 21]], columns=['Apples', 'Bananas']) 效果: 2 ...

  9. EasyExcel使用(读、写操作)

    Java实现Excel的读写操作 EasyExcel使用(写.读操作) 1.1 导入依赖 1.2 EasyExcel实现写操作 1.2.1 写操作--创建实体 1.2.2 实现写操作具体代码 1.2. ...

最新文章

  1. ZZ--是谁送走了我们的同事
  2. boost::mpl::less相关的测试程序
  3. mysql的json函数与实例_Mysql实例详解Mysql中的JSON系列操作函数
  4. 通过动态获取cookie爬取国家企业信用信息公司系统
  5. java线程打水问题_Java 多线程 wait() 虚假唤醒问题
  6. python中类的构成_Python类的构成元素
  7. 模版 ----- 实数二分
  8. 只做两个龅牙门牙_孔子画像中的门牙格外突出,画师为何不给圣人开美颜?...
  9. Unity之FBX文件操作学习笔记(二)SDK sample代码初探
  10. windows屏幕分辨率获取方式
  11. 我看现在的seo培训机构
  12. Matlab中的Smith 预估器
  13. Linux - 部署node项目
  14. axure 授权码,试用期过了也可以用
  15. 42所一流大学研究生奖助学金汇总~
  16. Spring入门详解(一)如何配置一个简单的spring项目
  17. Android官方技术文档翻译——开发工具的构建概述
  18. 专业、简单、稳定,融云重新定义互联网通信云服务
  19. 艺术探索笔记:IPC
  20. U880 root 教程 android root

热门文章

  1. skylake服务器处理器M系列,行业——华为三大v5机架式服务器改用Skylake处理器
  2. error: Microsoft Visual C++ 14.0 is required.(安装scrapy)
  3. 年度BCI奖 |THE ANNUAL BCI AWARD
  4. [unreal4入门系列之十] UE4添加角色到场景中
  5. JAVA实现包含main函数的栈问题(《剑指offer》)
  6. 果蝇玩VR登Nature,发现注意力机制、工作记忆都有,昆虫大脑原来没比哺乳类差多少...
  7. 百度Apollo飘了!在京开启全无人RoboTaxi体验,车型还能选,原因竟是嫌40万人次体验不够...
  8. 猛男把400+条猫咪叫声做成数据集,可识别猫咪的3种不同状态丨开源
  9. MindCon | 5天啦,你有领取MSG城市专属徽章吗?
  10. 腾讯员工中66%是研发,用C++最多,去年新写12.9亿行代码