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

📄 dp_flash.c

📁 写XS128的D-Flash的三个程序案例
💻 C
字号:
#include "MC9S12XS128.h"
#include "DP_Flash.h"

uchar P[10]={0x1C,0x01,0x06,0x80,0x1F,0x01,0x06,0x80,0xFB,0x0A};
                                //FSTAT_CCIF=1;         //写入执行命令
                                //while(FSTAT_CCIF==0); //等待执行完毕
                                //结尾处0x0A为返回代码RTS
uchar RAMOfProgram[10];

/*************************************************************/
/*                      初始化DFLASH                         */
/*************************************************************/
void Flash_Init(void)
{
   while(FSTAT_CCIF==0);            //等待正在处理的FLASH操作完成
   FCLKDIV=0x0F;                    //外部晶振为16M.FLASH时钟不超过1M,具体参照手册
   FCNFG=0x00;                      //禁止中断
   while(FCLKDIV_FDIVLD==0);        //等待时钟设置成功
   ProgramToRam();                  //将程序调入到RAM中
}

/*************************************************************/
/*                    擦除DFLASH的一个扇区                   */
/*************************************************************/
/*   注意: ADDR16即为Global address 的后16位                 */
/*         ADDR16的取值范围 0x0000-0x1FFF                    */
/*************************************************************/
void DFlash_Erase_Sector(uint ADDR16)
{                         //擦除地址所在扇区
  while(FSTAT_CCIF==0);
  if(FSTAT_ACCERR)        //判断并清除标志位;
      FSTAT_ACCERR=1;
  if(FSTAT_FPVIOL)        //判断并清除标志位;
      FSTAT_FPVIOL=1;
  
  FCCOBIX_CCOBIX=0x00;
  FCCOB=0x1210;           //写入擦除命令和高位地址
  FCCOBIX_CCOBIX=0x01;   
  FCCOB=ADDR16;           //写入低16位的地址
  FSTAT_CCIF=1;           //启动执行命令
  while(FSTAT_CCIF==0);   //等待执行完成
}


/*************************************************************/
/*                     向DFLASH写入数据(Phrase)              */
/*************************************************************/
/*   注意: ADDR16即为Global address 的后16位                 */
/*         ADDR16的取值范围 0x0000-0x1FFF                    */
/*************************************************************/
void DFlash_Write_Phrase(uint ADDR16,uint arr[])
{                              //写入4个字的数据
    while(FSTAT_CCIF==0); 
    if(FSTAT_ACCERR)           //判断并清除标志位;
        FSTAT_ACCERR=1;
    if(FSTAT_FPVIOL)           //判断并清除标志位;
        FSTAT_FPVIOL=1;                              
    FCCOBIX_CCOBIX=0x00; 
    FCCOB=0x1110;         //写入命令和高位地址
    FCCOBIX_CCOBIX=0x01;  //地址后16位
    FCCOB=ADDR16;         //写入低16位地址
    
    FCCOBIX_CCOBIX=0x02;  //写入第一个数据
    FCCOB=arr[0];
    FCCOBIX_CCOBIX=0x03;  //写入第二个数据
    FCCOB=arr[1];
    FCCOBIX_CCOBIX=0x04;  //写入第三个数据
    FCCOB=arr[2];
    FCCOBIX_CCOBIX=0x05;  //写入第四个数据
    FCCOB=arr[3]; 
      
    FSTAT_CCIF=1;         //写入执行命令
    while(FSTAT_CCIF==0); //等待执行完毕
}

/*************************************************************/
/*                     由DFLASH读取数据                      */
/*************************************************************/
/*   注意: ADDR16即为Global address 的后16位                 */
/*         ADDR16的取值范围 0x0000-0x1FFF                    */
/*************************************************************/
uint DFlash_Read (uint ADDR16)
  {                            //返回一个字
    byte   lastepage;          //用于存储EPAGE的值
    byte   epage;              //用于计算EPAGE的值
    unsigned int data;         //读取出的数据

    lastepage = EPAGE;         //保存EPAGE的值

    epage = (byte)(ADDR16 >>10);//计算EPAGE
    EPAGE=epage;                //给EPAGE赋值
 
    data = Read_near((ADDR16 & (DFLASH_PAGE_SIZE - 1)) + DFLASH_PAGE_WINDOW_START);  
                                                             //读取页面窗口中的数据
    EPAGE= lastepage;          //恢复EPAGE的值

    return(data);              //返回一个字
  }
  
  
/*************************************************************/
/*                    将程序调入到RAM中                      */
/*************************************************************/
void ProgramToRam(void)
  {
    uchar i;
    for(i=0x00;i<10;i++)
      {
        RAMOfProgram[i]=P[i];
      }
  }
  
  
/*************************************************************/
/*                    擦除PFLASH的一个扇区                   */
/*************************************************************/
/*   注意: ADDR32即为Global address                          */
/*         ADDR32的取值范围 0x007E_0000-0x7F_FFFF            */
/*************************************************************/
void PFlash_Erase_Sector(ulong ADDR32)
  {                         //擦除地址所在扇区
    while(FSTAT_CCIF==0);
    if(FSTAT_ACCERR)        //判断并清除标志位;
        FSTAT_ACCERR=1;
    if(FSTAT_FPVIOL)        //判断并清除标志位;
        FSTAT_FPVIOL=1;
    
    FCCOBIX_CCOBIX=0x00;
    FCCOB=0x0A00|((uint)(ADDR32>>16));
                            //写入擦除命令和高位地址   0x0A 扇区擦除命令 
    FCCOBIX_CCOBIX=0x01;   
    FCCOB=(uint)ADDR32;     //取低16位的地址写入
    
    _asm("CALL RAMOfProgram");//执行RAM中的程序
    //FSTAT_CCIF=1;           //启动执行命令
    //while(FSTAT_CCIF==0);   //等待执行完成
  }


/*************************************************************/
/*                  向PFLASH写入数据(Phrase)                 */
/*************************************************************/
/*   注意: ADDR32即为Global address                          */
/*         ADDR32的取值范围 0x007E_0000-0x7F_FFFF            */
/*************************************************************/
void PFlash_Write_Phrase(ulong ADDR32,uint arr[])
  {                            //写入4个字的数据
    while(FSTAT_CCIF==0); 
    if(FSTAT_ACCERR)           //判断并清除标志位;
        FSTAT_ACCERR=1;
    if(FSTAT_FPVIOL)           //判断并清除标志位;
        FSTAT_FPVIOL=1;                              
    FCCOBIX_CCOBIX=0x00; 
    FCCOB=0x0600|((uint)(ADDR32>>16));
                          //写入program命令和高位地址   0x06 写入Phrase命令
    FCCOBIX_CCOBIX=0x01;  //地址后16位
    FCCOB=(uint)ADDR32;   //取低16位的地址写入
    
    FCCOBIX_CCOBIX=0x02;  //写入第一个数据
    FCCOB=arr[0];
    FCCOBIX_CCOBIX=0x03;  //写入第二个数据
    FCCOB=arr[1];
    FCCOBIX_CCOBIX=0x04;  //写入第三个数据
    FCCOB=arr[2];
    FCCOBIX_CCOBIX=0x05;  //写入第四个数据
    FCCOB=arr[3]; 
    
    _asm("CALL RAMOfProgram");
    //FSTAT_CCIF=1;         //写入执行命令
    //while(FSTAT_CCIF==0); //等待执行完毕
}

/*************************************************************/
/*                     由DFLASH读取数据                      */
/*************************************************************/
/*   注意: ADDR32即为Global address                          */
/*         ADDR32的取值范围 0x007E_0000-0x7F_FFFF            */
/*************************************************************/
uint PFlash_Read (ulong ADDR32)
  {                           
    uint data;
    data = Read_far(ADDR32);  
    return(data);              //返回一个字
  }

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -