GD32的flash读、擦除、写操作

179 篇文章 177 订阅

GD32的flash特征

1、在flash的前256K字节空间内,CPU执行指令零等待;在此范围外,CPU读取指令存在较长延时;
2、对于flash大于512KB(不包括等于512KB)的GD32F10x_CL和GD32F10x_XD,使用了两片闪存;前512KB容量在第一片闪存(bank0)中,后续的容量在第二片闪存(bank1)中;
3、对于flash容量小于等于512KB的GD32F10x_CL和GD32F10x_HD,只使用了bank0;
4、对 于 GD32F10x_MD , 闪 存 页 大 小 为 1KB 。 GD32F10x_CL 和 GD32F10x_HD ,GD32F10x_XD,bank0的闪存页大小为2KB,bank1的闪存页大小为4KB;
5、支持32位整字或16位半字编程,页擦除和整片擦除操作;

GD32的flash结构

GD32F10x_MD

在这里插入图片描述

GD32F10x_CL,GD32F10x_HD 和 GD32F10x_XD

在这里插入图片描述

GD32的flash读操作

flash可以像普通存储空间一样直接寻址访问。

value=*(uint32_t*)FlashAddr;
uint16_t IAP_ReadFlag(void)
{
	return *(volatile uint16_t*)(FLASH_ADDR);  
}

GD32的flash擦除操作

页擦除

每一页可以被独立擦除,步骤如下:

  1. 确保FMC_CTLx寄存器不处于锁定状态;
  2. 检查FMC_STATx寄存器的BUSY位来判定闪存是否正处于擦写访问状态,若BUSY位为1,则需等待该操作结束,BUSY位变为0;
  3. 置位FMC_CTLx寄存器的PER位;
  4. 将待擦除页的绝对地址(0x08XX XXXX)写到FMC_ADDRx寄存器;
  5. 通过将FMC_CTLx寄存器的START位置1来发送页擦除命令到FMC;
  6. 等待擦除指令执行完毕,FMC_STATx寄存器的BUSY位清0;
  7. 如果需要,使用DBUS读并验证该页是否擦除成功。

代码上直接调用GD的库函数即可:

void fmc_erase_page(uint32_t Page_Address)
{
	fmc_unlock();  //fmc解锁
    /* clear all pending flags */
    fmc_flag_clear(FMC_FLAG_BANK0_END);
    fmc_flag_clear(FMC_FLAG_BANK0_WPERR);
    fmc_flag_clear(FMC_FLAG_BANK0_PGERR);
    
    /* erase the flash pages */
	fmc_page_erase(Page_Address);
	
	/* clear all pending flags */
	fmc_flag_clear(FMC_FLAG_BANK0_END);
	fmc_flag_clear(FMC_FLAG_BANK0_WPERR);
	fmc_flag_clear(FMC_FLAG_BANK0_PGERR);
	
	fmc_lock();  //fmc上锁
}

要擦除连续的几页:

void fmc_erase_pages(void)
{
    uint32_t erase_counter;

    /* unlock the flash program/erase controller */
    fmc_unlock();

    /* clear all pending flags */
    fmc_flag_clear(FMC_FLAG_BANK0_END);
    fmc_flag_clear(FMC_FLAG_BANK0_WPERR);
    fmc_flag_clear(FMC_FLAG_BANK0_PGERR);
    
    /* erase the flash pages */
    for(erase_counter = 0; erase_counter < page_num; erase_counter++){
        fmc_page_erase(FMC_WRITE_START_ADDR + (FMC_PAGE_SIZE * erase_counter));
        fmc_flag_clear(FMC_FLAG_BANK0_END);
        fmc_flag_clear(FMC_FLAG_BANK0_WPERR);
        fmc_flag_clear(FMC_FLAG_BANK0_PGERR);
    }

    /* lock the main FMC after the erase operation */
    fmc_lock();
}

整片擦除

void fmc_erase_page(uint32_t Page_Address)
{
	fmc_unlock();  //fmc解锁
    /* clear all pending flags */
    fmc_flag_clear(FMC_FLAG_BANK0_END);
    fmc_flag_clear(FMC_FLAG_BANK0_WPERR);
    fmc_flag_clear(FMC_FLAG_BANK0_PGERR);
    
    /* erase whole chip */
	fmc_mass_erase();
	
	/* clear all pending flags */
	fmc_flag_clear(FMC_FLAG_BANK0_END);
	fmc_flag_clear(FMC_FLAG_BANK0_WPERR);
	fmc_flag_clear(FMC_FLAG_BANK0_PGERR);
	
	fmc_lock();  //fmc上锁
}

GD32的flash写操作

往flash的某个地址写入数据前,一般要先擦除该地址。
16位半字编程:

void IAP_WriteFlag(uint16_t flag)
{
	fmc_unlock();
	fmc_page_erase(IAP_FLAG_ADDR); 
	fmc_halfword_program(IAP_FLAG_ADDR,flag);
	fmc_lock();
}

32位整字编程:

void fmc_program(void)
{
    /* unlock the flash program/erase controller */
    fmc_unlock();

    address = FMC_WRITE_START_ADDR;

    /* program flash */
    while(address < FMC_WRITE_END_ADDR){
        fmc_word_program(address, data0);
        address += 4;
        fmc_flag_clear(FMC_FLAG_BANK0_END);
        fmc_flag_clear(FMC_FLAG_BANK0_WPERR);
        fmc_flag_clear(FMC_FLAG_BANK0_PGERR); 
    }

    /* lock the main FMC after the program operation */
    fmc_lock();
}
  • 15
    点赞
  • 129
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 7
    评论
GD32是一款基于ARM Cortex-M3内核的微控制器系列,可以通过Flash存储器进行数据的读写操作Flash存储器是一种非易失性存储器,用于保存程序代码和数据。 首先,GD32系列微控制器的Flash存储器分为多个扇区(Sector),每个扇区的大小可以根据需要进行设置。在进行Flash读写操作之前,应该首先对Flash进行解锁。解锁操作是为了确保能够对Flash进行擦除操作。 其次,Flash操作是将Flash中的数据取到CPU的内存中。一般来说,Flash存储器的取速度比RAM存储器的取速度慢。在进行Flash操作时,需要先确定要取数据的地址和长度,然后将取到的数据存储到指定的内存空间中。 再次,Flash操作是将CPU内存中的数据入到Flash存储器中。在进行Flash操作之前,需要先对Flash进行扇区擦除操作擦除操作将指定的扇区内所有的数据擦除为1,并且只能对整个扇区进行擦除。之后,可以将需要Flash的数据加载到CPU的内存中,然后使用编程指令将内存中的数据入到指定的Flash地址中。 此外,GD32系列微控制器还提供了编程保护功能,用于保护Flash中的数据不被修改。编程保护可以设置成不同的级别,包括全局保护、保护和编程禁止保护等。通过设置编程保护,可以提高系统的安全性。 总的来说,GD32微控制器系列提供了丰富的Flash读写功能,可以满足不同应用的需求。通过灵活使用Flash存储器,可以有效地管理和存储数据,提高系统的性能和可靠性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

【ql君】qlexcel

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值