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

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

3天内不再提示

【GD32F303红枫派开发板使用手册】第五讲 FMC-片内Flash擦写读实验

聚沃科技 2024-06-02 10:05 次阅读
wKgaomZVdiiAfR9BAB3mDFhHnZc972.png

5.1实验内容

通过本实验主要学习以下内容:

5.2实验原理

5.2.1FMC控制器原理

FMC即Flash控制器,其提供了片上Flash操作所需要的所有功能,在GD32F303系列MCU中,Flash前256K字节空间内,CPU执行指令零等待,具有相同主频下最快的代码执行效率。FMC也提供了页擦除,整片擦除,以及32位整字/16位半字/位编程等闪存操作。GD32F303系列MCU支持最大3M Flash空间,可以提供业内最大Flash的相关产品

GD32F303系列MCU的Flash结构如下图所示。由该图可知,GD32F303系列MCU可以支持最大3M的Flash空间,前256页为2KB每页,共512KB空间,后面的空间为4KB每页,信息块为存储内部出厂BOOTLOADER,中容量的GD32F303系列产品空间为2KB,大容量的GD32F303系列产品空间为6KB,互联型的GD32F305/307系列产品空间为18KB,主要是由于不同的产品所支持的ISP烧录接口不同,所需要的代码空间也会有差别。可选字节块存储的是选项字节,其空间大小为16个字节,地址范围为0x1FFFF800-0x1FFFF80F,本章主要讲解FMC的操作,有关选项字节操作可以参考选项字节操作实验。

wKgaomZb0auADhBAAAE5vVykrCc089.png

有关Flash擦写操作均需要先解锁Flash,然后进行擦写操作,擦写完成后再进行锁Flash,注意Flash特性只能由1写0,也就是Flash需要先擦除才能写入新的数据,如果确保写入地址的数据为全0xFF,也可以直接写入。读取Flash数据可以采取直接寻址的方式进行读取。

下面为各位读者介绍Flash擦写读的相关操作。

5.2.2Flash擦除操作原理

Flash擦除可分为页擦除以及整片擦除,如下图所示,页擦除时间典型值为48ms,256KB Flash的块擦除时间典型值为2S。

wKgZomZb0c2ASswvAAEH590A580334.png

有关Flash的相关操作均在gd32f30x_fmc.c中实现,下面介绍下擦除实现的函数,如下表所示。

wKgaomZb0hOARtTCAABPassmiMA901.png
  • 注意:fmc_word_reprogram可以在不用擦除的情况下直接进行位编程,但仅可实现将1编程为0,比如若调用以上fmc_word_reprogram(0x08001000,0xFE)语句,即实现将最低位编程为0,若0x08001000原始数据为0x81,则执行完后改地址数据为0x80。

5.2.4Flash读取操作原理

Flash读取可以采用直接寻址的方式进行操作,具体可参考以下示例代码。

C uint32_t read_data; read_data = *(uint32_t *)0x08001000;

  • 注意:有关Flash有以下参数读者需要了解,GD32F303系列MCU的内部Flash具有至少10万次的擦写次数以及20年的数据保持能力,但需注意,随着擦写次数的增加数据保持时间会下降。

5.3硬件设计

本例程不涉及硬件电路。

5.4代码解析

5.4.1Flash写入16bit双字节函数

Flash写入双字节操作函数如下所示,写入的过程主要分为擦写两个操作,由于Flash特有特性,需要先擦除才可以写入,因而需要确保写入地址的初识数据为0xFF。另外GD32F303具有双bank,且不同bank的页大小具有差异,本函数可以实现根据地址识别对应页并进行擦除的功能,使用上非常方便,使用者只需要关心擦写的起始地址以及数据和长度即可,擦写的位置函数中会进行实现。

C void fmc_write_data_16b(uint32_t write_start_addr, uint16_t *data_buf, uint16_t data_lengh) { uint32_t write_addr,erase_addr; uint16_t data_write_num=0; int16_t data_earse_num; /* 解锁FMC */ fmc_unlock(); /* 清除BANK0和BANK1的错误标志 */ fmc_flag_clear(FMC_FLAG_BANK0_PGERR|FMC_FLAG_BANK0_WPERR|FMC_FLAG_BANK0_END); fmc_flag_clear(FMC_FLAG_BANK1_PGERR|FMC_FLAG_BANK1_WPERR|FMC_FLAG_BANK1_END); erase_addr = write_start_addr; data_earse_num = data_lengh; /* 若写入起始地址加上总长*2小于0x08080000,说明需要擦写的数据均在BANK0,页大小为2K/页 */ if((write_start_addr+data_lengh*2)<0x08080000) { /* 若写入地址为页起始地址 */ if(write_start_addr%2048 == 0) { for(;data_earse_num>0;) { fmc_page_erase(erase_addr); erase_addr+=2048; data_earse_num-=1024; } /*若写入地址不是页起始地址*/ }else{ for(;(data_earse_num>0||erase_addr>=write_start_addr+data_lengh*2);) { fmc_page_erase(erase_addr); erase_addr+=2048; data_earse_num-=1024; } } /* 若写入地址加上写入长度*2大于0x08080000,说明擦写的数据可能跨BANK或者均在BANK1,页大小有差别 */ }else{ /* 如果起始地址小于0x08080000,说明跨BANK */ if(write_start_addr<0x08080000) { /* 首先擦除BANK0部分所需页 */ for(;erase_addr<0x08080000;) { fmc_page_erase(erase_addr); erase_addr+=2048; } /* 然后擦除BANK1部分所需页 */ erase_addr = 0x08080000; for(;erase_addr<=write_start_addr+data_lengh*2;) { fmc_page_erase(erase_addr); erase_addr+=4096; } }else{ /*若写入地址大于等于0x08080000,说明均在BANK1,页大小为4K/页*/ if(write_start_addr%4096 == 0) /* 若写入地址为页起始地址 */ { for(;data_earse_num>0;) { fmc_page_erase(erase_addr); erase_addr+=4096; data_earse_num-=2048; } }else{ /*若写入地址不是页起始地址*/ for(;(data_earse_num>0||erase_addr>=write_start_addr+data_lengh*2);) { fmc_page_erase(erase_addr); erase_addr+=4096; data_earse_num-=2048; } } } } /* 写入数据 */ write_addr = write_start_addr; for(data_write_num = 0; data_write_num

5.4.2Flash读取数据函数

Flash读取数据函数如下所示,采用直接寻址的方式,读取双字节数据。

C uint16_t fmc_read_data_16b(uint32_t write_read_addr) { return *(uint16_t *)write_read_addr; }

5.4.3主函数

主函数如下所示,通过该函数实现对flash起始地址为0x08001000的前20个字节擦写以及读取的验证。

C int main(void) { uint16_t read_num =0; uint8_t i_num; bsp_led_group_init(); fmc_write_data_16b(WRITE_START_ADDR,write_data,10); for(read_num=0;read_num<10;read_num++) { read_data[read_num] = fmc_read_data_16b(WRITE_START_ADDR+read_num*2); } for(i_num=0;i_num<10;i_num++) { if(read_data[i_num]!=write_data[i_num]) { bsp_led_on(&LED0); }else{ bsp_led_on(&LED1); } } while (1) { } }

5.5实验结果

将本实验烧录到红枫派实验板中,运行后可以观察到LED1常亮,表明擦写以及读取实验正常。

wKgZomZb0p6ADaUfAABe7izWiVg635.png

教程GD32 MCU方案商聚沃科技原创发布,了解更多GD32 MCU教程,关注聚沃科技官网

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

    关注

    6011

    文章

    44153

    浏览量

    624289
  • mcu
    mcu
    +关注

    关注

    146

    文章

    16210

    浏览量

    345445
  • FMC
    FMC
    +关注

    关注

    0

    文章

    79

    浏览量

    19580
  • 开发板
    +关注

    关注

    25

    文章

    4599

    浏览量

    95099
  • GD32F3
    +关注

    关注

    0

    文章

    11

    浏览量

    3800
收藏 人收藏

    评论

    相关推荐

    GD32H757Z海棠派开发板使用手册】第四讲 FMC-片内Flash擦写实验

    FMCFlash控制器,其提供了片上Flash操作所需要的所有功能,在GD32H7XX系列MCU中,具有高达3840KB字节的片上闪存可用于存储指令或数据。
    的头像 发表于 04-19 10:09 755次阅读
    【<b class='flag-5'>GD</b>32H757Z海棠派<b class='flag-5'>开发板</b><b class='flag-5'>使用手册</b>】第四讲 <b class='flag-5'>FMC-</b>片内<b class='flag-5'>Flash</b><b class='flag-5'>擦写</b>读<b class='flag-5'>实验</b>

    GD32F303】星空介绍

    一、开发板介绍星空GD开发板是由旗点科技推出的一款GD32开发板,板载
    发表于 09-11 17:55

    【星空GD32F303开发板试用体验】开发记录汇总

    本帖最后由 申小林一号 于 2021-10-15 14:47 编辑 开贴日期:2021年10月11日该贴主要是用于记录星空开发板使用记录以及学习GD32F303芯片的一个过程,将所有的
    发表于 10-11 16:09

    移植OpenHarmony 3.0到星空开发板

    32开发板,板载GD32F303ZET6芯片,可直接替代STM32F103和GD32F103系列。支持WiFi、4G、loRa等物联通信接口。板载F
    发表于 10-13 11:24

    【星空GD32F303开发板试用体验】-01-开启封印释放灵魂之板卡介绍和流水灯实验

    的星空GD32开发板。来一张芯片的特写,兆易创新的GD32F303ZET6 单片机这块板子提供了非常丰富的开发资料和例程代码其中还提供了视
    发表于 10-16 21:12

    【 星空GD32F303开发板试用体验】初识星空GD32F303

    本帖最后由 jinglixixi 于 2021-10-17 17:22 编辑 星空开发板是旗点科技推出的一款以GD32F303ZET6为核心的开发板,其外设资源十分丰富,相应的
    发表于 10-17 00:43

    【星空GD32F303开发板试用体验】开箱点灯

    GD32F303ZET6芯片,可直接替代STM32F103和GD32F103系列,开发板11cm x 12.2cm,外设资源丰富。 开发板
    发表于 10-17 19:43

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

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

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

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

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

    本帖最后由 cooldog123pp 于 2021-11-6 21:07 编辑 星空GD开发板是由旗点科技推出的一款GD32开发板
    发表于 11-06 21:05

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

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

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

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

    GD32F303开发板介绍

    目录如下,持续更新~~【1】星空GD32F303开发板介绍 与 文章目录1. 串口基础概念USART数据格式一般分为启动位、数据帧、可能的奇偶校验位、停止位,如图4.34所示。启动位:发送方想要
    发表于 01-17 08:06

    GD32F303固件库开发

    /qq_24312945/article/details/124325797] GD32F303固件库开发(2)----读保护与写保护 芯片读保护以后,flash将不可以从外部读取,这样可以防止别人读取或者盗取芯片代码,如果想再
    的头像 发表于 07-27 09:27 768次阅读
    <b class='flag-5'>GD32F303</b>固件库<b class='flag-5'>开发</b>

    GD32F470紫藤派开发板使用手册】第四讲 FMC-片内Flash擦写实验

    通过本实验主要学习以下内容: FMC控制器原理; FMC擦写读操作;
    的头像 发表于 05-06 11:08 479次阅读
    【<b class='flag-5'>GD</b>32F470紫藤派<b class='flag-5'>开发板</b><b class='flag-5'>使用手册</b>】第四讲  <b class='flag-5'>FMC-</b>片内<b class='flag-5'>Flash</b><b class='flag-5'>擦写</b>读<b class='flag-5'>实验</b>