本帖最后由 ad777 于 2020-11-3 11:14 编辑
#include "flash_rw.h"
#include "gd32f10x.h"
#include "systick.h"
#define Base_Addr 0x0870f800 //第255页 bank1 大小两Kb
#define EEP_MAX 256 //256字节的存储空间 一方面减轻ram压力 另一方面减少flash操作时间
/***********************************************************************
函 数 名:Flash_Read_HalfWord
功 能:flash半字读取
输入参数:相对地址 0-128
返回参数:读出来的值
说 明:
***********************************************************************/
unsigned short int Flash_Read_HalfWord(unsigned faddr)
{
return *(unsigned short int*)(faddr*2+Base_Addr);//返回输入地址中的值
}
/***********************************************************************
函 数 名:Flash_Read
功 能:读取指定长度的数据
输入参数:相对地址 0-128 读取使用的数组 16位 要读取的长度
返回参数:
说 明:
***********************************************************************/
void Flash_Read(unsigned int addr,unsigned short int *redata,unsigned short int renum)
{
unsigned short int i;
for(i = 0;i<renum;i++)
{
*(redata+i*2) = Flash_Read_HalfWord(addr+i);//开始读
}
}
/***********************************************************************
函 数 名:Flash_Write_Byte
功 能:flash半字写
输入参数:相对地址 0-128,16位的数据指针 写入的数量
返回参数:1成功 2地址超出设置范围
说 明:
***********************************************************************/
unsigned char Flash_Write_Byte(unsigned int uaddr,unsigned short int *data16,unsigned short int datanum)
{
unsigned short int i;
unsigned char Nclear = 0;
unsigned short int tempdata[EEP_MAX/2];
if(uaddr>EEP_MAX/2)return 2;//输入超出设置范围
fmc_unlock();//Flash解锁
fmc_bank1_unlock();//Flash解锁
fmc_flag_clear(FMC_FLAG_BANK0_END);
fmc_flag_clear(FMC_FLAG_BANK0_WPERR);
fmc_flag_clear(FMC_FLAG_BANK0_PGERR);
for(i = 0;i<datanum;i++)
{
if(Flash_Read_HalfWord(uaddr+i)!=0xffff)Nclear = 1;//需要清除flash
}
if(Nclear == 1)
{
for(i = 0;i<EEP_MAX/2;i++)//读出数据
{
tempdata[i]=Flash_Read_HalfWord(uaddr+i);
}
for(i = 0;i<datanum;i++)
{
tempdata[uaddr+i] = *(data16+i*2);//写入数据到缓存数组
}
fmc_page_erase(Base_Addr);
for(i = 0;i<EEP_MAX/2;i++)
{
fmc_halfword_program(Base_Addr+i*2,tempdata[i]);//整个区域写入
}
}
else
{
for(i = 0;i<datanum;i++)
{
fmc_halfword_program(Base_Addr+(uaddr+i)*2,*(data16+i*2));//写入
}
}
fmc_bank0_lock();//Flash上锁
fmc_lock();//Flash上锁
return 1;
}
|