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

📄 c6000_flash.c

📁 TI 公司tms320c6000系列flash 烧写程序
💻 C
字号:
/* 
 */
/***************************************************************************/
/*                                                                         */
/*  flash . C                                                              */
/***************************************************************************/
/*Standard C .h-file */
#include <stdio.h>                 /*Standard IO    .h-file For Debug */
#include <errno.h>                 /*Standard ERROR .h-file For Debug */
#include <math.h>                  /*Standard math  .h-file For calculating */
/*Standard C64XX .h-file */
#include <c6x.h>#include <csl.h>
#include <csl_cache.h>#include <csl_emifa.h>#include <csl_gpio.h>#include <csl_edma.h>	#include <csl_irq.h>


#define  TEMP_ADDRESS              0xE000
#define  FlashCtlAddr1             0x90005555 //Program Control word address of Flash AT29LV010
#define  FlashCtlAddr2             0x90002AAA //Program Control word address of Flash AT29LV010

volatile unsigned char *TEMP = ( volatile unsigned char *)TEMP_ADDRESS;

#define  FlashMapBaseAddr   0x90000000 	//Address of flash

void init(void);
void FlashUnlock(void);
void configEMIF(void);
/* ======== main ========  */
void main()
{
unsigned int i,j,k;
char filename[128];
FILE *fp;
unsigned char *ptr=(unsigned char *)TEMP_ADDRESS;
unsigned int codelengthstart,codelengthend,codelength;
unsigned int NumOfWrCycle;
unsigned char floadtemp;
unsigned char readval;

init();
printf("Please enter the BIN filename:\n");
scanf("%s",filename);
fp = fopen(filename,"rb");
if(fp == NULL) 
 {
  printf("Open this file failed ! Check please!\n");
  exit(0);
 }
else
 {
  fseek(fp,0,SEEK_END);
  codelengthend = (int)ftell(fp);
  fseek(fp,0,SEEK_SET);
  codelengthstart = (int)ftell(fp);  
  codelength = codelengthend-codelengthstart;
 }//End of if()

printf("codelength:%d\n",codelength);
NumOfWrCycle =(int)(codelength/128)+1;//文件的大小为NumOfCycle个128字节块
printf("NumOfWrCycle:%d\n",NumOfWrCycle);

printf("Writing...... ! Wait please!\n");

for(i=0;i<NumOfWrCycle;i++)
 { 
   //先把每块128字节读到数据空间暂存
  for(j=0;j<128;j++)
  {
   if( (i*128+j)<codelength )
   {    
    fread(ptr,1,1,fp);//写128个字节
	ptr++;
   }
   else
   {    
    *ptr = 0x00;//最末的128字节块,如果现有的数据不够则追加写0
	ptr++;
   }  
  }//End of for(j=0;j<128;j++)
 //暂存空间指针归位为初始值
 for(j=0;j<128;j++)
  {   
	ptr--;   
  }
 //解锁
 FlashUnlock();
 for(j=0;j<128;j++)
  { 	
    *(volatile unsigned char *)(FlashMapBaseAddr +  (i*128+j)) = (TEMP[j] & 0x00FF);
  }
 for (k = 0; k<0x4FFFF; k++){asm("\tNOP");}
 for (k = 0; k<0x4FFFF; k++){asm("\tNOP");}
 for (k = 0; k<0x4FFFF; k++){asm("\tNOP");}

}//End of for(i=0;i<NumOfWrCycle;i++) 



for (k = 0; k<0x4FFFF; k++){asm("\tNOP");}
for (k = 0; k<0x4FFFF; k++){asm("\tNOP");}
for (k = 0; k<0x4FFFF; k++){asm("\tNOP");}
for (k = 0; k<0x4FFFF; k++){asm("\tNOP");}
for (k = 0; k<0x4FFFF; k++){asm("\tNOP");}
for (k = 0; k<0x4FFFF; k++){asm("\tNOP");}
for (k = 0; k<0x4FFFF; k++){asm("\tNOP");}
for (k = 0; k<0x4FFFF; k++){asm("\tNOP");}
FlashUnlock();//解锁
asm("\tNOP");
asm("\tNOP");
asm("\tNOP");
asm("\tNOP");
asm("\tNOP");
asm("\tNOP");
asm("\tNOP");
asm("\tNOP");
//*(volatile unsigned int*)(FlashCtlAddr3) = 0;
asm("\tNOP");
asm("\tNOP");
asm("\tNOP");
asm("\tNOP");
asm("\tNOP");
asm("\tNOP");
asm("\tNOP");
asm("\tNOP");
//*(volatile unsigned int*)(FlashCtlAddr4) = 0;
asm("\tNOP");
asm("\tNOP");
asm("\tNOP");
asm("\tNOP");
asm("\tNOP");
asm("\tNOP");
asm("\tNOP");
asm("\tNOP");
//*(volatile unsigned int*)(FlashCtlAddr3) = BOOTORIGIN>>8;//写BOOT表启动地址高位

asm("\tNOP");
asm("\tNOP");
asm("\tNOP");
asm("\tNOP");
asm("\tNOP");
asm("\tNOP");
asm("\tNOP");
asm("\tNOP");
asm("\tNOP");
asm("\tNOP");
asm("\tNOP");
asm("\tNOP");
asm("\tNOP");
asm("\tNOP");
asm("\tNOP");
asm("\tNOP");
fclose(fp);		//当前已打开的文件必须关闭

printf("Write Ok ! Begin to Check!\n");

//校验写入的对否
printf("Please enter the BIN filename:\n");
scanf("%s",filename);
fp = fopen(filename,"rb");
if(fp == NULL) 
 {
  printf("Open this file failed ! Check please!\n");
  exit(0);
 }
else
 {
  fseek(fp,0,SEEK_END);
  codelengthend = (int)ftell(fp);
  fseek(fp,0,SEEK_SET);
  codelengthstart = (int)ftell(fp);  
  codelength = codelengthend-codelengthstart;
 } //End of if()
i=0;
readval=0;
floadtemp=0;
for(i=0;i<codelength;i++)
  { 
   fread(ptr,1,1,fp);
   readval =  *(volatile unsigned char*)(FlashMapBaseAddr +  i) ;   
   floadtemp = *ptr;
   
   if( readval !=  floadtemp )
   {
    printf("%x:\n",i);
    printf("%x:\n",readval);
	printf("%x:\n",*ptr);
    printf("Check Error,Please write again!\n");
	exit(0);
   }   
  }

printf("Program is ok! Verified is ok!\n");
exit(0);
}//End of main()


void FlashUnlock(void)
 {
  unsigned int i;
  *(volatile unsigned char*)FlashCtlAddr1 = 0xAA;
  for (i = 0; i<0x20; i++){asm("\tNOP");} 
  *(volatile unsigned char*)FlashCtlAddr2 = 0x55;
  for (i = 0; i<0x20; i++){asm("\tNOP");}
  *(volatile unsigned char*)FlashCtlAddr1 = 0xA0;
  for (i = 0; i<0x20; i++){asm("\tNOP");}
 }

void init(void) 
{
	CSL_init();//Initialise the CSL library	
	configEMIF();
	return;
}

void configEMIF(void)
{
	/* Create Global Control Register field */
	unsigned int global_ctl = EMIFA_GBLCTL_DEFAULT;
	unsigned int ce0_control = EMIFA_CECTL_DEFAULT;
	            
    /* Create CE1 Control Register field */
	unsigned int ce1_control = EMIFA_CECTL_RMK(
	            EMIFA_CECTL_WRSETUP_OF(30),
	            EMIFA_CECTL_WRSTRB_OF(30),
	            EMIFA_CECTL_WRHLD_OF(30),
	            EMIFA_CECTL_RDSETUP_OF(30),
	            EMIFA_CECTL_RDSTRB_OF(30),
	            EMIFA_CECTL_MTYPE_ASYNC8,
	            EMIFA_CECTL_WRHLDMSB_OF(0),
	            EMIFA_CECTL_RDHLD_OF(30) );
	            

	unsigned int ce2_control = EMIFA_CECTL_DEFAULT;          
	unsigned int ce3_control = EMIFA_CECTL_DEFAULT;
    unsigned int sd_control = EMIFA_SDCTL_DEFAULT;                           
    unsigned int sd_timing = EMIFA_SDTIM_DEFAULT;
	unsigned int sd_ext = EMIFA_SDEXT_DEFAULT;
	unsigned int cesec0_control = EMIFA_CESEC_DEFAULT;	
	unsigned int cesec1_control = EMIFA_CESEC_DEFAULT;
	unsigned int cesec2_control = EMIFA_CESEC_DEFAULT;
	unsigned int cesec3_control = EMIFA_CESEC_DEFAULT;
	
	EMIFA_configArgs(
				EMIFA_GBLCTL_OF(global_ctl),    /* global control   */
				EMIFA_CECTL_OF(ce0_control),    /* CE0 control	    */
				EMIFA_CECTL_OF(ce1_control),    /* CE1 control 		*/
				EMIFA_CECTL_OF(ce2_control),    /* CE2 control		*/
				EMIFA_CECTL_OF(ce3_control),	/* CE3 control		*/
				EMIFA_SDCTL_OF(sd_control), 	/* SDRAM control 	*/
				EMIFA_SDTIM_OF(sd_timing),		/* SDRAM timing		*/
				EMIFA_SDEXT_OF(sd_ext),
				EMIFA_CESEC_OF(cesec0_control),
				EMIFA_CESEC_OF(cesec1_control),
				EMIFA_CESEC_OF(cesec2_control),
				EMIFA_CESEC_OF(cesec3_control)
        );
    return;
}

⌨️ 快捷键说明

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