//
//
/****************************************************************************************
** 文件名称: flash.c
** 功能描述: 
** 参    数: None
** 返 回 值: None
** 作　  者: 汪仁海QQ527148813
** 日  　期: 2013年4月23日
**---------------------------------------------------------------------------------------
** 修 改 人:
** 日　  期:
**---------------------------------------------------------------------------------------
*****************************************************************************************/ 

#ifndef __FLASH_C
#define __FLASH_C

#ifdef __cplusplus
 extern "C" {
#endif	 

#include "flash.h"

	 
#define FLASH_USER_START_ADDR   ADDR_FLASH_PAGE_16   /* Start @ of user Flash area */
#define FLASH_USER_END_ADDR     ADDR_FLASH_PAGE_31 + FLASH_PAGE_SIZE   /* End @ of user Flash area */

uint32_t data_u32; 
	 
uint32_t Address = 0, PageError = 0;
	 
__IO uint32_t data32 = 0 , MemoryProgramStatus = 0;

/*Variable used for Erase procedure*/
static FLASH_EraseInitTypeDef EraseInitStruct; 

#define FLASH_SET_FLAG	0x357580df
	 
u8 FLASH_Upflag;//更新标记符
	 
//FLASH相关初始化
void FLASH_Init(void)
{
	Address = FLASH_USER_START_ADDR;
  MemoryProgramStatus = 0x0;
	
	data32 = *(__IO uint32_t *)Address;
	
//	if(data32!=FLASH_SET_FLAG)	//数据第一次初始化标记符
//	{
//		//导入第一次初始化参数+++++++++++++++++++++
//		
//		
//	}
//	else
	{
		FLASH_Read(); //FLASH读系统变量		
	}
}

void FLASH_Read(void) //FLASH读系统变量
{
  Address = FLASH_USER_START_ADDR;
  MemoryProgramStatus = 0x0;
	
	//读取系统保存的参数++++++++++++++++++++++++++
	//读取一个u32数据1********************读取标记符
	data32 = *(__IO uint32_t *)Address;
	Address = Address + 4;//地址偏移到下一个数据
	
	//读取一个u32数据2*********************读取生产日期
	data32 = *(__IO uint32_t *)Address;
	Address = Address + 4;//地址偏移到下一个数据
	//数据限制范围
	if((data32<0xFFFFFFFF)&(data32>0x07E20C15))
	{		
		
	}
	else
	{		
		
	}
	
	//读取一个u32数据3
	data32 = *(__IO uint32_t *)Address;
	Address = Address + 4;//地址偏移到下一个数据
	//数据限制范围
	if((data32<0xFFFFFFFF)&(data32>0x07E20C15))
	{		
		
	}
	else
	{		
		
	}
	
	//读取一个u32数据4
	data32 = *(__IO uint32_t *)Address;
	Address = Address + 4;//地址偏移到下一个数据
	//数据限制范围
	if((data32<0xFFFFFFFF)&(data32>0x07E20C15))
	{		
		
	}
	else
	{		
		
	}
}


void FLASH_Save(void)//FLASH保存系统变量
{
  /* Unlock the Flash to enable the flash control register access *************/
  HAL_FLASH_Unlock();
	
  /* Fill EraseInit structure*/
  EraseInitStruct.TypeErase = FLASH_TYPEERASE_PAGES;
  EraseInitStruct.PageAddress = FLASH_USER_START_ADDR;
  EraseInitStruct.NbPages = (FLASH_USER_END_ADDR - FLASH_USER_START_ADDR) / FLASH_PAGE_SIZE;
 
	if (HAL_FLASHEx_Erase(&EraseInitStruct, &PageError) != HAL_OK)
  {				
	}
	
	Address = FLASH_USER_START_ADDR;	//起始地址
	
	//写数据1，按u32格式写，小于U32也按U32格式对齐写
	//写入FLASH_SET_FLAG*********************************写入标记符
	data_u32=FLASH_SET_FLAG;	//转换保存参数为u32格式
	HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD, Address,data_u32);
	Address = Address + 4;//增加一个u32的4个字节地址

	
	//写入数据2******************************************
//	data_u32=0;	//转换保存参数为u32格式
	HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD, Address,data_u32);
	Address = Address + 4;//增加一个u32的4个字节地址
	
	//写入数据3******************************************
//	data_u32=0x222222;	//转换保存参数为u32格式
	HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD, Address,data_u32);
	Address = Address + 4;//增加一个u32的4个字节地址
	
	//写入数据4******************************************
//	data_u32=0x222222;	//转换保存参数为u32格式
	HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD, Address,data_u32);
	Address = Address + 4;//增加一个u32的4个字节地址
	
	/* Lock the Flash to disable the flash control register access (recommended
	 to protect the FLASH memory against possible unwanted operation) *********/
  HAL_FLASH_Lock();
	
	//保存参数后读取参数
	FLASH_Read(); //FLASH读系统变量
}


/**************************************************************
** 函数名称: myFLASH_WriteWord
** 功能描述: 从FLASH指定地址，按U8格式，读取指定长度的数据
** 参    数: None
** 返 回 值: None
** 作　  者: 汪仁海
** 日  　期: 2013年3月10日
**--------------------------------------------------------------
** 备注：WriteAddress: 地址是从STARTADDR地址开始偏移地址
				 WriteData：	写入的U32类型数据值
** 修 改 人:
** 日　  期:
**--------------------------------------------------------------
****************************************************************/ 
void myFLASH_WriteWord(u32 WriteAddress,u32 WriteData)
{
//  HAL_FLASH_Unlock();			       //每次擦除Flash中数据时得先解锁
		HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD, WriteAddress,WriteData);
//  HAL_FLASH_Lock();				       //上锁
} 


/**************************************************************
** 函数名称: myFLASH_ReadWord
** 功能描述: 从FLASH指定地址，按U32格式，读取U32数据
** 参    数: None
** 返 回 值: None
** 作　  者: 汪仁海
** 日  　期: 2013年3月10日
**--------------------------------------------------------------
** 备注：ReadAddress: 地址是从STARTADDR地址开始偏移地址
** 修 改 人:
** 日　  期:
**--------------------------------------------------------------
****************************************************************/ 
u32 myFLASH_ReadWord(u32 addr)
{ 
   u32 data;
   data=*(__IO uint32_t *)(addr); //读取相应地址中的32位数据
   return data;
}

#ifdef __cplusplus
}
#endif
#endif /*__FLASH_C */

