概述

本例程主要讲解如何对芯片自带Flash进行读写,用芯片内部Flash可以对一些需要断电保存的数据进行保存,无需加外部得存储芯片,本例程采用的是GD32F303ZET6主控,512K大小的Flash。
最近在弄ST和GD的课程,需要GD样片的可以加群申请:6_15061293 。

csdn课程

课程更加详细。
https://download.csdn.net/course/detail/37144

样品申请

https://www.wjx.top/vm/wFGhGPF.aspx#

生成例程

这里准备了自己绘制的开发板进行验证。

系统架构示意图

Flash的操作可以通过FMC控制器进行操作。

FLASH分配

要注意的是,将数据存在flash不同的地方,速度可能不一样。
在闪存的前256K字节空间内,CPU执行指令零等待,在此范围外,CPU读取指令存在较长延时。
同时FLASH有2大块,对于GD32F30x_CL和GD32F30x_XD,使用了两片闪存,前512KB容量在第一片闪存(bank0)中,后续的容量在第二片闪存(bank1)中;

操作流程

如果要对FLASH进行写入数据,需要执行以下四步:

  1. 解锁FLASH
  2. 擦除FLASH
  3. 写入FLASH
  4. 锁住FLASH

FMC_CTLx 寄存器解锁

首先第一步是确保FMC_CTLx寄存器不处于锁定状态。

解锁用fmc_unlock()函数,UNLOCK_KEY0和UNLOCK_KEY1分别是0x45670123和0xCDEF89AB,向FMC_KEY0分别写入着2个参数。


对于第二层解锁,需要使用ob_unlock()函数,向FMC_OBKEY写入UNLOCK_KEY0和UNLOCK_KEY1。
同时通过软件将FMC_CTL0的OBWEN位清0来锁定FMC_CTL0的OBPG位和OBER位。

解锁代码。

    /* unlock the flash program/erase controller */fmc_unlock();//解锁Flash操作ob_unlock();//解锁选项字节,先决条件fmc_unlockfmc_flag_clear(FMC_FLAG_BANK0_END);fmc_flag_clear(FMC_FLAG_BANK0_WPERR);fmc_flag_clear(FMC_FLAG_BANK0_PGERR);

页擦除

第二步进行页擦除。

其中第一步确保FMC_CTLx寄存器不处于锁定状态已在上面解锁了,所以直接进行第二步,检查FMC_STATx寄存器的BUSY位来判定闪存是否正处于擦写访问状态,若BUSY位为1,则需等待该操作结束,BUSY位变为0;
对于擦除函数,使用fmc_page_erase();

对于if(FMC_BANK0_SIZE < FMC_SIZE)

FMC_BANK0_SIZE 和 FMC_SIZE 是两个定义的常量,它们表示 FMC 控制器的两个不同的地址空间。FMC_BANK0_SIZE 指的是 FMC 控制器的 BANK0 地址空间的大小,而 FMC_SIZE 则指的是整个 FMC 控制器的地址空间的大小。因此,如果 FMC_BANK0_SIZE 小于 FMC_SIZE,则说明 FMC 控制器的 BANK0 地址空间不能完全覆盖整个 FMC 控制器的地址空间,此时可能需要使用其他的地址空间来存储数据。

上述说到的检查FMC_STATx寄存器的BUSY位,使用fmc_bank0_ready_wait()函数。

对于以下几个步骤
3. 置位FMC_CTLx寄存器的PER位;
4. 将待擦除页的绝对地址(0x08XX XXXX)写到FMC_ADDRx寄存器;
5. 通过将FMC_CTLx寄存器的START位置1来发送页擦除命令到FMC;
6. 等待擦除指令执行完毕,FMC_STATx寄存器的BUSY位清0;

在fmc_page_erase()都有对应操作。

写数据

解锁和擦除之后,就可以对flash进行写数据的操作。

其中第一步确保FMC_CTLx寄存器不处于锁定状态已在上面解锁了,所以直接进行第二步,检查FMC_STATx寄存器的BUSY位来判定闪存是否正处于擦写访问状态,若BUSY位为1,则需等待该操作结束,BUSY位变为0;
对于写函数,使用fmc_word_program();


解锁FMC_CTL0寄存器的可选字节操作位和等待FMC_CTL0寄存器的OBWEN位置1在解锁时候已经操作了,故进入第五步。

读数据

对于读数据,可以直接访问地址进行读取。

    OutData=(*(__IO uint32_t*)(WriteAddr));

上锁

上锁可以使用fmc_lock()函数。

当上锁时,对控制寄存器 0 (FMC_CTL0)的第7位写1。


变量定义

/* USER CODE BEGIN 0 */
uint32_t WriteFlashData[3] = {0x11111111,0x22222222,0x33333333};//数据
uint32_t WriteFlashData1[3] = {0x44444444,0x55555555,0x66666666};//数据
uint32_t addr = 0x0807F800;//page 255
uint32_t addr1 = 0x0807FC00;//page 255+1kvoid PrintFlashTest(uint32_t L,uint32_t addr);
void WriteFlashTest(uint32_t L,uint32_t Data[],uint32_t addr);/* USER CODE END 0 */

如果要对FLASH进行写入数据,需要执行以下四步:

  1. 解锁FLASH
  2. 擦除FLASH
  3. 写入FLASH
  4. 锁住FLASH

擦除只能是按页或者整块擦除。
GD32F103ZET6的Flash容量是512KB,所以只有255页,每页2KB。
我们可以写入到页255中,即0x0807F800-0x0807FFFF中。
由于单片机是32位,故连续写入多个uint32_t的数据时,地址应该依次增加4。

/*FLASH写入程序*/
void WriteFlashTest(uint32_t L,uint32_t Data[],uint32_t addr)
{uint32_t i=0;/* 1/4解锁FLASH*//* unlock the flash program/erase controller */fmc_unlock();//解锁Flash操作ob_unlock();//解锁选项字节,先决条件fmc_unlock//清除标志位 fmc_flag_clear(FMC_FLAG_BANK0_PGERR);fmc_flag_clear(FMC_FLAG_BANK0_WPERR);      fmc_flag_clear(FMC_FLAG_BANK0_END);     fmc_flag_clear(FMC_FLAG_BANK1_PGERR);       fmc_flag_clear(FMC_FLAG_BANK1_WPERR);       fmc_flag_clear(FMC_FLAG_BANK1_END);     /* 2/4擦除FLASH*///擦除页fmc_page_erase(addr);/* 3/4对FLASH烧写*/for(i=0;i<L;i++){fmc_word_program(addr+4*i, Data[i]);}  /* 4/4锁住FLASH*/ fmc_lock(); }/*FLASH读取打印程序*/
void PrintFlashTest(uint32_t L,uint32_t addr)
{uint32_t i=0;for(i=0;i<L;i++){printf("\naddr is:0x%x, data is:0x%x", addr+i*4,  *(__IO uint32_t*)(addr+i*4));}
}

主程序

    while (1){WriteFlashTest(3,WriteFlashData,addr);WriteFlashTest(3,WriteFlashData1,addr1);PrintFlashTest(3,addr);PrintFlashTest(3,addr1);delay_1ms(5000);}

演示效果

可以看见,对于高容量,页的大小位2k,故写入addr1时候,addr的数据就被擦除了。

GD32F303固件库开发(17)----内部Flash读写相关推荐

  1. GD32F303固件库开发(16)----移植兆易创新SPI Nor Flash之GD25Q64Flash

    spi概述 SPI是串行外设接口(Serial Peripheral Interface)的缩写,是一种高速的,全双工,同步的通信总线,并且在芯片的管脚上只占用四根线,节约了芯片的管脚,同时为PCB的 ...

  2. GD32F303固件库开发

    GD32F303固件库开发 芯片申请 GD32F303固件库开发(1)----前期准备与烧录 GD32F303固件库开发(2)----读保护与写保护 GD32F303固件库开发(3)----使用固件库 ...

  3. GD32F303固件库开发(5)----GPIO输出模式,速率测试、开漏和输出说明

    GD32F303固件库开发.5----GPIO输出模式,速率测试.开漏和输出说明 概述 样品申请 视频教学 csdn课程 硬件准备 开发板管脚配置 不同速率对应的波形 GPIO_OSPEED_2MHZ ...

  4. GD32F303固件库开发(14)----IIC之配置OLED

    GD32F303固件库开发.13----定时器TIM捕获PWM测量频率与占空比 概述 视频教学 csdn课程 参考文档 时钟使能 初始化IO IIC初始化 配置IIC接口 修改IIC发送代码 OLED ...

  5. GD32F303固件库开发(7)----printf打印配置

    GD32F303固件库开发.7----printf打印配置 概述 视频教学 csdn课程 样品申请 硬件准备 keil配置 串口初始化 最后 串口重定向 打印测试 测试结果 概述 本章主要配置prin ...

  6. GD32F303固件库开发(10)----双ADC轮询模式扫描多个通道

    GD32F303固件库开发.10----双ADC轮询模式扫描多个通道 概述 视频教学 csdn课程 样品申请 硬件准备 keil配置 使能串口 串口重定向 ADC通道设置 ADC0初始化 ADC0配置 ...

  7. GD32F303固件库开发(11)----ADC在DMA模式下扫描多个通道

    GD32F303固件库开发.11----双ADC轮询模式扫描多个通道 概述 视频教学 csdn课程 样品申请 硬件准备 keil配置 使能串口 串口重定向 ADC通道设置 DMA设置 ADC0初始化 ...

  8. GD32F303固件库开发(13)----定时器TIM捕获PWM测量频率与占空比

    GD32F303固件库开发.13----定时器TIM捕获PWM测量频率与占空比 概述 视频教学 csdn课程 样品申请 生成例程 keil配置 使能串口 串口重定向 占空比与频率计算 GPIO初始化 ...

  9. STM32F103标准库开发:内部Flash的读写

    本文章技术信息均出自:STM32F103系列超详细参考手册-中文版 STM32F103标准库开发-目录 一.STM32存储器介绍 STM32存储器分为以下两种: 1. 随机存储器-RAM RAM是与C ...

最新文章

  1. postgresql数据库安装以及使用pgadmin连接postgresql数据库
  2. 查询数据库耗费资源的sql
  3. ☆☆在Eclipse中编译NDK的so文件(普通安卓项目转换为NDK项目的设定)
  4. LeetCode 15. 三数之和(3Sum)
  5. 【git系列】提交新的PR-撤销git rebase
  6. 不是有效的函数或过程名_什么是函数?
  7. GlusterFS分布式存储系统
  8. 【ICLR2020】看未知观测:一种简单的蒙特卡洛并行化方法
  9. [转]项目中常用的19条MySQL优化
  10. 感知机学习算法的原始形式
  11. jspstudy oracle,tomcat出错,大神们来看看呐
  12. VAX 过期重新安装办法。
  13. u盘中毒后文件夹被病毒隐藏
  14. AI 人工智能之概率论基础(概念总结和复习)
  15. java excel换行_java poi出excel换行问题
  16. flume笔记(四) Channal
  17. Python常见问题解决办法汇总
  18. 火车头过滤 css样式_HTML5和CSS3过滤器中的网络摄像头视频捕获
  19. 对uni-app开发的某app安全分析
  20. 如何进行PDF文件翻译?PDF翻译怎么操作

热门文章

  1. log4j 使用记录
  2. OpenHarmony恢复启动子系统init进程之服务管理与发布
  3. 【机器学习】使用scikitLearn对数据进行聚类:Kmeans聚类算法及聚类效果评估
  4. POJ 2248 搜索
  5. 兰博基尼lp650-4跑车介绍
  6. Ubuntu 16.04 安装好之后需要做的15件事
  7. tail -f与tail -F的区别
  8. GitHub上广受欢迎的下载神器:youtube-dl
  9. H3C 802.11n的频宽模式
  10. c-free语言编程软件,c-free软件下载_c-free官方下载_3DM软件