GD32F303固件库开发(17)----内部Flash读写

发布者:SereneGardener最新更新时间:2024-11-14 来源: elecfans关键字:GD32F303  固件库开发  内部Flash读写 手机看文章 扫描二维码
随时随地手机看文章

概述

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

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_unlock


    fmc_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()函数。

在这里插入图片描述

对于以下几个步骤

  1. 置位FMC_CTLx寄存器的PER位;

  2. 将待擦除页的绝对地址(0x08XX XXXX)写到FMC_ADDRx寄存器;

  3. 通过将FMC_CTLx寄存器的START位置1来发送页擦除命令到FMC;

  4. 等待擦除指令执行完毕,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+1k


void PrintFlashTest(uint32_t L,uint32_t addr);

void WriteFlashTest(uint32_t L,uint32_t Data[],uint32_t addr);


/* USER CODE END 0 */

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


解锁FLASH

擦除FLASH

写入FLASH

锁住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  固件库开发  内部Flash读写 引用地址:GD32F303固件库开发(17)----内部Flash读写

上一篇:GD32F303 低功耗模式要点
下一篇:GD32F303固件库开发(15)----外部中断EXTI

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

GD32F303固件库开发(11)----ADC在DMA模式下扫描多个通道
概述 本章主要配置,ADC在DMA模式下扫描多个通道,通过串口进行打印。 查阅手册可以得知,PA9、PA10为串口0的输出和输入口。 需要GD样片的可以加群申请:615061293 。 ADC通道配置 硬件准备 这里准备了1块开发板进行验证,分别是GD32303C_START开发板。 keil配置 microlib 进行了高度优化以使代码变得很小。 它的功能比缺省 C 库少,并且根本不具备某些 ISO C 特性。 某些库函数的运行速度也比较慢,如果要使用printf(),必须开启。 使能串口 /* 使能GPI0A,用PA9、PA10为串口 */ rcu_periph_clock_enable(RCU_GPIOA
[单片机]
<font color='red'>GD32F303</font><font color='red'>固件库</font><font color='red'>开发</font>(11)----ADC在DMA模式下扫描多个通道
GD32F303固件库开发(15)----外部中断EXTI
概述 本章配置GD32F303使用EXTI进行驱动LED。 需要GD样片的可以加群申请:615061293 。 视频教学 https://www.bilibili.com/video/BV1ig411Y7bB/ csdn课程 课程更加详细。 https://download.csdn.net/course/detail/37144 生成例程 这里准备了自己绘制的开发板进行验证。 查看原理图,PB14为按键管脚。 LED管脚为PB7. 配置中断口 GPIO 口连接到 16 个外部中断 / 事件线如下图 。可以看到PC13应该是在EXTI14上。 外部中断/事件控制器用于产生事件/中断请求的边沿检测器。每根输入线都
[单片机]
<font color='red'>GD32F303</font><font color='red'>固件库</font><font color='red'>开发</font>(15)----外部中断EXTI
GD32F303固件库开发(1)----前期准备与烧录
概述 在这使用STM32CUBEMX进行配置STM32F103,移植到兆易创新GD32F303,然后进行测试。需要样片的可以加Qun申请:615061293。 芯片申请 芯片和开发板都可免费申请,暂时只能以公司名义免费申请,填下下面表格即可。 pack包 GD32f303的pack包下载链接如下: https://www.keil.com/dd2/pack/#/eula-container 调试软件 J-Link下载,选择自己适合的版本进行下载。 https://www.segger.com/downloads/jlink/ 开发板资料下载 开发板资料可以上兆易创新进行下载。 http://www.gd32mcu.com/c
[单片机]
<font color='red'>GD32F303</font><font color='red'>固件库</font><font color='red'>开发</font>(1)----前期准备与烧录
STM32F103学习笔记(3)——读写内部Flash
一、简介 在STM32芯片内部有一个 FLASH 存储器,它主要用于存储代码,我们在电脑上编写好应用程序后,使用下载器把编译后的代码文件烧录到该内部 FLASH 中,由于 FLASH 存储器的内容在掉电后不会丢失,芯片重新上电复位后,内核可从内部 FLASH 中加载代码并运行。 STM32 的内部 FLASH 包含主存储器、系统存储器以及选项字节区域,它们的地址分布及大小见下表 主存储器 一般我们说 STM32 内部 FLASH 的时候,都是指这个主存储器区域,它是存储用户应用程序的空间,芯片型号说明中的 256K FLASH、512K FLASH 都是指这个区域的大小。 主存储器分为 256 页,每页大小为 2
[单片机]
STM32G031G8U6单片机内部FLASH读写简单学习
此篇限定研究范围为FLASH区域的访问规则。 以下结论均为实测所得: 一、读 1.单字节读例程,单字节读可以从任意地址开始读 uint8_t STMFLASH_ReadByte(uint32_t faddr) { return *(volatile uint8_t*)faddr; } 2.半字(2个字节)读例程, 半字读只能从偶数地址开始读 ,从奇数地址读的话单片机就死机了 uint16_t STMFLASH_ReadHalfWord(uint32_t faddr) { return *(volatile uint16_t*)faddr; } 3.字(4个字节)读例程, 按字读只能从4的整数倍地址开始读
[单片机]
STM32CUBEIDE(16)----内部Flash读写
概述 本例程主要讲解如何对 芯片 自带Flash进行读写,用芯片内部Flash可以对一些需要断电保存的数据进行保存,无需加外部得存储芯片,本例程采用的是 STM32 F103RBT6,128K大小的Flash。 最近在弄ST和GD的课程,需要GD样片的可以加群申请:615061293 。 视频 教学 csdn课程 课程更加详细。 硬件 准备 使用STM32CUBEMX生成例程,这里使用NUCLEO-F103RB开发板 查看原理图,PA2和PA3设置为开发板的串口。 配置串口。 查看原理图,PA8设置为PWM输出管脚,PA0设置为 定时器 输入捕获管脚。 配置 时钟 树 配置时钟为64M。 串口重定
[单片机]
STM32CUBEIDE(16)----<font color='red'>内部</font><font color='red'>Flash</font><font color='red'>读写</font>
STM32读写内部Flash
工作中使用STM32F407ZGT6这块芯片开发项目,内部Flash有1M之多,出于数据存储需要,而外部没有拓展EEPROM,就想着将数据存入Flash中。因此研究了一下STM32F4读写内部Flash的一些操作。 以下是关于Flash介绍,部分来自互联网: 【STM32F4 内部Flash的一些信息】 STM32F407ZGTx的内部Flash的地址是:0x08000000,大小是0x00100000。 写Flash的时候,如果发现写入地址的Flash没有被擦出,数据将不会写入。Flash的擦除操作,只能按Sector进行。不能单独擦除一个地址上的数据。因此在写数据之前需要将地址所在Sector的所有数据擦除。
[单片机]
STM32<font color='red'>读写</font><font color='red'>内部</font><font color='red'>Flash</font>
STM32L152XX--读写内部Flash
Flash模块组织 存储器被组织为程序存储器模块,数据EEPROM模块和信息块。 程序存储器块分为4 KB的扇区,每个扇区都是进一步分成16页,每页256字节。 程序存储器页面擦除 该操作用于擦除程序存储器中的页面(64个字)。要做到这一点: ●解锁FLASH_PECR寄存器 1.将PEKEY1 = 0x89ABCDEF写入编程/擦除密钥寄存器(FLASH_PEKEYR) 2.将PEKEY2 = 0x02030405写入编程/擦除密钥寄存器(FLASH_PEKEYR) ●解锁程序存储器 ●解锁FLASH_PECR寄存器 1. 将PRGKEY1 = 0x8C9DAEBF写入程序存储器密钥寄存器 (FLASH_
[单片机]
小广播
最新单片机文章
何立民专栏 单片机及嵌入式宝典

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

厂商技术中心

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

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