📄 flash.c
字号:
break;
}
if (j < 4)
break;
}
if (i == 0) FCNFG &= 0xFE; //页号3C~3F,选择BLOCK0
if (i == 1) FCNFG |= 0x01; //页号38~3B,选择BLOCK1
}
PPAGE=page;
for(m=0;m<len;m++)
{
ch[m]=*(uint *)addr;
addr=addr+2;
}
}
//-------------------------------------------------------------------------*
//Flash_Write_Word:向指定Flash地址中写入一个字-----------------------------*
//功 能:读取指定页号为page,地址为addr的字节, *
//参 数:page--页映射地址(0x38,0x39,0x3A,0x3B,0x3C,0x3D,0x3E,0x3F) *
// addr--目标地址 *
// data--将被写入的字 *
//返 回:无 *
//注 意:FLASH存储区的两个字节表示一个字 *
//-------------------------------------------------------------------------*
void Flash_Write_Word(uchar page,uint addr,uint data0)
{
Erase_Write_Pretreat(page); //擦写子函数共同调用的内部子函数
PPAGE = page; //设置页寄存器
*(uint *)addr = data0;
FCMD = 0x20;
asm("CALL PrgOfRam");
}
//-------------------------------------------------------------------------*
//Flash_Read_Word:读指定Flash地址中的内容----------------------------------*
//功 能:读取指定页号为page,地址为addr的字节, *
//参 数:page--页映射地址(0x38,0x39,0x3A,0x3B,0x3C,0x3D,0x3E,0x3F) *
// addr--源目标地址 *
//返 回:源目标地址存储的字 *
//注 意:FLASH存储区的两个字节表示一个字 *
//-------------------------------------------------------------------------*
uint Flash_Read_Word(uchar page,uint addr)
{
uchar i,j;
if (page != 0)
{
for (i = 0;i < 2;i++)
{
for (j = 0;j < 4;j++)
{
if (page == pagetable[i][j])
break;
}
if (j < 4)
break;
}
if (i == 0) FCNFG &= 0xFE; //页号3C~3F,选择BLOCK0
if (i == 1) FCNFG |= 0x01; //页号38~3B,选择BLOCK1
}
PPAGE=page;
return (*(uint *)addr);
}
//-------------------------------------------------------------------------*
//Flash_Get_Word:读指定Flash地址中的内容 ----------------------------------*
//功 能:根据data值查找坐标中对应的y值 *
//参 数:page --页映射地址(0x38,0x39,0x3A,0x3B,0x3C,0x3D,0x3E,0x3F) *
// fst_addr--数据存储区首地址 *
// length --数据存储区长度(字) *
// data --用于查找的x坐标值 *
//返 回:对应的y值地址存储的字 *
//注 意:此处所涉及的长度均按字计算 *
//-------------------------------------------------------------------------*
uint Flash_Get_Word(uchar page,uint fst_addr,uint length,uint data0)
{
uint i=0x00,j=0x00,temp;
if (page != 0)
{
for (i = 0;i < 2;i++)
{
for (j = 0;j < 4;j++)
{
if (page == pagetable[i][j])
break;
}
if (j < 4)
break;
}
if (i == 0) FCNFG &= 0xFE; //页号3C~3F,选择BLOCK0
if (i == 1) FCNFG |= 0x01; //页号38~3B,选择BLOCK1
}
PPAGE=page;
temp=length/2;
for(i=0x00;i<temp;i++)
{
if(*(uint *)(fst_addr+2*i)==data0)
break;
}
temp=*(uint *)(fst_addr+2*(i+temp));
return temp;
}
//-------------------------------------------------------------------------*
//Flash_Erase_Ready:为写入数据做准备 ----------------------------------*
//功 能:根据输入帧的相应指令擦除扇区 *
//参 数:page --页映射地址(0x38,0x39,0x3A,0x3B,0x3C,0x3D,0x3E,0x3F) *
// 如果设置未0,则接着上一数据存储区页码 *
// ID --曲线的ID索引号 *
// length --数据存储区长度(字) *
// Curv[] --数据存储区的信息 *
// type --数据种类 二维 三维 *
//返 回:无 *
//注 意:此处所涉及的长度均按字计算 *
//-------------------------------------------------------------------------*
void Flash_Erase_Ready(uchar page,uchar ID,uint length,
Curve_struct Curv[],uchar type)
{
volatile uchar index,Fn=0x0,Fi=0x00;
Curv[ID].curve_ID=ID;
Curv[ID].length=length;
Curv[ID].curve_Type=type;
if(length%256==0) //计算数据所占扇区数量
Fn=length/256;
else
Fn=length/256+1;
if(Fn==0) return;
if(ID==0)
{
if(page==0)
Curv[ID].curve_page=DataPage;
else
Curv[ID].curve_page=page;
Curv[ID].fst_addr=0x8000;
Curv[ID].lst_addr=0x8000+2*(length-1);
}
else
{
index=ID-1;
if(Curv[index].curve_page==0 && page==0) return; //如果上一个ID的数据未存储且这一数据段未指定页码则返回
if(Curv[index].next_addr<0xC000 && (Curv[index].next_addr+2*length)<0xC000)
{ //存储空间够用
if(page==0)
{
Curv[ID].curve_page =Curv[index].curve_page;
Curv[ID].fst_addr = Curv[index].next_addr;
Curv[ID].lst_addr = Curv[index].next_addr +2*(length-1);
}
else
{
if(page>Curv[index].curve_page)
{
Curv[ID].curve_page =page;
Curv[ID].fst_addr = 0x8000;
Curv[ID].fst_addr=0x8000;
Curv[ID].lst_addr=0x8000+2*(length-1);
}
}
}
else
{ //存储空间不够用
return;
}
}
Curv[ID].next_addr=Curv[ID].fst_addr+512*Fn;
Erase_Write_Pretreat(Curv[ID].curve_page);
for(Fi=0x00;Fi<Fn;Fi++) ;
{
*(uint *)(Curv[ID].fst_addr+512*Fi) = 0xFFFF;
FCMD = 0x40;
_asm("CALL PrgOfRam");
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -