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

📄 fl.c

📁 DSP编程的一些资料
💻 C
字号:

typedef unsigned int u16;
u16 add1=0xd555;   //FLASH的寄存器地址(根据开发板的空间不同而不同)
u16 add2=0xaaaa;   //FLASH的寄存器地址(根据开发板的空间不同而不同)

u16 SouProg=0x3000;    //源程序的起始地址;根据被烧程序的.CMD文件设定
u16 length=0x002B;     //源文件的长度,由被烧写得程序的.map文件可查看到。
u16 ProgAdd=0x8000;

#define  PMST    0x001D
#define  SWWSR   0x0028
#define  SWCR    0x002B
#define  BSCR    0x0029
#define  CLKMD   0x0058
#define  IMR     0x0000

#define  PMST_VAL  0x003B
#define  SWWSR_VAL 0x7fff
#define  SWCR_VAL  0x0000
#define  BSCR_VAL 0xf800
#define  IMR_VAL  0x0000

// 定义io端口
//ioport unsigned port2aaa;
//ioport unsigned port5555;
//ioport unsigned port7ffe;


void flashwr(u16 address,u16 data);

main()
{
u16 i;
u16 SouData;
u16 temp;
u16 fake;

//初始化电路板
 *(volatile u16 *)CLKMD=0x0000;
 *(volatile u16 *)SWWSR=PMST_VAL;
 *(volatile u16 *)SWCR=SWCR_VAL;
 *(volatile u16 *)BSCR=BSCR_VAL;
 *(volatile u16 *)IMR=IMR_VAL;

//使Flash进入正常工作状态;
fake=*(u16*)(0xfffe);
*(u16*)(add1)=0xaa;
fake=*(u16*)(0xfffe);
*(u16*)(add2)=0x55;
fake=*(u16*)(0xfffe);
*(u16*)(add1)=0xf0;
fake=*(u16*)(0xfffe);

//整片擦除Flash
*(u16*)(add1)=0xaa;
fake=*(u16*)(0xfffe);
*(u16*)(add2)=0x55;
fake=*(u16*)(0xfffe);
*(u16*)(add1)=0x80;
fake=*(u16*)(0xfffe);
*(u16*)(add1)=0xaa;
fake=*(u16*)(0xfffe);
*(u16*)(add2)=0x55;
fake=*(u16*)(0xfffe);
*(u16*)(add1)=0x10;
fake=*(u16*)(0xfffe);

//判断结束信号,判断dq7位是否为1;
  do {
    *(u16*)(0xfffe)=0x11;
    temp=*(u16*)(add1);
   } while((temp & 0x0080)==0x0000);
 //已完全擦除

 
 //写flash的boot表
 
 flashwr(ProgAdd,0x10aa);  // 采用16位的读取模式
 ProgAdd++;
  
 flashwr(ProgAdd,0x7fff);    //用来设置SWWSR
 ProgAdd++;
 
 flashwr(ProgAdd,0x8006);    //用来设置BSCR
 ProgAdd++;
 
 flashwr(ProgAdd,0x0000);    // 程序入口的偏移地址
  ProgAdd++;
  
 flashwr(ProgAdd,0x3000);    // 此处为程序入口地址  
  ProgAdd++;
  
 flashwr(ProgAdd,length);     //第一个程序的长度
 ProgAdd++;
 
 flashwr(ProgAdd,0x0000);     //第一个程序段的偏移地址
 ProgAdd++;
 
 flashwr(ProgAdd,0x3000);      //第一个程序段的目的地址
 ProgAdd++;

//往flash里烧入要被bootloader的程序段
  for(i=0;i<length;i++)
  {
	SouData=*(u16*)SouProg;
	flashwr(ProgAdd,SouData);
	     
	  ProgAdd++;
	  SouProg++;
	 }
	flashwr(ProgAdd,0x0000);
	flashwr(0xffff,0x8000);	  
}
    
void flashwr(u16 address,u16 data)
   {
      u16 fake;
      u16 temp1;
      u16 temp2;
      fake=*(u16*)(0xfffe);
	  *(u16*)(add1)=0xaa;
	  fake=*(u16*)(0xfffe);
	  
	  *(u16*)(add2)=0x55;
	  fake=*(u16*)(0xfffe);
	  
	 *(u16*)(add1)=0xa0;
	  fake=*(u16*)(0xfffe);
	  
	  *(u16*)(address)=data;//写数据
	  fake=*(u16*)(0xfffe);
  
	  do {
		   *(u16*)(0xfffe)=0x11;
		   temp1=*(u16*)(0x8020);
		   *(u16*)(0xfffe)=0x11;
		   temp2=*(u16*)(0x8020);
		   *(u16*)(0xfffe)=0x11;
	  	  }while((temp1 & 0x0040)!=(temp2 & 0x0040));
   }

⌨️ 快捷键说明

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