/************************************************************************************************
头文件
************************************************************************************************/
#include "HardWareFLASH.h"
#include "HardWareCLOCK.H"
#include "string.h"
/************************************************************************************************
芯片型号 GD32F103RGT6 FLASH存储大端模式
库:STM32F10X V3.5.0
可用于IAP
************************************************************************************************/
#define DEBUG_FLASHCHECK 1 // 异或校验 ,加快速度可不校验
#define Page1Size 2048
#define Page2Size 4096
#define Bank1StartAddr 0x08000000
#define Bank2StartAddr (0x08000000 + 512 * 1024)
#define Bank1PageNum 256 //页数 0~255 一页 2k ,2*256 = 512K
#define Bank2PageNum 128 //页数 0~127 一页 4K , 4*128 = 512k
/************************************************************************************************
擦除 FLASH
************************************************************************************************/
void Flash_BankErase1Page(u32 Addr32)
{
FLASH_ClearFlag(FLASH_FLAG_BSY);
FLASH_ClearFlag(FLASH_FLAG_EOP);
FLASH_ClearFlag(FLASH_FLAG_PGERR);
FLASH_ClearFlag(FLASH_FLAG_WRPRTERR);
FLASH_ErasePage(Addr32);
}
/************************************************************************************************
写 FLASH 2字节
************************************************************************************************/
void Flash_Write16(u32 Addr32,u16 Buf16)
{
u16 H16 ,L16;
u16 Data16;
H16 = ( Buf16 >> 8 ) & 0x00ff;
L16 = ( Buf16 << 8 ) & 0xff00;
Data16 = H16 | L16;
FLASH_ProgramHalfWord(Addr32, Data16);
}
/************************************************************************************************
读 FLASH 2字节
************************************************************************************************/
u16 Flash_Read16(u32 Addr32)
{
u16 Data16 , H16 , L16;
Data16 = *(vu16*) Addr32;
H16 = ( Data16 << 8 ) & 0xff00;
L16 = ( Data16 >> 8 ) & 0x00ff ;
Data16 = H16 | L16;
return Data16;
}
/************************************************************************************************
擦除 FLASH 2K 一页
************************************************************************************************/
u8 Flash_Bank1Erase1Page(u16 Page)
{
if (Page >= Bank1PageNum)
return 0;
Flash_BankErase1Page(Bank1StartAddr + Page*Page1Size);
return 1;
}
/************************************************************************************************
写 FLASH 2K 一页
************************************************************************************************/
u8 Flash_Bank1Write1Page(u16 Page, u8 *ArrayBuf )
{
u32 PageAddr32;
u8 Check1,Check2;
u16 i , H16 , L16 , Data16;
if (Page >= Bank1PageNum)
return 0;
#if DEBUG_FLASHCHECK
Check1 = CheckNOR(ArrayBuf , Page1Size);
#endif
PageAddr32 = Bank1StartAddr + Page * Page1Size;
for(i = 0;i < Page1Size/2 ; i++)
{
H16 = *(ArrayBuf + 2*i) ;
L16 = *(ArrayBuf + 2*i + 1);
H16 = H16 << 8;
Data16 = H16 | L16;
Flash_Write16(PageAddr32 + 2*i , Data16);
}
#if DEBUG_FLASHCHECK
memset(ArrayBuf,0,Page1Size);
Flash_Bank1Read1Page(Page,ArrayBuf);
Check2 = CheckNOR(ArrayBuf , Page1Size);
if ( Check1 == Check2 )
return 1;
return 0;
#else
return 1;
#endif
}
/************************************************************************************************
读 FLASH 2K 一页
************************************************************************************************/
u8 Flash_Bank1Read1Page(u16 Page,u8 *ArrayBuf)
{
u16 i , Data16;
u32 PageAddr32;
if (Page >= Bank1PageNum)
return 0;
PageAddr32 = Bank1StartAddr + Page * Page1Size;
for(i = 0;i < Page1Size/2 ; i++)
{
Data16 = Flash_Read16(PageAddr32 + 2*i);
*(ArrayBuf + 2*i) = Data16 >> 8 ;
*(ArrayBuf + 2*i +1) = Data16 ;
}
return 1;
}
/************************************************************************************************
擦除 FLASH 4K 一页
************************************************************************************************/
u8 Flash_Bank2Erase1Page(u16 Page)
{
if (Page >= Bank2PageNum)
return 0;
Flash_BankErase1Page(Bank2StartAddr + Page*Page2Size);
return 1;
}
/***********************************************************************************************
写 FLASH 4K 一页
************************************************************************************************/
u8 Flash_Bank2Write1Page(u16 Page, u8 *ArrayBuf )
{
u32 PageAddr32;
u8 Check1,Check2;
u16 i , H16 , L16 , Data16;
if (Page >= Bank2PageNum)
return 0;
#if DEBUG_FLASHCHECK
Check1 = CheckNOR(ArrayBuf , Page2Size);
#endif
PageAddr32 = Bank2StartAddr + Page * Page2Size;
for(i = 0;i < Page2Size/2;i++)
{
H16 = *(ArrayBuf + 2*i) ;
L16 = *(ArrayBuf + 2*i + 1);
H16 = H16 << 8;
Data16 = H16 | L16;
Flash_Write16(PageAddr32 + 2*i , Data16);
}
#if DEBUG_FLASHCHECK
memset(ArrayBuf,0,Page2Size);
Flash_Bank2Read1Page(Page,ArrayBuf);
Check2 = CheckNOR(ArrayBuf , Page2Size);
if ( Check1 == Check2 )
return 1;
return 0;
#else
return 1;
#endif
}
/************************************************************************************************
读 FLASH 4K 一页
************************************************************************************************/
u8 Flash_Bank2Read1Page(u16 Page,u8 *ArrayBuf)
{
u16 i , Data16;
u32 PageAddr32;
if (Page >= Bank2PageNum)
return 0;
PageAddr32 = Bank2StartAddr + Page * Page2Size;
for(i = 0;i < Page2Size/2;i++)
{
Data16 = Flash_Read16(PageAddr32 + 2*i);
*(ArrayBuf + 2*i) = Data16>>8 ;
*(ArrayBuf + 2*i + 1) = Data16;
}
return 1;
}
/************************************************************************************************/
|