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

📄 main.c

📁 TI DSP 5410烧写SST400A的程序代码
💻 C
字号:
typedef unsigned int u16;

#define     ST0		    0x0006
#define     ST1			0x0007
#define  	PMST		0x001D
#define  	SWWSR		0x0028
#define  	SWCR		0x002B
#define  	BSCR		0x0029
#define 	CLKMD		0x0058

#define PMST_VAL        0x00E0     //interupt vectors from ox80  
#define SWWSR_VAL       0x7FFF     // PMST中的TPTR位与中断向量表的起始地址有关; 
#define SWCR_VAL        0x0000  
#define BSCR_VAL        0x8800
#define CLKMD_VAL		0x0287
#define ST0_VAL         0x0000
#define ST1_VAL         0xC000  //INTM=0(使能所有可屏蔽中断),CPL=1(堆栈指针SP寻址)


void ResetFlash() //FLASH复位子程序
{
	unsigned int ED=0xFFFF;
	*(volatile u16 *)ED=0x0F0;
	asm("   nop");
//	asm("   nop"); 
//    delay_10s();
}


void EraseFlash() //FLASH片擦除子程序
{
	unsigned int key1=0xD555,key2=0xAAAA;
	*(volatile u16 *)key1=0xAA;
	asm("   nop");
//	asm("   nop");
	*(volatile u16 *)key2=0x55;
	asm("   nop");
//	asm("   nop");
	*(volatile u16 *)key1=0x80;
	asm("   nop");
//	asm("   nop");
    *(volatile u16 *)key1=0xAA;
	asm("   nop");
//	asm("   nop");
	*(volatile u16 *)key2=0x55;
	asm("   nop");
//	asm("   nop");
	*(volatile u16 *)key1=0x10;
	asm("   nop");
//	asm("   nop");
//  delay_10s(); //延时10s
//	delay_10s();
//	delay_10s();
//	delay_10s();
	delay_10s();
}

void WriteFlash(int *pa,int pd)//写FLASH某个单元的子程序
{
	unsigned int key1=0xD555,key2=0xAAAA;
	*(volatile u16 *)key1=0xAAAA;
	asm("   nop");
	*(volatile u16 *)key2=0x5555;
	asm("   nop");
	*(volatile u16 *)key1=0xA0A0;	
	asm("   nop");
    *(volatile u16 *)pa=pd;
	asm("   nop");
    delay_10s(); //延时200ms
}







delay_10s()
{
	u16 k=0;
	u16 y=0;
	for(k=0;k<0x100;k++)
	{
		for(y=0;y<0x100;y++);
	}
}



void main()
 {
    int i;
	int *FlashPtr; //指向FLASH的指针
	int FlashData; //写往FLASH的数据
	int *OriMem; //代码在片内RAM的源地址
	int iDatalen; //代码段长度
	*(volatile u16 *)ST0 = ST0_VAL;
	*(volatile u16 *)ST1 = ST1_VAL;	
	
	
	
	*(volatile u16 *)CLKMD = 0x0000;         //PLL模式先转换为DIV二分频模式
	while(*(volatile u16 *)CLKMD & 0x0001){};
	*(volatile u16 *)CLKMD = CLKMD_VAL;      //DSP上电复位时,时钟默认为二分频,即10MHz,基础时钟为20MHz
	                                         //这里,初始化为PLL×5,即100MHz
		                                     //CLKMD_VAL==0x4287		  
	
	*(volatile u16 *)PMST = PMST_VAL;        //PMST_VAL==0x00ec
	*(volatile u16 *)SWWSR =SWWSR_VAL;       //SWWSR_VAL==0x7fff
	*(volatile u16 *)SWCR  =SWCR_VAL;        //WCR_VAL=0x0001
	*(volatile u16 *)BSCR  =BSCR_VAL;        //BSCR_VAL==0x8802
	asm("  ssbx xf");
	ResetFlash(); //复位FLASH
	EraseFlash(); //整片擦除FLASH
	//开始烧写FLASH,下面为Boot表引导信息
	FlashPtr=(int *)0x8000;
	FlashData=0x10AA; //16 位存储器格式
	WriteFlash(FlashPtr++,FlashData);
	FlashData=0x7FFF; // 置SWWSR 初始化值
	WriteFlash(FlashPtr++,FlashData);
	FlashData=0x0F800; // 置BSCR 初始化值
	WriteFlash(FlashPtr++,FlashData);
	FlashData=0x0000; // 程序执行入口偏移地址XPC
	WriteFlash(FlashPtr++,FlashData);
	FlashData=0x0100; // 程序执行入口地址PC
	WriteFlash(FlashPtr++,FlashData);
	FlashData=0x0e30; // 第一个程序段的长度
	WriteFlash(FlashPtr++,FlashData);
	FlashData=0x0000; // 第一个程序段要装入的内部RAM 区偏移地址
	WriteFlash(FlashPtr++,FlashData);
	FlashData=0x0100; // 第一个程序段要装入的内部RAM 区地址
	WriteFlash(FlashPtr++,FlashData);
	// 开始烧写第一段程序
	OriMem=(int *)0x0100; // 第一段程序首地址
	iDatalen=0x0e30; // 第一段程序长度
	for(i=0;i<iDatalen;i++)
	{
	FlashData=*OriMem++;
	WriteFlash(FlashPtr++,FlashData);
	}

	FlashData=0x0080; // 第二个程序段的长度
	WriteFlash(FlashPtr++,FlashData);
	FlashData=0x0000; // 第二个程序段要装入的内部RAM 区偏移地址
	WriteFlash(FlashPtr++,FlashData);
	FlashData=0x0080; // 第二个程序段要装入的内部RAM 区地址
	WriteFlash(FlashPtr++,FlashData);
	// 开始烧写第二段程序
	OriMem=(int *)0x080; // 第二段程序首地址
	iDatalen=0x080; // 第二段程序长度
	for(i=0;i<iDatalen;i++)
	{
	FlashData=*OriMem++;
	WriteFlash(FlashPtr++,FlashData);
	}
	FlashData=0x0000;
	WriteFlash(FlashPtr,FlashData);

	FlashPtr=(int *)0xFFFF;
	FlashData=0x8000;
	WriteFlash(FlashPtr,FlashData);
	asm("  nop");
	asm("  nop");
	asm("  nop");
	*(volatile u16 *)PMST =0x0080;
	for(;;);
 }

⌨️ 快捷键说明

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