GD32的FLASH读、擦除、写操作

发布者:VelvetWhisper最新更新时间:2024-10-31 来源: elecfans关键字:GD32  擦除  写操作 手机看文章 扫描二维码
随时随地手机看文章

一,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结构

1、GD32F10x_MD

d596480a-cee1-11ee-9118-92fbcf53809c.png?imageView2/2/w/1000


GD32F10x_CL,GD32F10x_HD 和 GD32F10x_XD

d5d1b67e-cee1-11ee-9118-92fbcf53809c.png?imageView2/2/w/1000


三,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读并验证该页是否擦除成功。


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_terase_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上锁}


五,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  擦除  写操作 引用地址:GD32的FLASH读、擦除、写操作

上一篇:GD32 MCU是如何进入中断函数的
下一篇:如何排查GD32 MCU复位是由哪个复位源导致的?

推荐阅读最新更新时间:2026-03-20 11:13

兆易创新推出GD25NE系列SPI NOR Flash:专为1.2V SoC打造,双电压供电助力功耗减半
兆易创新推出GD25NE系列SPI NOR Flash:专为1.2V SoC打造,双电压供电助力读功耗减半 中国北京(2025年3月12日)—— 业界领先的半导体器件供应商兆易创新GigaDevice宣布推出专为1.2V SoC应用打造的双电压供电SPI NOR Flash产品——GD25NE系列。 该系列产品无需借助外部升压电路即可与下一代1.2V SoC实现无缝兼容,此产品的面世将进一步强化兆易创新在双电压供电闪存解决方案领域的战略布局。凭借更高的性能和更低的功耗,GD25NE系列可充分满足市场对于先进嵌入式存储解决方案日益增长的需求,成为智能可穿戴设备、医疗健康、物联网、数据中心及边缘人工智能应用的理想选择。 G
[嵌入式]
兆易创新推出GD25NE系列SPI NOR <font color='red'>Flash</font>:专为1.2V SoC打造,双电压供电助力<font color='red'>读</font>功耗减半
怎么看时序图--nand flash操作详解
这篇文章不是介绍 nand flash的物理结构和关于nand flash的一些基本知识的。你需要至少了解 你手上的 nand flash的物理结构和一些诸如读写命令 操作的大概印象,你至少也需要看过 s3c2440中关于nand flash控制寄存器的说明。 由于本人也没有专门学过这方面的知识,下面的介绍也是经验之谈。 这里 我用的 K9F2G08-SCB0 这款nand flash 来介绍时序图的阅读。不同的芯片操作时序可能不同,读的命令也会有一些差别。 当然其实有时候像nand flash这种 s3c2440内部集成了他的控制器的外设。具体到读写操作的细节时序(比如 CLE/ALE的建立时间,写脉冲的宽度。数据的建立和保持时
[单片机]
怎么看时序图--nand <font color='red'>flash</font>的<font color='red'>读</font><font color='red'>操作</font>详解
STM32F4(Flash保护)
1,目的 在实际的产品发布中,如果不对储存在单片机Flash中的程序做一些保护的话,就有可能被一些不法公司,通过仿真器(J-Link,ST-Link等)把Flash中的程序读取回来,得到bin文件或hex文件,然后去山寨产品。所以我们需要对程序进行保护,一种比较简单可靠的方法就是把Flash设置成读保护。 2,开发环境 1,适用芯片:STM32F4全部芯片 2,固件库:STM32F4xx_DSP_StdPeriph_Lib_V1.8.0 3,IDE:MDK517 3,程序源码 /***************************************************************
[单片机]
MSP430系列单片机-RAM数据烧写到Flash
题目一 从RAM地址0x0200中读取一个long数据,并烧写至地址为0x1800的Flash中。 代码: #include io430.h void main(void) { //初始化RAM信息段的指针 unsigned long * RAM_ptr = (unsigned long *) 0x0200; //初始化Flash信息段的指针 unsigned long * Flash_ptr = (unsigned long *) 0x1800; //存放数据的变量 unsigned long value; WDTCTL = WDTPW + WDTHOLD; //关闭看
[单片机]
一步步STM32 OS【三】PendSV与堆栈操作
一、什么是PendSV PendSV是可悬起异常,如果我们把它配置最低优先级,那么如果同时有多个异常被触发,它会在其他异常执行完毕后再执行,而且任何异常都可以中断它。更详细的内容在《Cortex-M3 权威指南》里有介绍,下面我摘抄了一段。 OS 可以利用它“缓期执行”一个异常——直到其它重要的任务完成后才执行动 作。悬起 PendSV 的方法是:手工往 NVIC的 PendSV悬起寄存器中写 1。悬起后,如果优先级不够 高,则将缓期等待执行。 PendSV的典型使用场合是在上下文切换时(在不同任务之间切换)。例如,一个系统中有两个就绪的任务,上下文切换被触发的场合可以是: 1、执行一个系统调用 2、系统滴答定时器(S
[单片机]
一步步<font color='red'>写</font>STM32 OS【三】PendSV与堆栈<font color='red'>操作</font>
基于STM32从零操作系统系列---基于寄存器串口驱动
目的 尝试基于寄存器层面,编写串口的驱动。用这种方式编写串口驱动,有点类似于使用汇编语言。面向的是每一个单独的寄存器,通过读、改、写的手段,配置寄存器。但是这种方式能够更接近硬件,用硬件的思维编程。 相对于《基于STM32从零写操作系统系列---使用C语言》,这章重新调整了文件结构,让项目文件更好管理和维护。主要使用了makefile的嵌套编译方法来编译多目录下的代码文件。 分析 1.Makefile嵌套编译 首先简单来看一下文件结构: 再看一下顶层Makefile,主要差异如下: 各子目录下的Makefile比较简单 其中需要注意的是: 在windows的cmd命令行中for命令用于查找
[单片机]
基于STM32从零<font color='red'>写</font><font color='red'>操作</font>系统系列---基于寄存器<font color='red'>写</font>串口驱动
基于STM32从零操作系统系列---点亮LED灯
目的: 用汇编语言编写一个点亮LED的程序,用于验证前面章节中,下载.bin文件到芯片后,程序能否运行。 要求: 1.芯片手册 2.开发板上有LED模块 实验步骤: 1.新建文件夹led_proj,复制bootloader_proj(参照本系列第3篇文章)文件夹中的所有文件到led_proj文件夹。 2.新建文件led.s,编写代码。代码内容主要是使能GPIO口的时钟,配置GPIO口,向GPIO口的输出数据寄存器写数据。 3.修改main.s文件,添加一条跳转指令,修改死循环代码。 4.修改makefile文件,在OBJ变量中添加led.o,如图: 5..保存所有修改,在命令行中,进入led_proj
[单片机]
基于STM32从零<font color='red'>写</font><font color='red'>操作</font>系统系列---点亮LED灯
STM8S---选项字节(Option Byte)操作之IO复用
功能实现目标   通过对选项字节的写操作来实现TIM2的CH3通道的PWM输出IO复用,可以设置为PA3或者PD2输出。 通过STVP方式操作链接 选项字节   选项字节包括芯片硬件特性的配置和存储器的保护信息,这些字节保存在存储器中一个专用的块内。除了ROP(读出保护)字节,每个选项字节必须被保存两次,一个是通常的格式(OPTx)和一个用来备份互补格式的(NOPTx)。选项字节可以通过应用程序在IAP模式下修改,但是ROP选项只能在ICP模式(通过SWIM)下被修改。有关SWIM编程过程的内容可以参考STM8S闪存编程手册(PM0051)和STM8 SWIM通信协议和调试模块用户手册(UM0470)。   不同的芯片
[单片机]
STM8S---选项字节(Option Byte)<font color='red'>写</font><font color='red'>操作</font>之IO复用
小广播
最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

厂商技术中心

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2026 EEWORLD.com.cn, Inc. All rights reserved