
#ifndef __STFLASH_H__
#define	__STFLASH_H__

#include "config.h"

#ifndef STM32_FLASH_BASE
#define STM32_FLASH_BASE    FLASH_BASE 	    						// STM32 FLASH 的起始地址
#endif

#ifdef FLASH_END
#define	STM32_FLASH_SIZE	(FLASH_END - FLASH_BASE + 1)	 		// 所选STM32的FLASH容量大小(单位为字节)
#else
#ifdef FLASH_BANK1_END
#define	STM32_FLASH_SIZE	(FLASH_BANK1_END - FLASH_BASE + 1)	 	// 所选STM32的FLASH容量大小(单位为字节)
#endif
#endif




#if (__CORTEX_M == 0)
/*
	小于64K，每个存储块划分为1K字节的页。(F03x, F04x, F05x)

	大于等于128K，每个存储块划分为2K字节的页。(F07x, F09x)


*/
#if (STM32_FLASH_SIZE <= (64*1024))
	#define STM32_FLASH_SEC_SIZE	(1*1024) 	//
#else
  #define	STM32_FLASH_SEC_SIZE	(2*1024)	//
#endif

#define STM32_FLASH_SEC_NUM		(STM32_FLASH_SIZE/STM32_FLASH_SEC_SIZE)		// 扇区个数

#define	STM32_FLASH_RW_SIZE		(STM32_FLASH_SEC_SIZE)		// 每次读写的字节数

#elif (__CORTEX_M == 3)

/*
	小容量产品主存储块最大为4K×64位，每个存储块划分为32个1K字节的页。
	中容量产品主存储块最大为16K×64位，每个存储块划分为128个1K字节的页。
	大容量产品主存储块最大为64K×64位，每个存储块划分为256个2K字节的页。
	互联型产品主存储块最大为32K×64位，每个存储块划分为128个2K字节的页。
*/

#if (STM32_FLASH_SIZE <= (128*1024))
  #define	STM32_FLASH_SEC_SIZE	(1*1024)	// 每个扇区的字节数 1K字节
#else
  #define	STM32_FLASH_SEC_SIZE	(2*1024)	// 每个扇区的字节数 2K字节
#endif

#define STM32_FLASH_SEC_NUM		(STM32_FLASH_SIZE/STM32_FLASH_SEC_SIZE)		// 扇区个数

#define	STM32_FLASH_RW_SIZE		(STM32_FLASH_SEC_SIZE)		// 每次读写的字节数


#elif (__CORTEX_M == 4)

// STM32 FLASH 扇区的起始地址
#define STM32_FLASH_ADDR_SECTOR_0     ((u32)(STM32_FLASH_BASE + 0x000000)) 	//扇区 0 起始地址,    16 Kbytes
#define STM32_FLASH_ADDR_SECTOR_1     ((u32)(STM32_FLASH_BASE + 0x004000)) 	//扇区 1 起始地址,    16 Kbytes
#define STM32_FLASH_ADDR_SECTOR_2     ((u32)(STM32_FLASH_BASE + 0x008000)) 	//扇区 2 起始地址,    16 Kbytes
#define STM32_FLASH_ADDR_SECTOR_3     ((u32)(STM32_FLASH_BASE + 0x00C000)) 	//扇区 3 起始地址,    16 Kbytes
#define STM32_FLASH_ADDR_SECTOR_4     ((u32)(STM32_FLASH_BASE + 0x010000)) 	//扇区 4 起始地址,    64 Kbytes
#define STM32_FLASH_ADDR_SECTOR_5     ((u32)(STM32_FLASH_BASE + 0x020000)) 	//扇区 5 起始地址,  128 Kbytes
#define STM32_FLASH_ADDR_SECTOR_6     ((u32)(STM32_FLASH_BASE + 0x040000)) 	//扇区 6 起始地址,  128 Kbytes
#define STM32_FLASH_ADDR_SECTOR_7     ((u32)(STM32_FLASH_BASE + 0x060000)) 	//扇区 7 起始地址,  128 Kbytes

#if (STM32_FLASH_SIZE > (512*1024))
#define STM32_FLASH_ADDR_SECTOR_8     ((u32)(STM32_FLASH_BASE + 0x080000)) 	//扇区 8 起始地址,  128 Kbytes
#define STM32_FLASH_ADDR_SECTOR_9     ((u32)(STM32_FLASH_BASE + 0x0A0000)) 	//扇区 9 起始地址,  128 Kbytes
#define STM32_FLASH_ADDR_SECTOR_10    ((u32)(STM32_FLASH_BASE + 0x0C0000)) 	//扇区 10 起始地址, 128 Kbytes
#define STM32_FLASH_ADDR_SECTOR_11    ((u32)(STM32_FLASH_BASE + 0x0E0000)) 	//扇区 11 起始地址, 128 Kbytes

#define	STM32_FLASH_SEC_NUM		12
#else
#define	STM32_FLASH_SEC_NUM		8		// 扇区个数
#endif

#define STM32_FLASH_SIZE_SECTOR_0     ((u32)(16*1024)) 		//扇区 0 大小,    16 Kbytes
#define STM32_FLASH_SIZE_SECTOR_1     ((u32)(16*1024)) 		//扇区 1 大小,    16 Kbytes
#define STM32_FLASH_SIZE_SECTOR_2     ((u32)(16*1024)) 		//扇区 2 大小,    16 Kbytes
#define STM32_FLASH_SIZE_SECTOR_3     ((u32)(16*1024)) 		//扇区 3 大小,    16 Kbytes
#define STM32_FLASH_SIZE_SECTOR_4     ((u32)(64*1024)) 		//扇区 4 大小,    64 Kbytes
#define STM32_FLASH_SIZE_SECTOR_5     ((u32)(128*1024)) 	//扇区 5 大小,  128 Kbytes
#define STM32_FLASH_SIZE_SECTOR_6     ((u32)(128*1024)) 	//扇区 6 大小,  128 Kbytes
#define STM32_FLASH_SIZE_SECTOR_7     ((u32)(128*1024)) 	//扇区 7 大小,  128 Kbytes

#if (STM32_FLASH_SIZE > (512*1024))
#define STM32_FLASH_SIZE_SECTOR_8     ((u32)(128*1024)) 	//扇区 8 大小,  128 Kbytes
#define STM32_FLASH_SIZE_SECTOR_9     ((u32)(128*1024)) 	//扇区 9 大小,  128 Kbytes
#define STM32_FLASH_SIZE_SECTOR_10    ((u32)(128*1024)) 	//扇区 10 大小, 128 Kbytes
#define STM32_FLASH_SIZE_SECTOR_11    ((u32)(128*1024)) 	//扇区 11 大小, 128 Kbytes
#endif

#define	STM32_FLASH_RW_SIZE		(2*1024)		// 每次读写的字节数

#endif

#define STM32_APP_ADDR	    (STM32_FLASH_BASE+STM32_BOOT_SIZE) 							// 应用程序起始地址(存放在FLASH)

#ifndef STF_UPDATE_SIZE
#define STF_UPDATE_SIZE		(0)				// 升级文件存储区域的大小
#endif

#ifndef STM32_PARA_SIZE
#define STM32_PARA_SIZE		(0)				// 参数存储区域大小
#endif

#ifdef STM32_FLASH_SEC_SIZE
#define MARK_SIZE			(STM32_FLASH_RW_SIZE)			// 升级标志存储区域的大小

#define STF_UPDATE_BEGIN	(STM32_FLASH_BASE+STM32_FLASH_SIZE-STM32_PARA_SIZE-STF_UPDATE_SIZE-MARK_SIZE)

#define STM32_PARA_ADDR		(STM32_FLASH_BASE+STM32_FLASH_SIZE-STM32_PARA_SIZE)

#endif

//-------------------------------------------------------------------------
// Cortex-M4处理器,FLASH各扇区大小不一致,需无缓写入
#ifndef NO_BUFF_WHEN_WT
#define NO_BUFF_WHEN_WT		0
#endif

//-------------------------------------------------------------------------
int GetFlashSectorIdx(u32 faddr);

int STMFlashErase(u32 secIdx, int secnums);
int STMFlashRead(u32 rdAddr, u16 * pBuffer, u16 hwNumToWrite);
int STMFlashCheck(u32 ckAddr, u16 * pBuffer, u16 hwNumOfChekc);
int STMFlashWrite(u32 wrAddr, u16 * pBuffer, u16 hwNumToWrite, int svwhenera);

//-------------------------------------------------------------------------

#endif

