/**************************** (C) COPYRIGHT 2017 Fortiortech shenzhen *****************************
* File Name          : FU68xx_2_System.c
* Author             : Javin.Liang,Fortiortech  Appliction Team
* Version            : V1.0
* Date               : 2018-9-26
* Description        : This file contains the system function used for Motor Control.
***************************************************************************************************
* All Rights Reserved
**************************************************************************************************/
/* Includes -------------------------------------------------------------------------------------*/
#include <FU68xx_2.h>

/* Flash Program Config--------------------------------------------------------------------------*/

/*-------------------------------------------------------------------------------------------------
    Function Name : uint8 Flash_Sector_Erase(uint8 xdata *FlashAddress)
    Description   : 扇区自擦除: 指定将要擦除的Flash扇区，每个扇区128Byte，共128个扇区，
                    扇区0~127对应Flash地址0x0000~0x3fff，通过指定Flash地址来指定要擦除
                    的Flash地址所在扇区。一次只能擦除一个扇区，自擦除数据为任意值，一定
                    要在解锁后才给DPTR赋值。
    Input         : FlashAddress--Flash自擦除扇区内任意地址
    Output        : 0--Flash自擦除成功，1--Flash自擦除失败
-------------------------------------------------------------------------------------------------*/
uint8 Flash_Sector_Erase(uint8 xdata *FlashAddress)
{
    bool TempEA;

    TempEA = EA;
    EA = 0;                            //Flash自擦除前先关总中断

    if(FlashAddress < 0x3f80)          // 不擦除最后一个扇区,0X3F80~0X3FFF
    {
        FLA_CR = 0x03;                 //使能自擦除
        FLA_KEY = 0x5a;
        FLA_KEY = 0x1f;                //flash预编程解锁
        _nop_();
        *FlashAddress = 0xff;          //写任意数据
        FLA_CR = 0x08;                 //开始预编程，完成后Flash再次上锁
    }

    EA = TempEA;                       //Flash自擦除后总中断恢复 

    if(ReadBit(FLA_CR, FLAERR))
    {
        return 1;
    }
    else
    {
        return 0;
    }
}

/*-------------------------------------------------------------------------------------------------
    Function Name : uint8 Flash_Sector_Write(uint8 xdata *FlashAddress, uint8 FlashData)
    Description   : Flash自烧写: 对扇区预编程和自擦除后，可以对扇区内的地址进行Flash烧写，
                    一次烧写一个byte,一定要在解锁后才给DPTR赋值
    Input         : FlashAddress--Flash烧写地址
                    FlashData--Flash烧写数据
    Output        : 0--Flash自烧写成功，1--Flash自烧写失败
-------------------------------------------------------------------------------------------------*/
uint8 Flash_Sector_Write(uint8 xdata *FlashAddress, uint8 FlashData)
{
    bool TempEA;

    TempEA = EA;                       //Flash自烧写前先关总中断
    EA = 0;

  if(FlashAddress < 0x3f80)            // 不编程最后一个扇区,0X3F80~0X3FFF
    {
        FLA_CR = 0x01;                 // 使能Flash编程
        FLA_KEY = 0x5a;
        FLA_KEY = 0x1f;                // flash预编程解锁
        _nop_();
        *FlashAddress = FlashData;     // 写编程数据
        FLA_CR = 0x08;                 // 开始预编程，完成后Flash再次上锁
    }

    EA = TempEA;                       //Flash自烧写后总中断恢复 

    if(ReadBit(FLA_CR, FLAERR))
    {
        return 1;
    }
    else
    {
        return 0;
    }
}
