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

📄 download.c

📁 ti tms320c6211 刷写flash的代码
💻 C
字号:
#include <stdio.h>
#include <stdlib.h>
#include "c6211dsk.h" 
#include "public.h"
#include "Drv__led.h"

#define  FLASH_ADDRS		0x90000000	
#define  SDRAM_ADDRS        0x0a0000000		
#define  SIZE				0x100


void config_emif(void)
{
	*(unsigned volatile int *)EMIF_GCR	 	 = 0x00000018;   
  	*(unsigned volatile int *)EMIF_CE1 	 	 = 0xFFFFFF13;   
  	*(unsigned volatile int *)EMIF_CE0  	 = 0xFFFFFF13;   
  	*(unsigned volatile int *)EMIF_CE2	 	 = 0xFFFFFF33;   
  	*(unsigned volatile int *)EMIF_CE3 	 	 = 0xFFFFFF13;   
  	*(unsigned volatile int *)EMIF_SDCTRL 	 = 0x07117000;   
  	*(unsigned volatile int *)EMIF_SDRP		 = 0x0000061A;   
  	*(unsigned volatile int *)EMIF_SDEXT 	 = 0x00054519;     	
}

void HardwareInit( )
{
	config_emif();
}

/*-------------------------------------------------*/
/*				Operate on flash AND timer		   */	
/*-------------------------------------------------*/

int timer0_read()
{
  int i;
  i = *(unsigned volatile int *)TIMER0_COUNT;
  return i;
}

void timer0_start()
{
  *(unsigned volatile int *)TIMER0_CTRL &= 0xff3f;
  *(unsigned volatile int *)TIMER0_CTRL |= 0x200;
  *(unsigned volatile int *)TIMER0_PRD  |= 0xffffffff;
  *(unsigned volatile int *)TIMER0_CTRL |= 0xC0;
}

void delay_msec(short msec)
{
  int timer_limit = msec*37500;   /*** timer_limit=msec/(4*Tcpu)=msec*150000/4  ***/
  int time_start;

  timer0_start();
  time_start = timer0_read();
  while ((timer0_read()-time_start) < timer_limit);
}

/*---------------------polling data---------------------*/
BOOL poll_data(US * prog_ptr, UC prog_data)
{
	UC data;
	BOOL fail = FALSE;
	do {
		data = (UC) * prog_ptr;
		if (data != prog_data) /* is D7 != Data? */
		{ 					
			if ((data & 0x20) == 0x20) /*is D5 = 1 ? */
			{ 				
				data = (UC) * prog_ptr;
				if (data != prog_data)  /* is D7 = Data? */
					fail = TRUE;
				else
					return TRUE;    /* PASS*/
			}
		}
		else
			return TRUE; /*PASS */
	   } while (!fail);

	return FALSE; /* FAIL*/
}

BOOL poll_wdata( US * prog_ptr, US prog_data )
{
	US  data;

	data = *prog_ptr;
	if( data == prog_data )
		return TRUE;

	return FALSE;
}

/*-----------------------erase flash------------------*/
BOOL erase_flash( US * flash_ptr )
{
	BOOL pass = TRUE;
	
	US * ctrl_addr1  = (US *) (flash_ptr + (0x555));
	US * ctrl_addr2  = (US *) (flash_ptr + (0x2aa));
	
	* ctrl_addr1 = 0xaa; 
	* ctrl_addr2 = 0x55; 
	* ctrl_addr1 = 0x80; 
	                 
	* ctrl_addr1 = 0xaa; 
	* ctrl_addr2 = 0x55; 
	* ctrl_addr1 = 0x10; 
	
	delay_msec(100);
	
	*(int *)EMIF_GCR = 0x00000018; 
	  
	pass = poll_data( (US *)flash_ptr, (UC)0xff);	
	
	return pass;
}

/*-----------------------program flash-----------------*/

BOOL program_flash(US * src_ptr, US * flash_ptr, US length)
{
	US  i;
	BOOL pass = TRUE;
	US data;
		
	US * ctrl_addr1 = (US *) (flash_ptr + (0x555));
	US * ctrl_addr2 = (US *) (flash_ptr + (0x2aa));
	
	for (i=0; (i<length) & pass; i++)
	{
		* ctrl_addr1 = 0xaa;
		* ctrl_addr2 = 0x55;
		* ctrl_addr1 = 0xa0;
		
		* flash_ptr++ = * src_ptr;
		data = *(US *) src_ptr++;	
		
		delay_msec(5);  /* delay 10ms */
		pass = poll_wdata( flash_ptr-1, data );
	}

	return pass;	
}

/*--------------------------------------------------------*/
/*----------------- control led --------------------------*/
/*--------------------------------------------------------*/
VOID OpenLed0(VOID)
{
	STRUCT DSPIOStruct *io_struct;
	io_struct = (STRUCT DSPIOStruct*)IO_ADDR;

	io_struct->Led0 = LED_ON;
}

VOID CloseLed0(VOID)
{
	STRUCT DSPIOStruct *io_struct;
	io_struct = (STRUCT DSPIOStruct*)IO_ADDR;

	io_struct->Led0 = LED_OFF;
}

VOID OpenLed1(VOID)
{
	STRUCT DSPIOStruct *io_struct;
	io_struct = (STRUCT DSPIOStruct*)IO_ADDR;

	io_struct->Led1 = LED_ON;
}

VOID CloseLed1(VOID)
{
	STRUCT DSPIOStruct *io_struct;
	io_struct = (STRUCT DSPIOStruct*)IO_ADDR;

	io_struct->Led1 = LED_OFF;
}

VOID open_close_led0(VOID)
{		
		OpenLed0();   
		delay_msec(MSEC);
		CloseLed0();
		delay_msec(MSEC);
}	

VOID open_close_led1(VOID)
{		
		OpenLed1();   
		delay_msec(MSEC);
		CloseLed1();
		delay_msec(MSEC);
}	

int get_filelen(FILE *fp)
{     
	INT length;
	
 	fseek(fp,0,SEEK_END);
	fgetpos(fp,&length);
	fseek(fp,0,SEEK_SET);

	return length;
}

/*---------------------------------------------*/
void main( void )
{
	FILE *fp1;
	int  file_len, times=0;
	BOOL Res;
	
	US	 i, readnum, totalnum;

    US   *dst_addr;
	US   *sdram_addr;


	HardwareInit( ); 
	
	dst_addr = (US *)FLASH_ADDRS;
	sdram_addr = (US *)SDRAM_ADDRS;

	readnum = 0;
	
	
	Res = erase_flash( dst_addr );
	
	/*fp1=fopen("d:\\liang_computer\\bootload\\led.bin","rb");*/
	
	/*fp1=fopen("d:\\debug_dsp\\dsp\\sdram\\down.bin","rb");*/

	/*fp1=fopen("c:\\lf_work\\dsp\\yyr_work\\led\\led.bin","rb");*/
	
	file_len=get_filelen(fp1);
	totalnum = file_len/sizeof(US);

	for(i=0;i<totalnum;i++)
	{
		fread(sdram_addr,sizeof(US),1,fp1);
		
		readnum++;
		sdram_addr++;

		if( readnum == 0x100 )
		{
		    open_close_led0();
			readnum = 0;    
			times++;
		}
	}

	if( Res == TRUE )
		Res = program_flash( (US *)SDRAM_ADDRS, dst_addr, totalnum);
	
	if( Res == TRUE )
	{
		while( 1 )
		{
			open_close_led0();	
			delay_msec(10);
		}
	}
	else
	{
		while( 1 )
		{
			open_close_led1();	
			delay_msec(10);
		}
	}	
     fclose(fp1);
}

⌨️ 快捷键说明

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