⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 flash.c

📁 一个串口终端解释程序。用于单片机调试串口的超级终端应用。
💻 C
字号:
/*-----------------------------------------------------------------------*
* Copyright (c) 2005,北京四方同创保护与控制设备有限公司稳控事业部
* All rights reserved.
*
* 文件名称:Flash.c
* 摘    要:Flash子程序,定义与DSP56F807 flash操作相关的函数
*           采用CSS-200/1规约V1.02版
* 当前版本:2.00
* 作    者:胡炯
* 完成日期:2005.7
*-----------------------------------------------------------------------*/

#include "56807.h"
#include "CSFU107.h"

void ReadDataFromFlash(void);    //从FLASH中读取数据
void EraseFlash(unsigned int *FlashErasePageStartPtr);      //擦除flash子程序
void ProgramFlash(unsigned int *FlashProgramPtr, unsigned int FlashProgramData);    //写flash子程序
void StepEraseFlash(unsigned int *FlashErasePageStartPtr);      //擦除flash子程序,单步执行
void StepProgramFlash(unsigned int *FlashProgramPtr, unsigned int FlashProgramData);    //写flash子程序,单步执行
void WriteDatatoFlash(void);    //将配置信息写入flash


/*****从FLASH中读取数据*****/
void ReadDataFromFlash(void)
{
    unsigned int TempUI;
    unsigned int *TempUIPtr;
    unsigned int i;
    unsigned int TempFlag = 0;
    long TempL1, TempL2;
    int TempI;

    /*****读取V1.00版软件存储的角度补偿值*****/
    if (*OLD_CONFIG_PAGE_PTR != 0xffffffff)
    {
        TempL1 = *OLD_CONFIG_PAGE_PTR;
        if ((TempL1 <= 400000) && (TempL1 >= -400000))
        {
            TempL2 = TempL1 * 3600;
            TempI = TempL2 / 800000;
            E.CompensateValue = -TempI - 900 - 5;
            if (E.CompensateValue < -1800)
            {
                E.CompensateValue += 3600;
            }

            E.WriteFlashCompensateValue = E.CompensateValue;
            U.WriteFlashCompensateValue = U.CompensateValue;
            WriteFlashRunStat = RunStat;

            CurrFlashWritePtr = CONFIG1_PAGE_PTR;
            WriteFlashFlag = 1;
            EraseFlashStep = 1;
            for (;;)
            {
                WriteDatatoFlash();
                if (WriteFlashFlag == 0)
                {
                    break;
                }
            }
            EraseFlash((unsigned int *)OLD_CONFIG_PAGE_PTR);
            return;
        }
        else
        {
            EraseFlash((unsigned int *)OLD_CONFIG_PAGE_PTR);
        }
    }
    /*****end of 读取V1.00版软件存储的角度补偿值*****/

    if (*CONFIG1_PAGE_PTR == 0x55aa)
    {
        TempUIPtr = CONFIG1_PAGE_PTR + 1;
        i = 0;
        for (;;)
        {
            TempUI = *TempUIPtr++;
            if ((*TempUIPtr ^ TempUI) == 0xffff)
            {
                if (++i >= 3)
                {
                    TempFlag = 1;
                    break;
                }
            }
            else
            {
                EraseFlash(CONFIG1_PAGE_PTR);
                break;
            }
            TempUIPtr++;
        }
    }

    if ((TempFlag == 0) && (*CONFIG2_PAGE_PTR == 0x55aa))
    {
        TempUIPtr = CONFIG2_PAGE_PTR + 1;
        i = 0;
        for (;;)
        {
            TempUI = *TempUIPtr++;
            if ((*TempUIPtr ^ TempUI) == 0xffff)
            {
                if (++i >= 3)
                {
                    TempFlag = 2;
                    break;
                }
            }
            else
            {
                EraseFlash(CONFIG2_PAGE_PTR);
                break;
            }
            TempUIPtr++;
        }
    }

    if (TempFlag == 1)
    {
        TempUIPtr = CONFIG1_PAGE_PTR;
        CurrFlashWritePtr = CONFIG2_PAGE_PTR;
    }
    else if (TempFlag == 2)
    {
        TempUIPtr = CONFIG2_PAGE_PTR;
        CurrFlashWritePtr = CONFIG1_PAGE_PTR;
    }
    else
    {
        CurrFlashWritePtr = CONFIG1_PAGE_PTR;
        return;
    }

    if (((int)*(TempUIPtr+1) > -1800) && ((int)*(TempUIPtr+1) < 1800))
    {
        E.CompensateValue = *(TempUIPtr+1);
    }

    if (((int)*(TempUIPtr+3) > -1800) && ((int)*(TempUIPtr+3) < 1800))
    {
        U.CompensateValue = *(TempUIPtr+3);
    }

    RunStat = *(TempUIPtr+5);
    DaMode = RunStat & 0x0001;
    MeterType = RunStat & 0x8000;
    if (MeterType)
    {
        MeterAddress = ((RunStat & 0x1f00) >> 8);
    }
}
/*****end of 从FLASH中读取数据*****/


/*****擦除flash子程序*****/
void EraseFlash(unsigned int *FlashErasePageStartPtr)
{
    unsigned int EraseFlashFlag;

    EraseFlashFlag = 1;

    for (;;)
    {
        switch (EraseFlashFlag)
        {
            case 0:
                break;
            case 1:
                *DFIU_CNTL= 0;
                *DFIU_EE = ((((unsigned int)FlashErasePageStartPtr) & 0x7fff)/0x100) | 0x4000;
                //bit15(DEE)    0       Dumb Erase Disable
                //bit14(IEE)    1       Intelligent Erase Enable
                //bit6-bit0             Page Number = (欲擦除地址 & 0x7fff)/0x100
                *FlashErasePageStartPtr = 0xffff;       //启动FLASH页擦除进程
                EraseFlashFlag++;
                break;
            case 2:
                if (*DFIU_CNTL)
                {
                    break;
                }
                else
                {
                    *DFIU_EE = 0;   //clear IEE bit
                    EraseFlashFlag = 0;
                    break;
                }
            default:
                EraseFlashFlag = 0;
                break;
        }
        if (EraseFlashFlag == 0)
        {
            break;
        }
    }
}
/*****end of 擦除flash子程序*****/


/*****写flash子程序*****/
void ProgramFlash(unsigned int *FlashProgramPtr, unsigned int FlashProgramData)
{
    unsigned int ProgramFlashFlag;

    ProgramFlashFlag = 1;

    for (;;)
    {
        switch (ProgramFlashFlag)
        {
            case 0:
                break;
            case 1:
                if (*DFIU_CNTL)
                {
                    break;
                }
                else
                {
                    *DFIU_PE = ((((unsigned int)FlashProgramPtr) & 0x7fff) / 0x20) | 0x4000;
                    //bit15(DPE)    0      Dumb Program Disable
                    //bit14(IPE)    1      Intelligent Program Enable
                    //bits13-10     xxxx   reserved
                    //bits9-0(Row)  0x1a8  Row = (欲写地址 & 0x7fff)/0x20
                    asm(nop);   //必须加,不然写不进FLASH!!!
                    *FlashProgramPtr = FlashProgramData;
                    ProgramFlashFlag++;
                    break;
                }
            case 2:
                if (*DFIU_CNTL)
                {
                    break;
                }
                else
                {
                    *DFIU_PE = 0;   //clear IPE bit
                    ProgramFlashFlag = 0;
                    break;
                }
            default:
                ProgramFlashFlag = 0;
                break;
        }
        if (ProgramFlashFlag == 0)
        {
            break;
        }
    }
}
/*****end of 写flash子程序*****/


/*****擦除flash子程序,单步执行*****/
void StepEraseFlash(unsigned int *FlashErasePageStartPtr)
{
    switch (EraseFlashStep)
    {
        case 0:
            break;
        case 1:
            *DFIU_CNTL= 0;
            *DFIU_EE = ((((unsigned int)FlashErasePageStartPtr) & 0x7fff)/0x100) | 0x4000;
            //bit15(DEE)    0       Dumb Erase Disable
            //bit14(IEE)    1       Intelligent Erase Enable
            //bit6-bit0             Page Number = (欲擦除地址 & 0x7fff)/0x100
            *FlashErasePageStartPtr = 0xffff;       //启动FLASH页擦除进程
            EraseFlashStep++;
            break;
        case 2:
            if (*DFIU_CNTL)
            {
                break;
            }
            else
            {
                *DFIU_EE = 0;   //clear IEE bit
                EraseFlashStep = 0;
                break;
            }
        default:
            EraseFlashStep = 0;
            break;
    }
}
/*****end of 擦除flash子程序,单步执行*****/


/*****写flash子程序,单步执行*****/
void StepProgramFlash(unsigned int *FlashProgramPtr, unsigned int FlashProgramData)
{
    switch (ProgramFlashStep)
    {
        case 0:
            break;
        case 1:
            if (*DFIU_CNTL)
            {
                break;
            }
            else
            {
                *DFIU_PE = ((((unsigned int)FlashProgramPtr) & 0x7fff) / 0x20) | 0x4000;
                //bit15(DPE)    0      Dumb Program Disable
                //bit14(IPE)    1      Intelligent Program Enable
                //bits13-10     xxxx   reserved
                //bits9-0(Row)  0x1a8  Row = (欲写地址 & 0x7fff)/0x20
                asm(nop);   //必须加,不然写不进FLASH!!!
                *FlashProgramPtr = FlashProgramData;
                ProgramFlashStep++;
                break;
            }
        case 2:
            if (*DFIU_CNTL)
            {
                break;
            }
            else
            {
                *DFIU_PE = 0;   //clear IPE bit
                ProgramFlashStep = 0;
                break;
            }
        default:
            ProgramFlashStep = 0;
            break;
    }
}
/*****end of 写flash子程序,单步执行*****/


/*****将配置信息写入flash*****/
void WriteDatatoFlash(void)
{
    unsigned int TempUI;

    switch (WriteFlashFlag)
    {
        case 0:
            break;
        case 1:
            StepEraseFlash(CurrFlashWritePtr);
            if (EraseFlashStep == 0)
            {
                ProgramFlashStep = 1;
                WriteFlashFlag++;
            }
            break;
        case 2:
            StepProgramFlash((CurrFlashWritePtr+1), (unsigned int)E.WriteFlashCompensateValue);
            if (ProgramFlashStep == 0)
            {
                ProgramFlashStep = 1;
                WriteFlashFlag++;
            }
            break;
        case 3:
            StepProgramFlash((CurrFlashWritePtr+2), ~(unsigned int)E.WriteFlashCompensateValue);
            if (ProgramFlashStep == 0)
            {
                ProgramFlashStep = 1;
                WriteFlashFlag++;
            }
            break;
        case 4:
            StepProgramFlash((CurrFlashWritePtr+3), (unsigned int)U.WriteFlashCompensateValue);
            if (ProgramFlashStep == 0)
            {
                ProgramFlashStep = 1;
                WriteFlashFlag++;
            }
            break;
        case 5:
            StepProgramFlash((CurrFlashWritePtr+4), ~(unsigned int)U.WriteFlashCompensateValue);
            if (ProgramFlashStep == 0)
            {
                ProgramFlashStep = 1;
                WriteFlashFlag++;
            }
            break;
        case 6:
            StepProgramFlash((CurrFlashWritePtr+5), WriteFlashRunStat);
            if (ProgramFlashStep == 0)
            {
                ProgramFlashStep = 1;
                WriteFlashFlag++;
            }
            break;
        case 7:
            StepProgramFlash((CurrFlashWritePtr+6), ~WriteFlashRunStat);
            if (ProgramFlashStep == 0)
            {
                ProgramFlashStep = 1;
                WriteFlashFlag++;
            }
            break;
        case 8:
            TempUI = 0x55aa;
            StepProgramFlash(CurrFlashWritePtr, TempUI);
            if (ProgramFlashStep == 0)
            {
                EraseFlashStep = 1;
                WriteFlashFlag++;
            }
            break;
        case 9:
            if (CurrFlashWritePtr == CONFIG1_PAGE_PTR)  //擦除0x3700
            {
                CurrFlashWritePtr = CONFIG2_PAGE_PTR;       //切换下一次写入FLASH的页地址
            }
            else        //擦除0x3600
            {
                CurrFlashWritePtr = CONFIG1_PAGE_PTR;       //切换下一次写入FLASH的页地址
            }
            StepEraseFlash(CurrFlashWritePtr);
            if (EraseFlashStep == 0)
            {
                WriteFlashFlag = 0;
            }
            break;
        default:
            WriteFlashFlag = 0;
            break;
    }
}
/*****end of 将配置信息写入flash*****/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -