.c部分
#include "gd32_flash.h"
#if GD32_FLASH_WREN
static uint16_t GDFLASH_BUF [ GD_SECTOR_SIZE / 2 ];
#endif
uint16_t GDFLASH_ReadHalfWord (uint32_t faddr)
{
return *(__IO uint16_t*)faddr;
}
#if GD32_FLASH_WREN
void GDFLASH_Write_NoCheck ( uint32_t WriteAddr, uint16_t * pBuffer, uint16_t NumToWrite )
{
uint16_t i;
fmc_unlock();
for(i=0;i<NumToWrite;i++)
{
fmc_halfword_program(WriteAddr,pBuffer[i]);
WriteAddr+=2;
}
fmc_lock();
}
void GDFLASH_Write ( uint32_t WriteAddr, uint16_t * pBuffer, uint16_t NumToWrite )
{
uint16_t secoff;
uint16_t secremain;
uint16_t i;
uint32_t secpos;
uint32_t offaddr;
if(WriteAddr<FLASH_BASE||(WriteAddr>=(FLASH_BASE+1024*GD32_FLASH_SIZE)))
return;
fmc_unlock();
offaddr = WriteAddr-FLASH_BASE;
secpos = offaddr/GD_SECTOR_SIZE;
secoff = (offaddr%GD_SECTOR_SIZE)/2;
secremain = GD_SECTOR_SIZE/2-secoff;
if(NumToWrite<=secremain)
secremain=NumToWrite;
while(1)
{
GDFLASH_Read(secpos*GD_SECTOR_SIZE+FLASH_BASE,GDFLASH_BUF,GD_SECTOR_SIZE/2);
for(i=0;i<secremain;i++)
{
if(GDFLASH_BUF[secoff+i]!=0XFFFF)
break;
}
if(i<secremain)
{
fmc_page_erase(secpos);
for(i=0;i<secremain;i++)
{
GDFLASH_BUF[i+secoff]=pBuffer[i];
}
GDFLASH_Write_NoCheck(secpos*GD_SECTOR_SIZE+FLASH_BASE,GDFLASH_BUF,GD_SECTOR_SIZE/2);
}
else
{
GDFLASH_Write_NoCheck(WriteAddr,pBuffer,secremain);
}
if(NumToWrite==secremain)
break;
else
{
secpos++;
secoff=0;
pBuffer+=secremain;
WriteAddr+=secremain;
NumToWrite-=secremain;
if(NumToWrite>(GD_SECTOR_SIZE/2))
secremain=GD_SECTOR_SIZE/2;
else
secremain=NumToWrite;
}
};
fmc_lock();
}
#endif
void GDFLASH_Read( uint32_t ReadAddr, uint16_t *pBuffer, uint16_t NumToRead )
{
uint16_t i;
for(i=0;i<NumToRead;i++)
{
pBuffer[i]=GDFLASH_ReadHalfWord(ReadAddr);
ReadAddr+=2;
}
}
.h部分
#ifndef _GD32_FLASH_H_
#define _GD32_FLASH_H_
#define GD32_FLASH_SIZE 128
#define GD32_FLASH_WREN 1
#if GD32_FLASH_SIZE < 256
#define GD_SECTOR_SIZE 1024
#else
#define GD_SECTOR_SIZE 2048
#endif
uint16_t GDFLASH_ReadHalfWord(uint32_t faddr);
void GDFLASH_Write_NoCheck ( uint32_t WriteAddr, uint16_t * pBuffer, uint16_t NumToWrite );
void GDFLASH_Write( uint32_t WriteAddr, uint16_t * pBuffer, uint16_t NumToWrite );
void GDFLASH_Read( uint32_t ReadAddr, uint16_t * pBuffer, uint16_t NumToRead );
#endif