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

📄 iap.c

📁 C语言源代码及相关资料
💻 C
字号:

#include "config.h"

/*定义CCLK值大小,单位为KHz*/
#define		IAP_FCCLK	48000

#define 	IAP_ENTER_ADR   0x7FFFFFF1              // IAP入口地址定义

uint32	paramin[8];		                            //IAP入口参数缓冲区
uint32	paramout[8];	                            //IAP出口参数缓冲区

/*********************************************************************************************************
**函数名称:SelSector
**函数功能:IAP操作缓冲区选择,代码为50
**入口参数:sec1	起始扇区
**			sec2	终止扇区
**出口参数:IAP 操作状态码
**			IAP返回值(paramout缓冲区)
********************************************************************************************************/
uint32	SelSector(uint8	sec1, uint8	sec2)
{
	paramin[0] = IAP_SELECTOR;	                    //设置命令字
	paramin[1] = sec1;			                    //设置参数
	paramin[2] = sec2;
	(*(void(*)())IAP_ENTER_ADR)(paramin,paramout);	//调用IAP服务程序
	return(paramout[0]);	                        //返回状态码
}
/*********************************************************************************************************
**函数名称:RamToFlash
**函数功能:复制RAM的数据到FLASH,命令代码51
**入口参数:dst		目标地址,即FLASH起始地址,以256字节为分界
**			src		源地址,即RAM地址,地址必须字对其
**			no		复制字节个数,为256/512/1024/4096
**出口参数:IAP 操作状态码
**			IAP返回值(paramout缓冲区)
********************************************************************************************************/
uint32	RamToFlash(uint32 dst, uint32 src, uint32 no)
{
	paramin[0] = IAP_RAMTOFLASH;	                //设置命令字
	paramin[1] = dst;				                //设置参数
	paramin[2] = src;
	paramin[3] = no;
	paramin[4] = IAP_FCCLK;
	(*(void(*)())IAP_ENTER_ADR)(paramin,paramout);	//调用IAP服务程序
	return(paramout[0]);			                //返回状态码
}
/*********************************************************************************************************
**函数名称:EraseSector
**函数功能:擦除扇区,命令代码52
**入口参数:sec1	起始扇区
**			sec2	终止扇区
**出口参数:IAP 操作状态码
**			IAP返回值(paramout缓冲区)
********************************************************************************************************/
uint32	EraseSector(uint32 sec1, uint32 sec2)
{
	paramin[0] = IAP_ERASESECTOR;	                //设置命令字
	paramin[1] = sec1;				                //设置参数
	paramin[2] = sec2;
	paramin[3] = IAP_FCCLK;
	(*(void(*)())IAP_ENTER_ADR)(paramin,paramout);	//调用IAP服务程序
	return(paramout[0]);			                //返回状态码
}
/*********************************************************************************************************
**函数名称:BlankCHK
**函数功能:查空扇区,命令代码53
**入口参数:sec1	起始扇区
**			sec2	终止扇区
**出口参数:IAP 操作状态码
**			IAP返回值(paramout缓冲区)
********************************************************************************************************/
uint32	BlankCHK(uint32	sec1, uint32 sec2)
{
	paramin[0] = IAP_BLANKCHK;	//设置命令字
	paramin[1] = sec1;				                //设置参数
	paramin[2] = sec2;
	paramin[3] = IAP_FCCLK;
	(*(void(*)())IAP_ENTER_ADR)(paramin,paramout);	//调用IAP服务程序
	return(paramout[0]);			                //返回状态码
}
/*********************************************************************************************************
**函数名称:ReadParID
**函数功能:读器件ID,命令代码54
**入口参数:器件ID地址指针
**出口参数:IAP 操作状态码
**			IAP返回值(paramout缓冲区)
********************************************************************************************************/
uint32	ReadParID(uint32 *Device_ID)
{
	paramin[0] = IAP_READPARTID;	                //设置命令字
	(*(void(*)())IAP_ENTER_ADR)(paramin,paramout);	//调用IAP服务程序
	*Device_ID = paramout[1];
	return(paramout[0]);			                //返回状态码
}
/*********************************************************************************************************
**函数名称:BootCodeID
**函数功能:读boot代码ID,命令代码55
**入口参数:boot代码ID地址指针
**出口参数:IAP 操作状态码
**			IAP返回值(paramout缓冲区)
********************************************************************************************************/
uint32	BootCodeID(uint32 *Boot_ID)	
{
	paramin[0] = IAP_BOOTCODEID;	                //设置命令字
	(*(void(*)())IAP_ENTER_ADR)(paramin,paramout);	//调用IAP服务程序
	*Boot_ID = paramout[1];
	
	return(paramout[0]);			                //返回状态码
}
/*********************************************************************************************************
**函数名称:Compare
**函数功能:校验数据,命令代码56
**入口参数:dst		目标地址,即RAM/FLASH起始地址,地址必须字对齐
**			src		源地址,即RAM/RAM地址,地址必须字对齐
**			no		比较字节个数,必须能被4整除
**出口参数:IAP 操作状态码
**			IAP返回值(paramout缓冲区)
********************************************************************************************************/
uint32	Compare(uint32	dst,uint32	src,uint32	no)
{
	paramin[0] = IAP_COMPARE;	                        //设置命令字
	paramin[1] = dst;				                    //设置参数
	paramin[2] = src;
	paramin[3] = no;
	(*(void(*)())IAP_ENTER_ADR)(paramin,paramout);	    //调用IAP服务程序
	return(paramout[0]);			                    //返回状态码 
}
/*********************************************************************************************************
**函数名称:Reinvoke_ISP
**函数功能:重新调用ISP,命令代码57。
**入口参数:无
**出口参数:无
********************************************************************************************************/
void  Reinvoke_ISP(void)
{
	paramin[0] = IAP_REINVOKE_ISP;					    // 设置命令字
	(*(void(*)())IAP_ENTER_ADR)(paramin,paramout);	    // 重新调用ISP
} 
/*********************************************************************************************************
**函数名称:WriteFlash
**函数功能:向FLASH中写入数据
**入口参数:dst		目标地址,即FLASH起始地址,地址必须以256字节对齐,即地址的低8位必须为0
**			src		源地址,即RAM地址,地址必须字对齐,即地址的低两位必须为0
**			no		写入字节数,必须为256/512/1024/4096
**出口参数:Compare的返回值,操作成功正确返回0
********************************************************************************************************/
uint8	WriteFlash(uint32 dst, uint32 src, uint32 no)
{
	SelSector((dst/0x1000),(dst+no)/0x1000);	        //选择扇区
	EraseSector((dst/0x1000),(dst+no)/0x1000);	        //擦除扇区
	BlankCHK((dst/0x1000),(dst+no)/0x1000);		        //查空扇区
	
	SelSector((dst/0x1000),(dst+no)/0x1000);	        //选择扇区
	
	RamToFlash(dst,src,no);			                    //写数据到FLASH
	return(Compare(dst,src,no));	                    //比较数据
}


/**************************************************************************** 

* 名称:WrDatatoInChip
* 功能:IAP函数调用,测试。通过观察IAP出口参数来判断操作是否成功。 
* 功能:将接收到数据保存到EEPROM
* 入口参数:write_addr 数据需写入的起始地址的偏移量
*           len   数据长度
* 出口参数:无
* 
****************************************************************************/ 

uint8 WrDatatoInChip(uint8	sec_id,uint8	end_sec_id,uint32 write_addr ,uint8 * strSendMes, uint32 datalen ) 

{ 
	uint32 	i=0;
	uint32  j=0;
	volatile uint8  *ip=NULL;
	uint8 strProtBuff[ByteINSector];  //用来在扇区擦除前保存扇区中的内容
	//准备数据
	ip=GetAddrInChip(0);//(volatile uint16 *)FLASH_ADDR_InChip+0;
	for(i=0;i<ByteINSector;i++)
	   strProtBuff[i] = *ip++;
	for(j=0;j<datalen;j++)
		strProtBuff[write_addr+j] = strSendMes[j];
	
	ip=(volatile uint8 *)SDRAM_ADDR_InChip;
	for(i=0;i<ByteINSector;i++)
	   *ip++=strProtBuff[i];
	
	 OS_ENTER_CRITICAL();
	 //ReadParID(); 
	 //BootCodeID(); 
	 SelSector(sec_id,end_sec_id); // 选择扇区1 
	 EraseSector(sec_id,end_sec_id); // 擦除扇区1 
	 BlankCHK(sec_id,end_sec_id) ; // 查空扇区1 
	 SelSector(sec_id,end_sec_id); 
	 RamToFlash(FLASH_ADDR_InChip, SDRAM_ADDR_InChip, ByteINSector); // 写数据到扇区1 
	 BlankCHK(sec_id,end_sec_id) ; 
	 Compare(FLASH_ADDR_InChip, SDRAM_ADDR_InChip, ByteINSector); // 比较数据 
	 
	 OS_EXIT_CRITICAL();
	 
	 return TRUE; 
 
} 
/****************************************************************************
* 名称:GetDatafromInChip()
* 功能:从扇区中取出相应的数据,保存在字符串strSendMes中
* 入口参数:begin_addr 数据所在的起始地址的偏移量
*           i   数据长度
* 出口参数:无
* 注意:这里只考虑单个查询的情况
****************************************************************************/

uint8 GetDatafromInChip(uint32 begin_addr ,uint8 * strSendMes, uint32 datalen)
{
	uint32 j=0;
    volatile uint8  *ip=NULL;
    uint32 Addr;
   
    OS_ENTER_CRITICAL();
    Addr = (uint32)begin_addr;
    ip = GetAddrInChip(Addr);
	for(j=0;j<datalen;j++)
	{
	    strSendMes[j] = *ip++;
	}
	OS_EXIT_CRITICAL();	
	
	return TRUE; 
	
}



⌨️ 快捷键说明

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