Advertisement

GD32操作FLASH时注意事项

阅读量:

GD32 FLASH操作流程包括以下步骤:首先解锁并整页擦除目标地址(addr),确保写入时对应地址为0xFF;然后加锁以防止其他操作干扰。需要注意的是,在读取数据时若连续读取两次应添加SysTickDelayUs(5)以解决第一个数据checkflag读取异常的问题,并确保后续数据正常读出。

1、GD32 flash存储器的操作流程

在擦除存储地址之前先解锁以确保安全;只有当对应的存储地址被设置为0xFF后才允许对该地址执行写入操作。然而,在GD32封装库中并不存在逐个地址擦除的功能,因此必须将所有数据读取到内存后再进行写入操作。这样做的目的是避免那些无需修改的存储位置的数据可能因意外操作而被更改。

复制代码
    	fmc_unlock();
    	fmc_page_erase(addr);
    
    
    javascript

2.加锁

复制代码
    	fmc_lock();
    
    
    javascript

在进行GD32闪存操作时,请特别注意以下几点:1)确保电源供应稳定;2)正确初始化Flash存储模块;3)避免过载引起的数据丢失风险;4)定期检查Flash芯片的状态信息。

GD32在操作其内部的FLASH存储过程中发现了两个按顺序存储的数据,并发现在每次进行连续读取操作时都需要加入一个较短的时间间隔 SysTickDelay_Us(5);。如果未加入该时间间隔,则会出现第一个待检位check_flag无法被有效读取且显示值为0x0000的情况;而第二个数据则能够顺利被获取。然而,在加入了该小时间隔后,能够成功获取到两个待检位的数据。这一现象令人感到非常困惑!希望得到各位专家的解答!

复制代码
    uint16_t IAP_WriteUpdateFlag(uint32_t addr,uint16_t flag,uint8_t version)
    {
    	uint8_t value = 0;
    	uint16_t check_flag = 0;
    	uint16_t check_version = 0;
    	fmc_unlock();
    	fmc_page_erase(addr);
    	fmc_halfword_program(addr,flag);
    	fmc_flag_clear(FMC_FLAG_BANK0_END);
    	fmc_flag_clear(FMC_FLAG_BANK0_WPERR);
    	fmc_flag_clear(FMC_FLAG_BANK0_PGERR);
    	fmc_halfword_program(addr+4,version);
    	fmc_lock();
    	check_flag  = 	((*((uint16_t *)(addr)))&0xffff);
    	SysTickDelay_Us(5);
    	check_version = ((*((uint16_t *)(addr+4)))&0xffff);
    
    	return check_version ;
    }
    
    
    
    javascript
    
    
![](https://ad.itadn.com/c/weblog/blog-img/images/2025-08-16/E3nhKQGxryDRftZqOApH9JIl0LmN.png)

全部评论 (0)

还没有任何评论哟~