各位工程师好,我自己写了一个hex文件向flash的烧写程序,但不知道为什么,烧写过程特别慢,基本上一秒钟差不多写进一个16位数据,下面是烧写的代码,能帮忙看看是哪里出问题了吗?谢谢!!
/*******************************************************/
/*** hexÎļþÏÂÔص½Flash ***/
FILE *myhex;
Uint8 symbol = 1;
short temp = 0;
Uint16 data_low,data_high,data1,data2;
Uint16 data = 0;
long i = 0,j = 0;
DSP6713_Init();
//½«¶ÔÓ¦µÄhexÎļþ·ÅÔÚ¹¤³ÌĿ¼ÖУ¬²¢½«ÏÂÃæµÄÎļþÃû×÷ÏàÓ¦¸ü¸Ä
if ((myhex = fopen("D:\\CCStudio_v3.3\\MyProjects\\SunModule6713_FlashProgrammer\\FlashSun.hex","r")) == NULL)
{
printf("wrong!");
exit(0);
}
flash_chip_erase();
while(*(int *)0x90000000 != 0xffffffff);
i = 0;
data_low = data_high = data1 = data2 = 0;
printf("Start!");
while(1)
{
fseek(myhex,i,SEEK_SET);//µÚÒ»×Ö½Ú¸ßλ
temp = getc(myhex);
if(temp == -1)
{
break;
}
while(temp == 0x000a)//Õâ¸öÓÃÓÚÏû³ý»»ÐзûµÄÓ°Ïì
{
i++;
fseek(myhex,i,SEEK_SET);
temp = getc(myhex);
}
data_high = AscII2Number(temp);
data_high = data_high<<4;
i++;
fseek(myhex,i,SEEK_SET);//µÚÒ»×Ö½ÚµÍλ
temp = getc(myhex);
while(temp == 0x000a)//Õâ¸öÓÃÓÚÏû³ý»»ÐзûµÄÓ°Ïì
{
i++;
fseek(myhex,i,SEEK_SET);
temp = getc(myhex);
}
data_low = AscII2Number(temp);
data1 = data_low | data_high;//ÐγɵÚÒ»×Ö½Ú
data1 = data1<<8; //°ÑµÚÒ»×Ö½ÚŲµ½×ֵĸßλ
i += 2;
fseek(myhex,i,SEEK_SET);//µÚ¶þ×Ö½Ú¸ßλ
temp = getc(myhex);
while(temp == 0x000a)//Õâ¸öÓÃÓÚÏû³ý»»ÐзûµÄÓ°Ïì
{
i++;
fseek(myhex,i,SEEK_SET);
temp = getc(myhex);
}
data_high = AscII2Number(temp);
data_high = data_high<<4;
i++;
fseek(myhex,i,SEEK_SET);//µÚ¶þ×Ö½ÚµÍλ
temp = getc(myhex);
while(temp == 0x000a)//Õâ¸öÓÃÓÚÏû³ý»»ÐзûµÄÓ°Ïì
{
i++;
fseek(myhex,i,SEEK_SET);
temp = getc(myhex);
}
data_low = AscII2Number(temp);
data2 = data_low | data_high;//Ðγɵڶþ×Ö½Ú
i += 2;
data = data1 | data2;//ÐγÉÕû¸ö16λ×Ö
Write_Flash_Word(&data, (Uint16 *)(0x90000000+j));
//delay();
j += 2;
}
printf("Success!");
return 0;
/*******************************************************/
short AscII2Number(short temp)
{
short number;
if((temp < 0x3a) && (temp > 0x2f))
{
number = temp - 0x30;
}
else if((temp < 0x47) && (temp > 0x40))
{
number = temp - 0x37;
}
else
{
number = temp;
}
return number;
}
int Write_Flash_Word(Uint16 *data,Uint16 *address)
{
*(volatile Uint16 *)FLASH_ADR1=0x012a;//0xaa;
*(volatile Uint16 *)FLASH_ADR2=0x0095;//0x55;
*(volatile Uint16 *)FLASH_ADR1=0x0120;//0xa0;
(*address)=*data;
//return(Toggle_Bit_Check(address));
return Pass_Flag;
}
int Read_Flash_Word(Uint16 *data,Uint16 *address)
{
*(volatile Uint16 *)FLASH_ADR1=0x012a;//0xaa;
*(volatile Uint16 *)FLASH_ADR2=0x0095;//0x55;
*(volatile Uint16 *)FLASH_ADR1=0x01b0;//0xf0;
*data=(*address);
//return(Toggle_Bit_Check(address));
return Pass_Flag;
}