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

📄 flashburn.c

📁 CCS下编写的flash自举烧写的程序
💻 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 + -