0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

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

嵌入式单片机MCU开发 来源:嵌入式单片机MCU开发 作者:嵌入式单片机MCU开 2023-07-27 09:40 次阅读

概述

本例程主要讲解如何对芯片自带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进行写入数据,需要执行以下四步:

  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的数据就被擦除了。

在这里插入图片描述

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • FlaSh
    +关注

    关注

    10

    文章

    1551

    浏览量

    146720
  • 固件库
    +关注

    关注

    2

    文章

    93

    浏览量

    14838
  • GD32
    +关注

    关注

    7

    文章

    336

    浏览量

    23755
  • gd32f303
    +关注

    关注

    4

    文章

    37

    浏览量

    3593
收藏 人收藏

    评论

    相关推荐

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

    本章配置GD32F303使用IIC进行驱动SSD1306的12864OLED。
    的头像 发表于 07-26 08:55 2630次阅读
    <b class='flag-5'>GD32F303</b><b class='flag-5'>固件</b>库<b class='flag-5'>开发</b>(14)----IIC之配置OLED

    GD32E103和GD32F303区别

    GD早期的产品,GD32E103和GD32F303是对GD32F103的升级和优化,所以4者是兼容的,虽然内核不同,但是通用外设几乎很少涉及到内核部分,在时间急迫的情况下可以使用ST
    发表于 08-10 07:32

    GD32F303】星空派介绍

    GD32官方资料的基础上,提供GD32F303的库函数开发资料、例程讲解、视频课程等。同时还提供RT-Thread相关的驱动开发、应用开发
    发表于 09-11 17:55

    【星空派GD32F303开发板试用体验】开箱+环境搭建

    本帖最后由 lustao 于 2021-10-19 09:29 编辑 感谢 发烧友学院以及广州旗点智能科技有限公司为我和孩子提供此产品星空派GD32F303开发板。收到了星空派GD32F303
    发表于 10-18 14:15

    【星空派GD32F303开发板试用体验】开箱+环境搭建

    https://bbs.elecfans.com/jishu_2179209_1_1.html感谢 发烧友学院以及广州旗点智能科技有限公司为我和孩子提供此产品星空派gd32F303开发板。收到了星空
    发表于 11-02 15:36

    【星空派GD32F303开发板试用体验】+板卡概览

    完整地进行外设开发,包括:JTAG、RTC、I2C、UART、SPI、SDIO、EXMC、DAC、ADC、USB、TFT-LCD等。GD32F303系列片上集成了丰富的创新外设资源,包括:Cortex
    发表于 11-06 21:05

    【星空派GD32F303开发板试用体验】文件读写与数码相框的实现 (兼结题报告)

    本帖最后由 jinglixixi 于 2021-11-27 01:23 编辑 星空派开发板是旗点科技推出的一款以GD32F303ZET6为核心的开发板,该GD32F303芯片同
    发表于 11-26 12:05

    星空派GD32F303开发板的相关资料下载

    一、开发板介绍星空派(GD开发板是由旗点科技推出的一款GD32开发板,板载GD32F303ZE
    发表于 12-10 08:27

    GD32F303固件开发(1)----前期准备与烧录

    在这使用STM32CUBEMX进行配置STM32F103,移植到兆易创新GD32F303,然后进行测试。需要样片的可以加Qun申请:615061293。
    的头像 发表于 11-23 11:15 1912次阅读
    <b class='flag-5'>GD32F303</b><b class='flag-5'>固件</b>库<b class='flag-5'>开发</b>(1)----前期准备与烧录

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

    以STM32CUBEMX创建STM32F103工程,同时移植在GD32F303中,同时通过GD32303C_START开发板内进行验证。
    的头像 发表于 11-25 15:32 2559次阅读
    <b class='flag-5'>GD32F303</b><b class='flag-5'>固件</b>库<b class='flag-5'>开发</b>(5)----GPIO输出模式,速率测试、开漏和输出说明

    GD32F303固件开发(15)----外部中断EXTI

    本章配置GD32F303使用EXTI进行驱动LED。
    的头像 发表于 07-26 15:56 900次阅读
    <b class='flag-5'>GD32F303</b><b class='flag-5'>固件</b>库<b class='flag-5'>开发</b>(15)----外部中断EXTI

    GD32F303固件开发

    /qq_24312945/article/details/124325797] GD32F303固件开发(2)----读保护与写保护 芯片读保护以后,flash将不可以从外部读取,这
    的头像 发表于 07-27 09:27 670次阅读
    <b class='flag-5'>GD32F303</b><b class='flag-5'>固件</b>库<b class='flag-5'>开发</b>

    STM32CUBEMX开发GD32F303

    在这使用STM32CUBEMX进行配置STM32F103,移植到兆易创新GD32F303,然后进行测试。
    的头像 发表于 07-27 09:32 977次阅读
    STM32CUBEMX<b class='flag-5'>开发</b><b class='flag-5'>GD32F303</b>

    STM32CUBEMX开发GD32F30317)----内部Flash读写

    本章STM32CUBEMX配置STM32F103,并且在GD32F303中进行开发,同时通过开发板内进行验证。 本例程主要讲解如何对芯片自带Flash进行
    的头像 发表于 07-27 09:35 1193次阅读
    STM32CUBEMX<b class='flag-5'>开发</b><b class='flag-5'>GD32F303</b>(<b class='flag-5'>17</b>)----<b class='flag-5'>内部</b><b class='flag-5'>Flash</b><b class='flag-5'>读写</b>

    GD32F303为什么启动慢?

    在MCU开发中,有一项非常重要的参数——MCU启动时间,即MCU上电后到程序开始运行这段时间。我们来看下GD32F303的datasheet中对启动时间的描述:
    的头像 发表于 02-22 11:11 461次阅读
    <b class='flag-5'>GD32F303</b>为什么启动慢?