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