📄 flash.txt
字号:
#define FLASH_D (int *)0x08fff0; //***************数据寄存器******************
#define FLASH_A (int *) 0x08fff2; //***************地址寄存器******************
#define FLASH_C (int *)0x08fff1; //***************命令寄存器******************
int data[20]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
//k9f1208uob最小周期60ns
void page_program_flash(int C_PageBin,int C_PageEnd,int C_BlockBin,int C_MaxBlock) //页编程子程序
{
int i;
int temp;
int *FLASH_E;
FLASH_E=FLASH_C; //写页编程命令80H,可将数据写入到FLASH缓冲区, ALE=0,CLE=1 ,WE=0,CE=0
*FLASH_E=0x80;
delay(2);
FLASH_E=FLASH_A; //待编程存储器的地址ALE=1,CLE=0,WE=0
*FLASH_E=C_PageBin; //A0~A7
delay(1);
*FLASH_E=C_PageEnd; //A9~A16
delay(1);
*FLASH_E=C_BlockBin; //A17~A24
delay(1);
*FLASH_E=C_MaxBlock; //A25
delay(1);
FLASH_E=FLASH_D; //ALE=0,CLE=0,WE=0
delay(1); //延时10ns
//for(i=0;i<5;i++)
for(i=0;i<20;i++)
{ *FLASH_E=i;
delay(4); } //0--20数据送入缓冲区
//*FLASH_E=200;
FLASH_E=FLASH_C; //ALE=0,CLE=1 ,WE=0,CE=0
*FLASH_E=0x10;
delay(6);
while(GpioDataRegs.GPGDAT.bit.GPIOG4==0); //检测R/B状态 //R/B状态为DSP的90脚,请定义GPIO90
do{ FLASH_E=FLASH_C;
*FLASH_E=0x70; //输入状态信息
delay(1);
FLASH_E=FLASH_D; //数据返回信息
delay(4); //延时50s
temp=*FLASH_E;
delay(1);
temp=temp&0x41;
}while(temp!=0x40); //检测D0位 为1出错继续查询,0正常结束
}
void block_flash(int C_blockbin,int C_Blockend,int C_MaxBlock) //**************擦除块子程序****************
{
int temp;
int *FLASH_E;
FLASH_E=FLASH_C;
*FLASH_E=0x60;
delay(1);
FLASH_E=FLASH_A;
*FLASH_E=C_blockbin; //A9~A16
delay(1);
*FLASH_E=C_Blockend; //A17~A24
delay(1);
*FLASH_E=C_MaxBlock; //A25 //块地址
delay(1);
FLASH_E=FLASH_C;
*FLASH_E=0xd0;
delay(1);
while(GpioDataRegs.GPGDAT.bit.GPIOG4==0); //检测R/B状态
do{ FLASH_E=FLASH_C;
*FLASH_E=0x70;
delay(1);
FLASH_E=FLASH_D;
delay(5);
temp=*FLASH_E;
delay(1);
temp=temp&0x41;
}while(temp!=0x40); //返回擦除信息
}
void page_read_flash(int C_PageBin,int C_PageEnd,int C_BlockBin,int C_MaxBlock) //***************页读子程序**************
{
int i=0;
int q=0;
int *FLASH_E;
FLASH_E=FLASH_C;
*FLASH_E=0x00;
delay(1);
FLASH_E=FLASH_A;
*FLASH_E=C_PageBin; //A0~A7
delay(1);
*FLASH_E=C_PageEnd; //A9~A16
delay(1);
*FLASH_E=C_BlockBin; //A17~A24
delay(1);
*FLASH_E=C_MaxBlock; //A25
delay(1);
//while(GpioDataRegs.GPGDAT.bit.GPIOG4==0); //检测R/B状态
FLASH_E=FLASH_D;
delay(3); //延时20ns
for(i=0;i<20;i++)
{ data[q]=*FLASH_E;
q++;
delay(4); } //数据从缓冲区输出
FLASH_E=FLASH_C;
}
void inti_flash() //***********初始化flash子程序*********
{ int *FLASH_E;
FLASH_E=FLASH_C;
*FLASH_E=0xff;
delay(1);
}
void RD_flash_ID() //***********读取flashID子程序*********
{ int i;
int *FLASH_E;
FLASH_E=FLASH_C;
*FLASH_E=0x90;
for(i=0;i<20;i++)
{ data[i]=*FLASH_E;
} //数据从缓冲区输出
}
void delay(int n)
{int i;
for(i=0;i<n;i++)
{asm(" NOP");}
}
// 15路通道存储地址编码列表 调用前擦除相应块
//00 00 00 00 //起始地址block0 15路通道A0---A25位地址
//00 40 01 00 //起始地址block10
//00 80 02 00 //起始地址block20
//00 c0 03 00 //起始地址block30
//00 00 05 00 //起始地址block40
//00 40 06 00 //起始地址block50
//00 80 07 00 //起始地址block60
//00 c0 08 00 //起始地址block70
//00 00 0a 00 //起始地址block80
//00 40 0b 00 //起始地址block90
//00 80 0c 00 //起始地址block100
//00 c0 0d 00 //起始地址block110
//00 00 0f 00 //起始地址block120
//00 40 0h 00 //起始地址block130
//00 80 11 00 //起始地址block140
void RWFLASH(int n) //************写FLASH****************/
{ //inti_flash(); //初始化FLASH
CACHUFLASH(n);
switch(n) //选择相应块进行操作
{case 0: page_program_flash(0x00,0x00,0x00,0x00);
break;
case 1: page_program_flash(0x00,0x40,0x01,0x00);
break;
case 2: page_program_flash(0x00,0x80,0x02,0x00);
break;
case 3: page_program_flash(0x00,0xc0,0x03,0x00);
break;
case 4: page_program_flash(0x00,0x00,0x05,0x00);
break;
case 5: page_program_flash(0x00,0x40,0x06,0x00);
break;
case 6: page_program_flash(0x00,0x80,0x07,0x00);
break;
case 7: page_program_flash(0x00,0xc0,0x08,0x00);
break;
case 8: page_program_flash(0x00,0x00,0x0a,0x00);
break;
case 9: page_program_flash(0x00,0x40,0x0b,0x00);
break;
case 10: page_program_flash(0x00,0x80,0x0c,0x00);
break;
case 11: page_program_flash(0x00,0xc0,0x0d,0x00);
break;
case 12: page_program_flash(0x00,0x00,0x0f,0x00);
break;
case 13: page_program_flash(0x00,0x40,0x10,0x00);
break;
case 14: page_program_flash(0x00,0x80,0x11,0x00);
break;
}
}
void RDFLASH(int n) //************读FLASH****************/
{ //inti_flash();
switch(n)
{case 0: page_read_flash(0x00,0x00,0x00,0x00);
break;
case 1: page_read_flash(0x00,0x40,0x01,0x00);
break;
case 2: page_read_flash(0x00,0x80,0x02,0x00);
break;
case 3: page_read_flash(0x00,0xc0,0x03,0x00);
break;
case 4: page_read_flash(0x00,0x00,0x05,0x00);
break;
case 5: page_read_flash(0x00,0x40,0x06,0x00);
break;
case 6: page_read_flash(0x00,0x80,0x07,0x00);
break;
case 7: page_read_flash(0x00,0xc0,0x08,0x00);
break;
case 8: page_read_flash(0x00,0x00,0x0a,0x00);
break;
case 9: page_read_flash(0x00,0x40,0x0b,0x00);
break;
case 10: page_read_flash(0x00,0x80,0x0c,0x00);
break;
case 11: page_read_flash(0x00,0xc0,0x0d,0x00);
break;
case 12: page_read_flash(0x00,0x00,0x0f,0x00);
break;
case 13: page_read_flash(0x00,0x40,0x10,0x00);
break;
case 14: page_read_flash(0x00,0x80,0x11,0x00);
break;
}
}
void CACHUFLASH(int n) //************擦除FLASH****************/
{ inti_flash();
switch(n)
{case 0: block_flash(0x00,0x00,0x00);
break;
case 1: block_flash(0x40,0x01,0x00);
break;
case 2: block_flash(0x80,0x02,0x00);
break;
case 3: block_flash(0xc0,0x03,0x00);
break;
case 4: block_flash(0x00,0x05,0x00);
break;
case 5: block_flash(0x40,0x06,0x00);
break;
case 6: block_flash(0x80,0x07,0x00);
break;
case 7: block_flash(0xc0,0x08,0x00);
break;
case 8: block_flash(0x00,0x0a,0x00);
break;
case 9: block_flash(0x40,0x0b,0x00);
break;
case 10: block_flash(0x80,0x0c,0x00);
break;
case 11: block_flash(0xc0,0x0d,0x00);
break;
case 12: block_flash(0x00,0x0f,0x00);
break;
case 13: block_flash(0x40,0x10,0x00);
break;
case 14: block_flash(0x80,0x11,0x00);
break;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -