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

📄 flash_iap.c

📁 基于philips的lpc2148开发源代码
💻 C
字号:
//#define		IAP_GLOBALS

#include	"configLPC.h"



//void (*IAP_Entry)(uint32 param_tab[], uint32 result_tab[]);

/* 定义函数指针 */
uint32  paramin[8];                         // IAP入口参数缓冲区
uint32  paramout[8];                        // IAP出口参数缓冲区

//void flashinit(void)
//{
//    IAP_Entry = (void(*)())IAP_ENTER_ADR;           // 初始化函数指针IAP_Entry
//}

/****************************************************************************
* 名称:SelSector()
* 功能:IAP操作扇区选择,命令代码50。
* 入口参数:sec1        起始扇区
*          sec2        终止扇区
* 出口参数:IAP返回值(paramout缓冲区)
****************************************************************************/
uint32  SelSector(INT8U sec1, INT8U sec2)
{
	paramin[0] = IAP_SELSECTOR;              // 设置命令字
	paramin[1] = sec1;                       // 设置参数
	paramin[2] = sec2;
    //(*IAP_Entry)(paramin, paramout);       // 调用IAP服务程序
	iap_entry(paramin, paramout);         	 // 调用IAP服务程序
    return(paramout[0]);                     // 返回状态码
}

/****************************************************************************
* 名称:aRamToFlash()
* 功能:复制RAM的数据到FLASH,命令代码51。
* 入口参数:dst        目标地址,即FLASH起始地址。以512字节为分界
*          	src        源地址,即RAM地址。地址必须字对齐
*          	no         复制字节个数,为512/1024/4096/8192
* 出口参数:IAP返回值(paramout缓冲区)
****************************************************************************/
uint32  RamToFlash(INT32U dst, INT32U src, INT32U no)
{
	paramin[0] = IAP_RAMTOFLASH;             // 设置命令字
	paramin[1] = dst;                        // 设置参数
	paramin[2] = src;
	paramin[3] = no;
	paramin[4] = IAP_FCCLK;
    //(*IAP_Entry)(paramin, paramout);       // 调用IAP服务程序
	iap_entry(paramin, paramout);         	 // 调用IAP服务程序
    return(paramout[0]);                     // 返回状态码
}

/****************************************************************************
* 名称:EraseSector()
* 功能:扇区擦除,命令代码52。
* 入口参数:sec1       起始扇区
*          	sec2       终止扇区
* 出口参数:IAP返回值(paramout缓冲区)
****************************************************************************/
uint32  EraseSector(INT8U sec1, INT8U sec2)
{
	paramin[0] = IAP_ERASESECTOR;             // 设置命令字
	paramin[1] = sec1;                        // 设置参数
	paramin[2] = sec2;
	paramin[3] = IAP_FCCLK;
    //(*IAP_Entry)(paramin, paramout);        // 调用IAP服务程序
	iap_entry(paramin, paramout);         	  // 调用IAP服务程序
    return(paramout[0]);                      // 返回状态码
}

/****************************************************************************
* 名称:BlankCHK()
* 功能:扇区查空,命令代码53。
* 入口参数:sec1       起始扇区
*          sec2       终止扇区
* 出口参数:IAP返回值(paramout缓冲区)
****************************************************************************/
uint32  BlankCHK(INT8U sec1, INT8U sec2)
{
	paramin[0] = IAP_BLANKCHK;               // 设置命令字
	paramin[1] = sec1;                       // 设置参数
	paramin[2] = sec2;
    //(*IAP_Entry)(paramin, paramout);       // 调用IAP服务程序
	iap_entry(paramin, paramout);         	 // 调用IAP服务程序
    return(paramout[0]);                     // 返回状态码
}

/****************************************************************************
* 名称:ReadParID()
* 功能:读取设备ID,命令代码54。
* 入口参数:无
* 出口参数:IAP返回值(paramout缓冲区)
****************************************************************************/
uint32  ReadParID(void)
{
	paramin[0] = IAP_READPARTID;			 // 设置命令字
    //(*IAP_Entry)(paramin, paramout);       // 调用IAP服务程序
	iap_entry(paramin, paramout);			 // 调用IAP服务程序
    return(paramout[0]);                     // 返回状态码
}

/****************************************************************************
* 名称:BootCodeID()
* 功能:读取boot代码版本号,命令代码55。
* 入口参数:无
* 出口参数:IAP返回值(paramout缓冲区)
****************************************************************************/
uint32  BootCodeID(void)
{
	paramin[0] = IAP_BOOTCODEID;             // 设置命令字
    //(*IAP_Entry)(paramin, paramout);       // 调用IAP服务程序
	iap_entry(paramin, paramout);         	 // 调用IAP服务程序
    return(paramout[0]);                     // 返回状态码
}

/****************************************************************************
* 名称:aCompare()
* 功能:校验数据,命令代码56。
* 入口参数:dst        目标地址,即RAM/FLASH起始地址。地址必须字对齐
*           src        源地址,即FLASH/RAM地址。地址必须字对齐
*           size       比较字节个数,必须能被4整除
* 出口参数:IAP返回值(paramout缓冲区)
****************************************************************************/
uint32  Compare(INT32U dst, INT32U src, INT32U no)
{
	paramin[0] = IAP_COMPARE;                // 设置命令字
	paramin[1] = dst;                        // 设置参数
	paramin[2] = src;
	paramin[3] = no;
    //(*IAP_Entry)(paramin, paramout);       // 调用IAP服务程序
	iap_entry(paramin, paramout);         	 // 调用IAP服务程序
    return(paramout[0]);                     // 返回状态码
}


/****************************************************************************
* 名称:FlashToFlash()
* 功能:复制Flash的数据到FLASH
* 入口参数:dst        目标地址,即FLASH起始地址。以512字节为分界
*          	src        源地址,即FLASH地址。地址必须字对齐
*          	no         复制字节个数,为512/1024/4096/8192
* 出口参数:IAP返回值(paramout缓冲区)
****************************************************************************/
uint32  FlashToFlash(INT32U dst, INT32U src, INT32U no)
{
 	BYTE	secter,nums,i;
 	//int		temp;
 	
 	DWORD BRT_DataBuffer[BRT_BUFFER_LENGTH/4];

 	secter = (dst/32768) + 7;
 	//temp = src/32768;
 	nums = no/BRT_BUFFER_LENGTH; 	
	
	SelSector(secter,secter);                                 		 // 选择扇区
	EraseSector(secter,secter);                               		 // 擦除扇区
	BlankCHK(secter,secter) ;                                 		 // 查空扇区
	
	for(i = 0;i < nums;i++)
	{                                 		 						 // 选择扇区
		
		memcpy(BRT_DataBuffer, (src + i*BRT_BUFFER_LENGTH), BRT_BUFFER_LENGTH);
		SelSector(secter,secter);
		RamToFlash((dst + i*BRT_BUFFER_LENGTH), BRT_DataBuffer, BRT_BUFFER_LENGTH);     // 写数据到扇区
	}

    return	1;                     				 					 // 返回状态码
}

/****************************************************************************
* 名称:FlashInit()
* 功能:初始化FLASH
****************************************************************************/
/*void FlashInit(void)
{

	memcpy(&g_DataInformation, 0x00079000, sizeof(DATA_INFORMATION));
	
	g_DataInformation.BRT_BusNums 	= 0;
	g_DataInformation.BRT_Flag 		= 0;
	g_DataInformation.startAdress 	= 0x00028000;
	g_DataInformation.endAdress		= 0x00028000;

	memcpy(RecordTemp1, &g_DataInformation, sizeof(DATA_INFORMATION));
	SelSector(23,23);                                 		 		 // 选择扇区22
	EraseSector(23,23);                               		 		 // 擦除扇区22
	BlankCHK(23,23);                                 		 		 // 查空扇区22
	
	SelSector(23,23);                                 		 		 // 选择扇区22
	RamToFlash(0x00079000, RecordTemp1, sizeof(RecordTemp1));
   	
	SelSector(10,10);                                 		 	 	 // 选择扇区10
	EraseSector(10,10);                               		 	 	 // 擦除扇区10
	BlankCHK(10,10);
}
*/


⌨️ 快捷键说明

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