/*******************************************************************************
函 数 名:	Program_Write
功能说明: 	写入编程
参	  数: 	addr:    写入数据的首地址
            size:   要写入数据的大小
            data:   写入数据内容
返 回 值:	写入结果TRUE/FALSE
*******************************************************************************/
BF_BOOLEAN Program_Write(BF_INT32U addr, BF_INT32U len, BF_INT08U *data)
{
    BF_INT08U flag;

    if (len & 0x01)		//内部为半字节写入
    {
        len++;
    }
    Flash_Unlock();
    flag = Flash_Write(addr, len, data);
    Flash_lock();

    return flag;
}
BOOL	STM32_Flash_Save( uint16_t VirtualAddress, void const * Buffer, uint16_t Count )
{
    if ( ! Flash_Page_Check( EBASE_PAGE0 ))
    {
        Flash_Unlock();
        Flash_Page_Write( EBASE_PAGE0, VirtualAddress, Buffer, Count );
        if ( Flash_Page_Check( EBASE_PAGE0 ))
        {
            Flash_Page_Erase( EBASE_PAGE1 );
            Flash_Lock();
            return	TRUE;
        }
        else
        {
            ;	//	校验失败,保留当前数据
            Flash_Lock();
            return	FALSE;
        }
    }
    else
    {
        Flash_Unlock();
        Flash_Page_Write( EBASE_PAGE1, VirtualAddress, Buffer, Count );
        if ( Flash_Page_Check( EBASE_PAGE1 ))
        {
            Flash_Page_Erase( EBASE_PAGE0 );
            Flash_Lock();
            return	TRUE;
        }
        else
        {
            ;	//	校验失败,保留当前数据
            Flash_Lock();
            return	FALSE;
        }
    }
}
/*******************************************************************************
函 数 名:	Flash_WriteOptionByte
功能说明: 	写入Flash选项字节
参	  数:  addr:   选项字节地址
            data:   内容
返 回 值:	TRUE/FALSE (操作结果)
*******************************************************************************/
u8 Flash_WriteOptionByte(u32 addr, u8 data)
{
    u8 flag = FALSE;
    
    if (!Flash_Status(ProgramTime))
    {
        Flash_Unlock();
        FLASH->CR |= FLASH_CR_OPTPG;
        FLASH->CR |= FLASH_CR_STRT;
        *(vu8*)addr = data;
        if (!Flash_Status(ProgramTime))
        {
            if (Flash_EOP())
            {
                flag = TRUE;
            }
        }
        FLASH->CR &= ~FLASH_CR_OPTER;    
    }
    return flag;
}
/*******************************************************************************
函 数 名:	Flash_eraseOptionByte
功能说明: 	擦除整个Flash选项字节
参	  数:  无
返 回 值:	TRUE/FALSE (操作结果)
*******************************************************************************/
u8 Flash_EraseOptionByte(void)
{
    u8 flag = FALSE;
    
    if (!Flash_Status(ProgramTime))
    {
        Flash_Unlock();
        FLASH->CR |= FLASH_CR_OPTER;
        FLASH->CR |= FLASH_CR_STRT;
        if (!Flash_Status(ProgramTime))
        {
            if (Flash_EOP())
            {
                flag = TRUE;
            }
        }
          FLASH->CR &= ~FLASH_CR_OPTER;
        
    }
    return flag;
}