📄 flash.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 + -