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

📄 iap_lite.c

📁 矿工定位系统单端
💻 C
字号:
/******************************************************************
* 文件名:IAP_LITE.C
* 功能:实现IAP_Lite功能,进行字节擦除编程操作
* 日期:2003.11.10
* 说明:
******************************************************************/  
#define  uint8   unsigned  char
#define  uint16  unsigned  int

/* 定义页宽度屏蔽字(16字节时为0x0F,64字节时为0x3F) */
#define  PAGE_SIZE  0x3F

/* IAP_Lite相关寄存器定义 */
sfr	FMADRH	= 0xE7;
sfr	FMADRL  = 0xE6;
sfr	FMCON   = 0xE4;
sfr	FMDATA  = 0xE5;

/* 定义FLASH控制命令字 */
#define  LOAD       0x00      	/* 加载数据 	*/
#define  PROG       0x48        /* 编程		*/
#define  ERS_PROG   0x68        /* 擦除编程 	*/
#define  ERS_S      0x71        /* 擦除扇区 	*/
#define  ERS_P      0x70        /* 擦除页   	*/


/******************************************************************
* 名称:FLASH_WriteByte
* 功能:指定FLASH地址,写单字节数据
* 入口参数:addr		指定的地址
*	   dat		待写入的数据
* 出口参数:返回0时表示操作错误
******************************************************************/
bit  FLASH_WriteByte(uint16 addr, uint8 dat)
{  FMCON = LOAD;		// 设置加载数据命令  
   FMADRH = addr>>8;		// 设置写入地址
   FMADRL = addr&0xFF;		
   FMDATA = dat;		// 写入数据
   FMCON = ERS_PROG;		// 擦除编程
   
   if( (FMCON&0x0F)!=0x00 ) return(0);
     else return(1);
}


/******************************************************************
* 名称:FLASH_ReadByte
* 功能:指定FLASH地址,读单字节数据
* 入口参数:addr		指定的地址
* 出口参数:返回值即是读出的数据
******************************************************************/
uint8  FLASH_ReadByte(uint16 addr)
{  uint8  code *readp;

   readp = addr;
   return(*readp);
}


/******************************************************************
* 名称:FLASH_WriteNByte
* 功能:指定FLASH起始地址,写多字节数据
* 入口参数:addr		指定的起始地址
*	   dat_buf	待写入的数据缓冲区指针
*          no		要写入数据个数
* 出口参数:返回0时表示操作错误
******************************************************************
bit  FLASH_WriteNByte(uint16 addr, uint8  *dat_buf, uint8 no)
{  if(0==no) return(0);
   
   FMCON = LOAD;			// 设置加载数据命令  
   FMADRH = addr>>8;			// 设置写入地址
   FMADRL = addr&0xFF;
   while(1)
   {  FMDATA = *dat_buf;		// 写入数据
      dat_buf++;			// 指向下一个待写入的数据
      addr++;				
      no--;
      if(0==no) break;			// 判断是否写完所有数据,若是则退出
      
      if( (addr&PAGE_SIZE)==0 )		// 判断是否要换页
      {  FMCON = ERS_PROG;		// 若是,则擦除编程
         if( (FMCON&0x0F)!=0x00 ) return(0);
         // 切换到下一页 
         FMCON = LOAD;			
         FMADRH = addr>>8;
         FMADRL = addr&0xFF;
      }
   }
   FMCON = ERS_PROG;			// 擦除编程
   if( (FMCON&0x0F)!=0x00 ) return(0);      
     else  return(1);
}

/******************************************************************
* 名称:FLASH_ReadNByte
* 功能:指定FLASH起始地址,读多字节数据
* 入口参数:addr		指定的起始地址
*	   dat_buf	保存数据的缓冲区指针
*          no		要写入数据个数
* 出口参数:无
******************************************************************
void  FLASH_ReadNByte(uint16 addr, uint8 *dat_buf, uint8 no)
{  uint8 code *readp;
	
   if(0==no) return;
   readp = addr;				// 设置读取的地址
   for(; no>0; no--)
   {  *dat_buf = *readp;		// 读取数据
      dat_buf++;			
      readp++;				// 指向下一地址
   }  
}


/******************************************************************
* 名称:FLASH_EraseSector
* 功能:扇区擦除
* 入口参数:addr		指定待擦除扇区内的地址
* 出口参数:返回0时表示操作错误
******************************************************************
bit  FLASH_EraseSector(uint16 addr)
{  FMADRH = addr>>8;
   FMADRL = addr&0xFF;
   FMCON = ERS_S;
   
   if( (FMCON&0x0F)!=0x00 ) return(0);
     else return(1);
}


/******************************************************************
* 名称:FLASH_ErasePage
* 功能:页擦除
* 入口参数:addr		指定待擦除页内的地址
* 出口参数:返回0时表示操作错误
******************************************************************
bit  FLASH_ErasePage(uint16 addr)
{  FMADRH = addr>>8;
   FMADRL = addr&0xFF;
   FMCON = ERS_P;
   
   if( (FMCON&0x0F)!=0x00 ) return(0);
     else return(1);
}


/******************************************************************
* 名称:FLASH_FillPage
* 功能:页填充
* 入口参数:addr		指定待填充页内的地址
*          dat		待填充的数据
* 出口参数:返回0时表示操作错误
* 说明:函数会先调用FLASH_ErasePage擦除扇区
******************************************************************
bit  FLASH_FillPage(uint16 addr, uint8  dat)
{  uint8  i;
	
   // 擦除扇区
   if( FLASH_ErasePage(addr)==0 ) return(0);
   // 填充数据
   FMADRH = addr>>8;			// 设置页起始地址
   FMADRL = addr&(~PAGE_SIZE);
   FMCON = LOAD;			// 设置加载数据命令
   for(i=0; i<=PAGE_SIZE; i++)
   {  FMDATA = dat;			// 加载数据
   }
   FMCON = PROG;			// 开始编程
   
   if( (FMCON&0x0F)!=0x00 ) return(0);
     else return(1);
}

	*/	

























⌨️ 快捷键说明

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