📄 fl.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 + -