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

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

3天内不再提示

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

聚沃科技 2024-04-19 10:09 次阅读
wKgZomYgeJOAUiXJAB6mQrDJGEg027.png

4.1实验内容

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

4.2实验原理

4.2.1FMC控制器原理

FMC即Flash控制器,其提供了片上Flash操作所需要的所有功能,在GD32H7XX系列MCU中,具有高达3840KB字节的片上闪存可用于存储指令或数据。FMC也提供了扇区擦除和整片擦除操作以及编程操作。

Flash读取可以支持64字节双字、32位整字、16位半字或字节读操作;Flash编程可以支持64位双字、32位整字编程;Flash擦除支持扇区擦除和整片擦除操作。

Flash具有仅执行的专用代码读保护区域,便于芯片代码保护以及二次合作开发。

FMC框图如下所示,FMC支持用以访问代码或数据的64位AXI接口以及用以访问寄存器的32位AHB从机接口。

wKgZomYh0M2ASXBaAABWBI1KHf8769.png

闪存包括3840KB字节主闪存,分为960个扇区,扇区大小为4KB,和64KB用于引导加载程序的信息块。主存储闪存的每个扇区都可以单独擦除 。

wKgZomYh0NmADs3jAACHzfMnsTQ573.png

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

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

4.2.2Flash擦除操作原理

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

wKgaomYh0PGAK-fYAAEQucyDXmc569.png

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

wKgZomYh0P6AaAOHAABYIxnVQHU429.png

4.2.3Flash写入编程操作原理

GD32H7系列MCU可支持64位双字/32位整字编程,如下图所示,Flash 32位整字编程时间典型值为1us。

wKgaomYh0PGAK-fYAAEQucyDXmc569.png

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

wKgaomYh0SuAdNZjAACGC3qGvsg217.png

4.2.4Flash读取操作原理

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

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

注意:有关Flash有以下参数读者需要了解,GD32H7xx系列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,data_lengh_word=data_lengh/4;
int32_t data_earse_num;
uint32_t* pbuff=(uint32_t*)data_buf;

if(data_lengh%4 !=0)
{
data_lengh_word++;
}


fmc_unlock(); /* 解锁FMC */
/* 清除错误标志 */
fmc_flag_clear(FMC_FLAG_WPERR);
fmc_flag_clear(FMC_FLAG_PGSERR);
fmc_flag_clear(FMC_FLAG_RPERR);
fmc_flag_clear(FMC_FLAG_RSERR);
fmc_flag_clear(FMC_FLAG_ECCCOR);
fmc_flag_clear(FMC_FLAG_ECCDET);
fmc_flag_clear(FMC_FLAG_OBMERR);

erase_addr = write_start_addr;
data_earse_num = data_lengh;

if(write_start_addr%FLAG_PAGE_SIZE == 0) /* 若写入地址为页起始地址 */
{
for(;data_earse_num>0;)
{
fmc_sector_erase(erase_addr);
/* 清除错误标志 */
fmc_flag_clear(FMC_FLAG_WPERR);
fmc_flag_clear(FMC_FLAG_PGSERR);
fmc_flag_clear(FMC_FLAG_RPERR);
fmc_flag_clear(FMC_FLAG_RSERR);
fmc_flag_clear(FMC_FLAG_ECCCOR);
fmc_flag_clear(FMC_FLAG_ECCDET);
fmc_flag_clear(FMC_FLAG_OBMERR);
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_sector_erase(erase_addr);
/* 清除错误标志 */
fmc_flag_clear(FMC_FLAG_WPERR);
fmc_flag_clear(FMC_FLAG_PGSERR);
fmc_flag_clear(FMC_FLAG_RPERR);
fmc_flag_clear(FMC_FLAG_RSERR);
fmc_flag_clear(FMC_FLAG_ECCCOR);
fmc_flag_clear(FMC_FLAG_ECCDET);
fmc_flag_clear(FMC_FLAG_OBMERR);
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_word_program(write_addr, pbuff[data_write_num]);
/* 清除错误标志 */
fmc_flag_clear(FMC_FLAG_WPERR);
fmc_flag_clear(FMC_FLAG_PGSERR);
fmc_flag_clear(FMC_FLAG_RPERR);
fmc_flag_clear(FMC_FLAG_RSERR);
fmc_flag_clear(FMC_FLAG_ECCCOR);
fmc_flag_clear(FMC_FLAG_ECCDET);
fmc_flag_clear(FMC_FLAG_OBMERR);

write_addr+=4;
}
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.\r\n");
printf_log("Write data to internal Flash.\r\n");
fmc_write_data(WRITE_START_ADDR,write_data,sizeof(write_data)); /* 向WRITE_START_ADDR地址写入10个双字节数据 */
printf_log("Read data from internal Flash.\r\n");
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.\r\n");
for(i_num=0;i_num{
/* 校验数据 */
if(read_data[i_num]!=write_data[i_num])
{
/* 校验数据出错 */
printf_log("Error in verifying data.\r\n");
printf_log("Turn on LED1.\r\n");
bsp_led_on(&LED1);
while(1);
}else{
}
}
/* 校验数据成功 */
printf_log("Turn on LED1.\r\n");
bsp_led_on(&LED1);
printf_log("Verify that the data is correct and that the written and read data are consistent.\r\n");

while (1)
{
}
}

4.5实验结果

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

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

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

    关注

    10

    文章

    1633

    浏览量

    147937
  • FMC
    FMC
    +关注

    关注

    0

    文章

    93

    浏览量

    19674
  • 开发板
    +关注

    关注

    25

    文章

    5032

    浏览量

    97371
  • GD32
    +关注

    关注

    7

    文章

    403

    浏览量

    24326
收藏 人收藏

    评论

    相关推荐

    GD32H757Z海棠开发板使用手册】第十三讲 SDIO-SD卡读写实验

    通过本实验主要学习以下内容: •USB协议基本原理 •GD32H7xx USBHS的使用 •虚拟键盘的协议原理及使用
    的头像 发表于 06-06 11:26 1879次阅读
    【<b class='flag-5'>GD32H757Z</b><b class='flag-5'>海棠</b><b class='flag-5'>派</b><b class='flag-5'>开发板</b><b class='flag-5'>使用手册</b>】第十三讲 SDIO-SD卡读写<b class='flag-5'>实验</b>

    迅为iMX6ULL开发板使用手册资料下载

    开发板使用手册》第一部分 开发板入门第二部分 开发环境搭建第三部分 Linux系统编译第四部分 QT
    发表于 12-02 14:13

    YL-51开发板使用手册

    YL-51开发板使用手册,YL-51开发板使用手册YL-51开发板使用手册YL-51
    发表于 05-10 16:31 21次下载

    51开发板使用手册

    51开发板使用手册,感兴趣的小伙伴们可以瞧一瞧。
    发表于 11-23 15:45 11次下载

    KC705开发板英文使用手册

    KC705开发板英文使用手册
    发表于 11-01 10:19 5次下载

    iTOP-3399开发板使用手册大更新

    iTOP-3399开发板使用手册大更新
    的头像 发表于 12-10 15:46 1353次阅读
    iTOP-3399<b class='flag-5'>开发板</b><b class='flag-5'>使用手册</b>大更新

    GD32H757Z海棠开发板使用手册】第二 GPIO-按键查询检测实验

    2.1实验内容通过本实验主要学习以下内容:GPIO输入功能原理;按键查询输入检测原理;2.2实验原理2.2.1GPIO输入功能原理GD32H7XX系列MCUGPIO输入配置结构如下图所
    的头像 发表于 04-17 10:42 723次阅读
    【<b class='flag-5'>GD32H757Z</b><b class='flag-5'>海棠</b><b class='flag-5'>派</b><b class='flag-5'>开发板</b><b class='flag-5'>使用手册</b>】第二<b class='flag-5'>讲</b> GPIO-按键查询检测<b class='flag-5'>实验</b>

    GD32H757Z海棠开发板使用手册】第五 PMU-低功耗实验

    PMU即电源管理单元,其内部结构下图所示,由该图可知,GD32H7XX系列MCU具有三个电源域,包括VDD/VDDA电源域、0.9V电源域以及电池备份域,其中,VDD /VDDA域由电源直接供电
    的头像 发表于 04-20 09:32 994次阅读
    【<b class='flag-5'>GD32H757Z</b><b class='flag-5'>海棠</b><b class='flag-5'>派</b><b class='flag-5'>开发板</b><b class='flag-5'>使用手册</b>】第五<b class='flag-5'>讲</b> PMU-低功耗<b class='flag-5'>实验</b>

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

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

    GD32H757Z海棠开发板使用手册】第八 ADC-规则组多通道采样实验

    通过本实验主要学习以下内容: ADC的简介 GD32FH757 ADC工作原理 DMA和DMAMUX的原理 规则组多通道循环采样
    的头像 发表于 05-14 09:39 625次阅读
    【<b class='flag-5'>GD32H757Z</b><b class='flag-5'>海棠</b><b class='flag-5'>派</b><b class='flag-5'>开发板</b><b class='flag-5'>使用手册</b>】第八<b class='flag-5'>讲</b> ADC-规则组多通道采样<b class='flag-5'>实验</b>

    GD32H757Z海棠开发板使用手册】第九 USART-printf打印实验

    通过本实验主要学习以下内容: •串口简介 •GD32H757串口工作原理 •使用printf打印信息
    的头像 发表于 05-15 11:39 711次阅读
    【<b class='flag-5'>GD32H757Z</b><b class='flag-5'>海棠</b><b class='flag-5'>派</b><b class='flag-5'>开发板</b><b class='flag-5'>使用手册</b>】第九<b class='flag-5'>讲</b> USART-printf打印<b class='flag-5'>实验</b>

    GD32F303红枫开发板使用手册】第五 FMC-Flash擦写实验

    MC即Flash控制器,其提供了Flash操作所需要的所有功能,在GD32F303系列MCU中,Flash前256K字节空间内, CPU
    的头像 发表于 06-02 10:05 765次阅读
    【<b class='flag-5'>GD</b>32F303红枫<b class='flag-5'>派</b><b class='flag-5'>开发板</b><b class='flag-5'>使用手册</b>】第五<b class='flag-5'>讲</b> <b class='flag-5'>FMC-</b><b class='flag-5'>片</b><b class='flag-5'>内</b><b class='flag-5'>Flash</b><b class='flag-5'>擦写</b><b class='flag-5'>读</b><b class='flag-5'>实验</b>

    GD32H757Z海棠开发板使用手册】第十一讲 SPI-SPI NOR FLASH读写实验

    通过本实验主要学习以下内容: •SPI简介 •GD32H7 SPI简介 •SPI NOR FLASH——GD25Q128ESIGR简介 •使用GD3
    的头像 发表于 06-04 11:42 977次阅读
    【<b class='flag-5'>GD32H757Z</b><b class='flag-5'>海棠</b><b class='flag-5'>派</b><b class='flag-5'>开发板</b><b class='flag-5'>使用手册</b>】第十一讲 SPI-SPI NOR <b class='flag-5'>FLASH</b>读写<b class='flag-5'>实验</b>

    GD32H757Z海棠开发板使用手册】第十二 SDIO-SD卡读写实验

    SD卡是一种主要以Nand Flash作为存储介质,具有体积小、数据传输速度快以及支持热插拔的优点。如今,已被广泛应用于数码相机、便携式移动设备以及手机等多种设备中。SD卡的驱动一般有SPI接口或SDIO接口,本例程介绍使用GD32F4xx的SDIO接口驱动SD卡的实现。
    的头像 发表于 06-05 10:35 692次阅读
    【<b class='flag-5'>GD32H757Z</b><b class='flag-5'>海棠</b><b class='flag-5'>派</b><b class='flag-5'>开发板</b><b class='flag-5'>使用手册</b>】第十二<b class='flag-5'>讲</b> SDIO-SD卡读写<b class='flag-5'>实验</b>

    GD32F303红枫开发板使用手册】第二十 SPI-SPI NAND FLASH读写实验

    通过本实验主要学习以下内容: •SPI通信协议,参考19.2.1东方红开发板使用手册GD32F303 SPI操作方式,参考19.2.2东方红
    的头像 发表于 06-20 09:50 883次阅读
    【<b class='flag-5'>GD</b>32F303红枫<b class='flag-5'>派</b><b class='flag-5'>开发板</b><b class='flag-5'>使用手册</b>】第二十<b class='flag-5'>讲</b> SPI-SPI NAND <b class='flag-5'>FLASH</b>读写<b class='flag-5'>实验</b>