.c部分代码
#include "gd32_flash_word.h"
static uint32_t GDFLASH_BUF_WORD [GD_SECTOR_SIZE / 4 ];
uint32_t GDFLASH_ReadWord (uint32_t faddr)
{
return *(__IO uint32_t*)faddr;
}
void GDFLASH_Write_Word( uint32_t WriteAddr, uint32_t * pBuffer, uint16_t NumToWrite )
{
uint16_t i;
for(i=0;i<NumToWrite;i++)
{
fmc_word_program(WriteAddr,pBuffer[i]);
WriteAddr += 4;
}
}
void GDFLASH_Write_Words( uint32_t WriteAddr, uint32_t * pBuffer, uint16_t NumToWrite )
{
uint16_t secoff = 0;
uint16_t secremain = 0;
uint16_t i = 0;
uint32_t secpos = 0;
uint32_t offaddr= 0;
if(WriteAddr<FLASH_BASE||(WriteAddr>=(FLASH_BASE+1024*GD32_FLASH_SIZE)))
return;
offaddr = WriteAddr - FLASH_BASE;
secpos = offaddr / GD_SECTOR_SIZE;
secoff = (offaddr%GD_SECTOR_SIZE)/4;
secremain = GD_SECTOR_SIZE/4-secoff;
if(NumToWrite <= secremain)
secremain = NumToWrite;
fmc_bank0_unlock();
while(1)
{
GDFLASH_Read_Words(secpos*GD_SECTOR_SIZE+FLASH_BASE,GDFLASH_BUF_WORD,GD_SECTOR_SIZE/4);
for(i=0;i<secremain;i++)
{
if(GDFLASH_BUF_WORD[secoff+i] != 0XFFFFFFFF)
break;
}
if(i<secremain)
{
fmc_page_erase(FLASH_BASE+GD_SECTOR_SIZE*secpos);
for(i=0;i<secremain;i++)
{
GDFLASH_BUF_WORD[i+secoff]=pBuffer[i];
}
GDFLASH_Write_Word(secpos*GD_SECTOR_SIZE+FLASH_BASE,GDFLASH_BUF_WORD,GD_SECTOR_SIZE/4);
}
else
{
GDFLASH_Write_Word(WriteAddr,pBuffer,secremain);
}
if(NumToWrite == secremain)
break;
else
{
secpos++;
secoff=0;
pBuffer += secremain;
WriteAddr += secremain;
NumToWrite -= secremain;
if(NumToWrite>(GD_SECTOR_SIZE/4))
secremain = GD_SECTOR_SIZE/4;
else
secremain = NumToWrite;
}
};
fmc_bank0_unlock();
}
void GDFLASH_Read_Words ( uint32_t ReadAddr, uint32_t *pBuffer, uint16_t NumToRead )
{
uint16_t i;
for(i=0;i<NumToRead;i++)
{
pBuffer[i]=GDFLASH_ReadWord(ReadAddr);
ReadAddr += 4;
}
}
.h部分代码
#ifndef _GD32_FLASH_WORLD_H_
#define _GD32_FLASH_WORLD_H_
#define GD32_FLASH_SIZE 256
#define GD32_FLASH_WREN 1
#if GD32_FLASH_SIZE < 256
#define GD_SECTOR_SIZE 1024
#else
#define GD_SECTOR_SIZE 2048
#endif
uint32_t GDFLASH_ReadWord (uint32_t faddr);
void GDFLASH_Write_Word( uint32_t WriteAddr, uint32_t * pBuffer, uint16_t NumToWrite );
void GDFLASH_Write_Words( uint32_t WriteAddr, uint32_t * pBuffer, uint16_t NumToWrite);
void GDFLASH_Read_Words ( uint32_t ReadAddr, uint32_t *pBuffer, uint16_t NumToRead );
#endif