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

发布者:Ziran520最新更新时间:2024-12-12 来源: elecfans关键字:FMC  片内Flash 手机看文章 扫描二维码
随时随地手机看文章

4.1实验内容

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

4.2实验原理

4.2.1FMC控制器原理

FMC即Flash控制器,其提供了片上Flash操作所需要的所有功能,在GD32F4xx系列MCU中,Flash前512KB字节空间内,CPU执行指令零等待,具有相同主频下最快的代码执行效率。FMC也提供了扇区擦除和整片擦除操作,以及32位整字/16位半字/字节编程等闪存操作。


另外GD32F470xx,GD32F427xx和GD32F425xx系列还额外提供了页(4KB)擦除操作

GD32F4xx系列MCU支持最大3M Flash空间。


GD32F4xx系列MCU可以支持最大3M的Flash空间,BANK0的空间为1MB,前4个扇区为16KB,第五个扇区为64KB,之后的扇区为128KB;BANK1的空间为2MB,前4个扇区为16KB,第五个扇区为64KB,之后七个扇区为128KB;剩下的扇区为256KB。

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

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

4.2.2Flash擦除操作原理

Flash擦除可分为扇区擦除以及整片擦除,如下图所示,扇区擦除时间典型值为200-600ms(根据扇区大小进行区分),整片擦除也根据容量大小会有差异。

wKgZomY4SMCAUDvTAAOCgyFckE0155.png?imageView2/2/w/1000

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

wKgaomY4SM2AHSJtAABznpenHIk869.png?imageView2/2/w/1000

4.2.3Flash写入编程操作原理

GD32F4xx系列MCU可支持32位整字编程/16位半字以及字节编程,如下图所示,Flash 32位整字编程时间典型值为37.5us。

wKgZomY4SMCAUDvTAAOCgyFckE0155.png?imageView2/2/w/1000

有关Flash编程实现函数如下表所示。

wKgaomY4SOWASS1xAACmNFpH5Yk690.png?imageView2/2/w/1000

4.2.4Flash读取操作原理

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

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

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

4.3硬件设计

本例程不涉及硬件电路

4.4代码解析

4.4.1Flash写入多字节函数

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

C
void fmc_write_data(uint32_t write_start_addr, uint8_t *data_buf, uint16_t data_lengh)
{
uint32_t write_addr,erase_addr;
uint16_t data_write_num=0;
int32_t data_earse_num;
fmc_unlock(); /* 解锁FMC */
/* 清除错误标志 */
fmc_flag_clear(FMC_FLAG_RDDERR|FMC_FLAG_PGSERR|FMC_FLAG_PGMERR|FMC_FLAG_WPERR|FMC_FLAG_OPERR);


erase_addr = write_start_addr;
data_earse_num = data_lengh;

if(write_start_addr%FLAG_PAGE_SIZE == 0) /* 若写入地址为页起始地址 */
{
for(;data_earse_num>0;)
{
fmc_page_erase(erase_addr);
/* 清除错误标志 */
fmc_flag_clear(FMC_FLAG_RDDERR|FMC_FLAG_PGSERR|FMC_FLAG_PGMERR|FMC_FLAG_WPERR|FMC_FLAG_OPERR);
erase_addr+=FLAG_PAGE_SIZE;
data_earse_num-=FLAG_PAGE_SIZE;
}
}else{
/*若写入地址不是页起始地址*/
for(;(data_earse_num>0||erase_addr>=write_start_addr+data_lengh);)
{
fmc_page_erase(erase_addr);
fmc_flag_clear(FMC_FLAG_RDDERR|FMC_FLAG_PGSERR|FMC_FLAG_PGMERR|FMC_FLAG_WPERR|FMC_FLAG_OPERR);
erase_addr+=FLAG_PAGE_SIZE;
data_earse_num-=FLAG_PAGE_SIZE;
}
}

/* 写入数据 */
write_addr = write_start_addr;
for(data_write_num = 0; data_write_num{
fmc_byte_program(write_addr, data_buf[data_write_num]);
fmc_flag_clear(FMC_FLAG_RDDERR|FMC_FLAG_PGSERR|FMC_FLAG_PGMERR|FMC_FLAG_WPERR|FMC_FLAG_OPERR);
write_addr++;
}
fmc_lock();
}


4.4.2Flash读取数据函数

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

C
uint8_t fmc_read_data(uint32_t write_read_addr)
{
return *(uint8_t *)write_read_addr;
}


4.4.3主函数

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

C
int main(void)
{
uint16_t read_num =0;
uint8_t i_num;
driver_init();
bsp_led_group_init();
bsp_uart_init(&BOARD_UART); /* 板载UART初始化 */
printf_log('Example of internal Flash read-write demo.rn');
printf_log('Write data to internal Flash.rn');
fmc_write_data(WRITE_START_ADDR,write_data,sizeof(write_data)); /* 向WRITE_START_ADDR地址写入10个双字节数据 */
printf_log('Read data from internal Flash.rn');
for(read_num=0;read_num{
read_data[read_num] = fmc_read_data(WRITE_START_ADDR+read_num); /* 从WRITE_START_ADDR读取10个双字节数据 */
}
printf_log('Verify the written and read data.rn');
for(i_num=0;i_num{
/* 校验数据 */
if(read_data[i_num]!=write_data[i_num])
{
/* 校验数据出错 */
printf_log('Error in verifying data.rn');
printf_log('Turn on LED1.rn');
bsp_led_on(&LED1);
while(1);
}else{
}
}
/* 校验数据成功 */
printf_log('Turn on LED1.rn');
bsp_led_on(&LED1);
printf_log('Verify that the data is correct and that the written and read data are consistent.rn');

while (1)
{
}
}


4.5实验结果

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

wKgaomY4STWACq3NACfNIcLBnHc085.png?imageView2/2/w/1000


关键字:FMC  片内Flash 引用地址:【GD32F470紫藤派开发板使用手册】第四讲 FMC-片内Flash擦写读实验

上一篇:【GD32H757Z海棠派开发板使用手册】第三讲 EXTI-按键中断检测实验
下一篇:【GD32F303红枫派开发板使用手册】第二十五讲 EXMC-外部SRAM读写实验

推荐阅读最新更新时间:2026-03-25 12:08

GD32F470紫藤开发板使用手册】第四讲 FMC-片内Flash擦写实验
4.1实验内容 通过本实验主要学习以下内容: FMC控制器原理; FMC擦写读操作; 4.2实验原理 4.2.1FMC控制器原理 FMC即Flash控制器,其提供了片上Flash操作所需要的所有功能,在GD32F4xx系列MCU中,Flash前512KB字节空间内,CPU执行指令零等待,具有相同主频下最快的代码执行效率。FMC也提供了扇区擦除和整片擦除操作,以及32位整字/16位半字/字节编程等闪存操作。 另外GD32F470xx,GD32F427xx和GD32F425xx系列还额外提供了页(4KB)擦除操作 GD32F4xx系列MCU支持最大3M Flash空间。 GD32F4xx系列MCU可以支持最大3M的Fla
[单片机]
【<font color='red'>GD32F470</font><font color='red'>紫藤</font><font color='red'>派</font><font color='red'>开发板</font>使用手册】第四讲 <font color='red'>FMC</font>-<font color='red'>片内</font><font color='red'>Flash</font><font color='red'>擦写</font><font color='red'>读</font><font color='red'>实验</font>
【GD32H757Z海棠开发板使用手册】第四讲 FMC-片内Flash擦写实验
4.1实验内容 通过本实验主要学习以下内容: FMC控制器原理; FMC擦写读操作; 4.2实验原理 4.2.1FMC控制器原理 FMC即Flash控制器,其提供了片上Flash操作所需要的所有功能,在GD32H7XX系列MCU中,具有高达3840KB字节的片上闪存可用于存储指令或数据。FMC也提供了扇区擦除和整片擦除操作以及编程操作。 Flash读取可以支持64字节双字、32位整字、16位半字或字节读操作;Flash编程可以支持64位双字、32位整字编程;Flash擦除支持扇区擦除和整片擦除操作。 Flash具有仅执行的专用代码读保护区域,便于芯片代码保护以及二次合作开发。 FMC框图如下所示,FMC支持用以访问代码或数据
[单片机]
【GD32H757Z海棠<font color='red'>派</font><font color='red'>开发板</font>使用手册】第四讲 <font color='red'>FMC</font>-<font color='red'>片内</font><font color='red'>Flash</font><font color='red'>擦写</font><font color='red'>读</font><font color='red'>实验</font>
【GD32F303红枫开发板使用手册】第五讲 FMC-片内Flash擦写实验
5.1实验内容 通过本实验主要学习以下内容: FMC控制器原理; FMC擦写读操作; 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页为
[单片机]
【GD32F303红枫<font color='red'>派</font><font color='red'>开发板</font>使用手册】第五讲 <font color='red'>FMC</font>-<font color='red'>片内</font><font color='red'>Flash</font><font color='red'>擦写</font><font color='red'>读</font><font color='red'>实验</font>
GD32F470紫藤开发板使用手册】第十讲 USART-中断串口收发实验
10.1实验内容 通过本实验主要学习以下内容: 使用中断进行串口收发 10.2实验原理 10.2.1串口寄存器介绍 串口有几个非常重要的寄存器需要读者理解。 数据寄存器(USART_DATA) 该寄存器虽然只有一个,但内部是映射为发送和接受两个寄存器。 发送时,除了发送数据寄存器,还有一个移位寄存器,当数据写入数据寄存器中,移位寄存器空闲的情况下,数据从数据寄存器中转移到移位寄存器,移位寄存器按照低bit——高bit的顺序将数据移位到IO口上。 接收时,接收到的数据保存在数据寄存器中,CPU或DMA可以从该寄存器中读接收到的数据。 状态寄存器0(USART_STAT0 ) 我们需要特别理解TBE、TC、RBNE、IDL
[单片机]
【<font color='red'>GD32F470</font><font color='red'>紫藤</font><font color='red'>派</font><font color='red'>开发板</font>使用手册】第十讲 USART-中断串口收发<font color='red'>实验</font>
GD32F470紫藤开发板使用手册】第五讲 PMU-低功耗实验
5.1实验内容 通过本实验主要学习以下内容: PMU原理; 低功耗的进入以及退出操作; 5.2实验原理 5.2.1PMU结构原理 PMU即电源管理单元,其内部结构下图所示,由该图可知,GD32F4xx系列MCU具有三个电源域,包括VDD/VDDA电源域、1.2V电源域以及电池备份域,其中,VDD /VDDA域由电源直接供电。在VDD/VDDA域中嵌入了一个LDO,用来为1.2V域供电。在备份域中有一个电源切换器,当VDD/VDDA电源关闭时,电源切换器可以将备份域的电源切换到VBAT引脚,此时备份域由VBAT引脚(电池)供电。 VDD/VDDA电源域 VDD 域为数字电源域包括HXTAL(高速外部晶体振荡器)、LD
[单片机]
【<font color='red'>GD32F470</font><font color='red'>紫藤</font><font color='red'>派</font><font color='red'>开发板</font>使用手册】第五讲 PMU-低功耗<font color='red'>实验</font>
对lpc2000系列微控制器片内flash编程的方法
本文主要是关于lpc2000的相关介绍,并着重对lpc2000的原理及其作用进行了详尽的阐述。 lpc2000 LPC2000系列的向量中断控制器(VIC)支持32个中断请求输入,也即是支持32个中断源,见表5.1。这32个中断按顺序称为VIC通道0,VIC通道1,…,VIC通道31。 每一个VIC通道都支持软件中断与硬件中断,即每个中断均可由软件或硬件中断产生,软件中断与对应通道上的硬件中断是逻辑“或”的关系。软件中断可通过置位VICSoftInt寄存器相应位来产生,也可通过置位VICSoftIntClear寄存器相应位来清除。 LPC2000具有3类中断:FIQ、向量IRQ和非向量IRQ。LPC2000系列可通过对
[单片机]
MSP430读写片内FLASH保存数据
FLASH型的MSP430单片机都带有信息存储器SegmengA及SegmentB,SegmengA及SegmentB各有128字,SegmentB的地址是:0x01000h到0x107F,SegmentA的地址是:0x01080h到0x010FFh。程序被写入MSP430之后,程序通过SegmengA及SegmentB就可以保存不掉电数据。注意:每次程序烧写到MSP430时,SegmengA及SegmentB都会被擦除! 接下来贴出本文的程序代码,以及程序写入信息存储器之后的FLASH数据: #include msp430xG43x.h void WriteSegment_256 (char index,char
[单片机]
STM32 USB 使用芯片内flash模拟U盘
这次是实现一个使用STM32内部的flash模拟一个U盘。我使用的STM32芯片是STM32F103ZE,该芯片有512K的内部flash,本次工程,我准备用最后的400K空间来模拟一个U盘。本次的工程在之前用NAND或SD卡模拟U盘的工程基础上进行修改。 首次要做的是在外设库组中添加stm32f10x_flash.c文件,因为涉及到内部flash,所以必须添加此文件。接下去,需要修改的文件只有mass_mal.c和memory.c两个了。 先来讲讲memory.c,这个文件修改量很小。在函数的前面,我们可以看到有个:uint32_t Data_Buffer ;数组的定义,该数组的数组元素个数,跟大家所使用的存储器的块大小有
[单片机]
STM32 USB 使用芯<font color='red'>片内</font>部<font color='red'>flash</font>模拟U盘
小广播
最新单片机文章
何立民专栏 单片机及嵌入式宝典

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

厂商技术中心

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

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