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

📄 iap.c

📁 Keil ,LPC932系列环境下开发的频率测量单片机程序,用定时器来计脉冲数从而得出频率.
💻 C
字号:
#include "reg922.h"
#include "iap.h"

#define  uint8   unsigned  char
#define  uint16  unsigned  int

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

bit prog_fail;
uint8 idata W_ADDRH,W_ADDRL;
uint16 idata R_ADDR;

bit  FLASH_WriteByte(uint16 addr, uint8 dat)
{  
   long i;
   EA=0;
   FMCON = LOAD;		// 设置加载数据命令  
   FMADRH = addr>>8;		// 设置写入地址
   FMADRL = addr&0xFF;
   FMDATA = dat;		// 写入数据
   FMCON = ERS_PROG;
   for(i=0;i<200;i++);
   if ( (FMCON&0x0F)!=0x00 ) 
	{
	EA=1;
	return(0);
	}
   else 
	{
	EA=1;
	return(1);
	}
}


uint8  FLASH_ReadByte(uint16 addr)
{
   uint8  code *readp;
   readp = addr;
   return(*readp);
}

/*
bit  FLASH_WriteNByte(uint16 addr, uint8  *dat_buf, uint8 no)
{  
   long i;
   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;			// 擦除编程
   for(i=0;i<200;i++);
   if( (FMCON&0x0F)!=0x00 ) 
   		{
			EA=1;
			return(0);      
		}
     else  
	 	{
			EA=1;
			return(1);
		}
}

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++;				// 指向下一地址
   }  
}

bit  FLASH_EraseSector(uint16 addr)
{  
   long i;
   EA=0;
   FMADRH = addr>>8;
   FMADRL = addr&0xFF;
   FMCON = ERS_S;
   for(i=0;i<200;i++);	   
   if( (FMCON&0x0F)!=0x00 ) 
   	{
		EA=1;
		return(0);
	}
     else 
	{
		EA=1;
	 	return(1);
	}
}

bit  FLASH_ErasePage(uint16 addr)
{  
   long i;
   EA=0;
   FMADRH = addr>>8;
   FMADRL = addr&0xFF;
   FMCON = ERS_P;
   for(i=0;i<200;i++);	      
   if( (FMCON&0x0F)!=0x00 ) 
   	{
		EA=1;
		return(0);
	}
     else 
	 {
	 	EA=1;
	 	return(1);
	}
}

bit  FLASH_FillPage(uint16 addr, uint8  dat)
{  uint8  i;
   long j;	
   // 擦除扇区
   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;			// 开始编程
   for(j=0;j<200;j++);	      	   
   if( (FMCON&0x0F)!=0x00 ) 
   	{	
		EA=1;
		return(0);
	}
     else 
	 {
	 	EA=1;
	 	return(1);
	}
}

bit PGM_USER(uint8 page_hi , uint8 page_lo )
{	
    uint8 Fm_stat;
	uint8 i; // 循环次数
	FMCON = LOAD; // 装载命令,清除页寄存器
	FMADRH = page_hi; //
	FMADRL = page_lo; // 页地址写入地址寄存器
		for (i=0;i<64;i++)
	{
	//	temp=dbytes[i];
		FMDATA=0xdd;
	}
	FMCON=ERS_PROG; // 擦除&编程页命令
	Fm_stat = FMCON; // 读结果状态
	if((Fm_stat & 0xF)!=0) 
	  prog_fail = 1;
	else 
	  prog_fail = 0;
	return (prog_fail);
}

void FLASH_TEST(void)
{
unsigned char sta,addrh,addrl;
unsigned int i,j;
Uart_Printf("This is a FLASH Test!");
for(i=0xd00;i<0xd64;i++)
{
addrh=i/256;
addrl=i%256;
if(PGM_USER(addrh,addrl)) 
{
//	Uart_Printf("Program FLASH Fail!\n");			
}
}

for(i=0xcf0;i<0xdff;i++)
{
sta=FLASH_ReadByte(i);
Uart_Printchar(sta);
for(j=0;j<65535;j++) ;
}
}	
*/		






























⌨️ 快捷键说明

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