📄 flashburn.c
字号:
#include <stdio.h>
#include "FlashBurn.h"
#include "C54xInit.h"
void EraseFlash()
{
volatile int i;
int nFlagFail;
asm(" rsbx XF");
/* for(;;)
{
*(volatile int*)FLASH_ADR1 = (int)FLASH_KEY1;
Delay(1);
}
*/
*(volatile int*)FLASH_ADR1 = (int)FLASH_KEY1;
Delay(1);
*(volatile int*)FLASH_ADR2 = (int)FLASH_KEY2;
Delay(1);
*(volatile int*)FLASH_ADR1 = (int)FLASH_KEY4;
Delay(1);
*(volatile int*)FLASH_ADR1 = (int)FLASH_KEY1;
Delay(1);
*(volatile int*)FLASH_ADR2 = (int)FLASH_KEY2;
Delay(1);
*(volatile int*)FLASH_ADR1 = (int)FLASH_KEY5;
Delay(1);
asm(" ssbx XF");
for(;;)
{
if(((*(volatile int*)FLASH_ADR1) & 0x0080) == 0x80)
{
if((*(volatile int*)FLASH_ADR1) == 0xffff)
{
printf("Chip Erase is Completed.\n");
break;
}
}
else
{
nFlagFail = (*(volatile int*)FLASH_ADR1) & 0x0020;
if(nFlagFail == 0x20)
{
if(((*(volatile int*)FLASH_ADR1) & 0x0080) == 0x80)
{
if((*(volatile int*)FLASH_ADR1) == 0xffff)
{
printf("Chip Erase is Completed.\n");
break;
}
}
else
{
printf("Chip Erase is Failed,Please Reset the Flash.\n");
break;
}
}
}
}
}
void BurnFlash(unsigned int unBurnAddress, unsigned int* unBuf, int nLength)
{
unsigned int* punBurnAddress = (unsigned int*)unBurnAddress;
unsigned int unCheck;
volatile int i,j,k;
asm(" rsbx XF");
for( i = 0 ; i < nLength ; i++ )
{
*(volatile unsigned int*)FLASH_ADR1 = (unsigned int)FLASH_KEY1;
Delay(1);
*(volatile unsigned int*)FLASH_ADR2 = (unsigned int)FLASH_KEY2;
Delay(1);
*(volatile unsigned int*)FLASH_ADR1 = (unsigned int)FLASH_KEY3;
Delay(1);
*punBurnAddress++ = unBuf[i];
Delay(200);
//if checkout
/* asm(" ssbx XF");
unCheck = *punBurnAddress;
if(unCheck != unBuf[i])
{
printf("Burn error data.\n");
break;
}
punBurnAddress++;
asm(" rsbx XF");
*/ }
asm(" ssbx XF");
}
void BurnFile(unsigned int unBurnAddress)
{
FILE *fp;
char fileName[100]; //=
//{"F:\\Project\\CounterDet\\CCS_Program\\Project_5416\\EthernetTest1-20\\Debug\\CounterDet.hex"};
volatile char cTemp;
char cLineTemp[LINELENTHMAX_BYTE];
int nLineWidth = 0;
unsigned int* punTemp = NULL;
volatile unsigned int unDataHigh_High4,unDataHigh_Low4;
volatile unsigned int unDataLow_High4,unDataLow_Low4;
volatile unsigned int unDataHigh,unDataLow;
unsigned int unData;
unsigned int unAddress = unBurnAddress;
int i;
scanf("%s",fileName);
// printf("%s\n",fileName);
if((fp = fopen(fileName, "r")) == NULL)
{
printf("No such file.\n");
return;
}
printf("Begin Erase Flash...\n");
EraseFlash();
printf("Begin Burn Flash...\n");
cTemp = fgetc(fp);
printf("%c\n",cTemp);
while(cTemp != FLAGFILESTART && cTemp != EOF)
{
cTemp = fgetc(fp);
printf("%c\n",cTemp);
}
if(cTemp == EOF)
{
printf("This is Not a Valid Hex File.");
return;
}
cTemp = fgetc(fp);
printf("%c\n",cTemp);
cTemp = fgetc(fp);
printf("%c\n",cTemp);
cTemp = fgetc(fp);
printf("%c\n",cTemp);
if(cTemp == FLAGFILEEND)
{
printf("This is An Empty File.Sure to Burn?");
return;
}
else
{
while(cTemp != FLAGFILEEND)
{
while(cTemp != FLAGLINEEND)
{
printf("%c\n",cTemp);
cLineTemp[nLineWidth++] = cTemp;
cTemp = fgetc(fp);
}
for( i = 0 ; i < nLineWidth ; )
{
cTemp = cLineTemp[i];
unDataHigh_High4 =
((cTemp >= 65) ? (cTemp - 55) : (cTemp - 48)) & 0x000f;
i++;
cTemp = cLineTemp[i];
unDataHigh_Low4 =
((cTemp >= 65) ? (cTemp - 55) : (cTemp - 48)) & 0x000f;
i++;
i++;
unDataHigh =
(unDataHigh_High4 << 4) + unDataHigh_Low4;
cTemp = cLineTemp[i];
unDataLow_High4 =
((cTemp >= 65) ? (cTemp - 55) : (cTemp - 48)) & 0x000f;
i++;
cTemp = cLineTemp[i];
unDataLow_Low4 =
((cTemp >= 65) ? (cTemp - 55) : (cTemp - 48)) & 0x000f;
i++;
i++;
unDataLow =
(unDataLow_High4 << 4) + unDataLow_Low4;
unData = ((unDataHigh << 8) & 0xff00) + (unDataLow & 0x00ff);
BurnFlash(unAddress,&unData,1);
unAddress++;
}
fgetc(fp);
cTemp = fgetc(fp);
nLineWidth = 0;
}
}
//for boot table addressing
*punTemp = unBurnAddress;
BurnFlash(0xffff,punTemp,1);
printf("Burn Finished!");
fclose(fp);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -