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

📄 flash.c

📁 写XS128的D-Flash的三个程序案例
💻 C
📖 第 1 页 / 共 2 页
字号:
                      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 + -