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

📄 iap.c

📁 PLC源代码
💻 C
字号:
#include "system.h"

extern signed   int   xdata  _D[31];                      //  位元件 D 内存分配 
#define   Value      _D[31]  // 变频显示器LED显示缓冲区

//=======================================================================================================
// 函数名称: IAPFlashErasureMode
//
// 功能描述:  页面擦除模式
//
// 输 入:  unsigned int pageaddr
//          
// 输 出:  void
//         
// 全局变量:  
// 调用模块: 无
//
// 作 者:  卢明君
// 日 期:  2009年9月15日
// 备  注:  
//-------------------------------------------------------------------------------------------------------
// 修改人:
// 日 期:
// 备  注: 
//-------------------------------------------------------------------------------------------------------
//=======================================================================================================
void IAPFlashErasureMode(unsigned int pageaddr)
{
	ISPCR=0x83;			// ISPCR.7=1,启用ISP
						// ISPCR[2:0]=011, 假设MPC82系列运行在11.0592M
	IFMT=0x03;			// 选择页擦除模式
	IFADRH=pageaddr>>8;	// 这个页面必须在IAP存储区
	IFADRL=pageaddr;
	SCMD=0x46;			// 触发的ISP处理
	SCMD=0xb9;			// MCU将会停止运行.直到处理完成
}
//=======================================================================================================
// 函数名称: IAPFlashProgrem
//
// 功能描述:  单字节写入模式(无"检查是否写入成功")
//
// 输 入:  unsigned int codeaddr,unsigned char ucdata
//          
// 输 出:  void
//         
// 全局变量:  
// 调用模块: 无
//
// 作 者:  卢明君
// 日 期:  2009年9月15日
// 备  注:  此函数不包含"检查是否写入成功".
//-------------------------------------------------------------------------------------------------------
// 修改人:
// 日 期:
// 备  注: 
//-------------------------------------------------------------------------------------------------------
//=======================================================================================================
void IAPFlashProgrem(unsigned int codeaddr,unsigned char ucdata)
{
	ISPCR=0x83;			// ISPCR.7=1,启用ISP
						// ISPCR[2:0]=011, 假设MPC82系列运行在11.0592M
	IFMT=0x02;			// 进入编程模式
	IFADRH=codeaddr>>8;	// 这个字节必须在IAP存储区
	IFADRL=codeaddr;
	IFD=ucdata;			// 填写待编程的数据
	SCMD=0x46;			// 触发的ISP处理
	SCMD=0xb9;			// MCU将会停止运行.直到处理完成
}
//=======================================================================================================
// 函数名称: IAPFlashProgremMode
//
// 功能描述:  单字节写入模式(含有"检查是否写入成功")
//
// 输 入:  unsigned int codeaddr,unsigned char ucdata
//          
// 输 出:  void
//         
// 全局变量:  
// 调用模块: IAPFlashErasureMode ; IAPFlashProgrem ; IAPFlashReadMode
//
// 作 者:  卢明君
// 日 期:  2009年9月15日
// 备  注:  此函数包含"检查是否写入成功".
//-------------------------------------------------------------------------------------------------------
// 修改人:
// 日 期:
// 备  注: 
//-------------------------------------------------------------------------------------------------------
//=======================================================================================================
void IAPFlashProgremMode(unsigned int codeaddr,unsigned char ucdata)	// 编程模式
{
	unsigned char checkdata=0;
	unsigned char retry=0;
	unsigned int  i=0;
	unsigned int  tempaddr=0;
	unsigned char tempdata;										//	为节省RAM 应运而生的变量.
	checkdata=IAPFlashReadMode(codeaddr);
	while(checkdata!=ucdata)									//	判断不相等后,再写入,相等就不必写入重新写入了.
	{
		IAPFlashProgrem(codeaddr,ucdata);
		if(++retry>ReTryTimes)									//	2次尝试机会
		{
			tempaddr=codeaddr-codeaddr%512;						//	计算当前页首地址
			IAPFlashErasureMode(PLCTempAddr);					//	擦除IAP缓存备份空间	为节省RAM 应运而生的空间.
			for(i=0;i<512;i++)									//	读出当前页所有数据,备份
			{
				tempdata=IAPFlashReadMode(i+tempaddr);
				if(tempdata!=0xff)IAPFlashProgrem(i+PLCTempAddr,tempdata);					
			}
			IAPFlashErasureMode(tempaddr);						//	擦除当前页
			if(ucdata!=0xff)IAPFlashProgrem(codeaddr,ucdata);	//	重写
			for(i=0;i<512;i++)									//	将备份数据写回
			{
				if(codeaddr==(i+tempaddr))continue;
				tempdata=IAPFlashReadMode(i+PLCTempAddr);
				if(tempdata!=0xff)IAPFlashProgrem(i+tempaddr,tempdata);
			}
		}
		checkdata=IAPFlashReadMode(codeaddr);
		if(retry>=ReTryOut)
		{
			while(1)	//	出错了,不写了,显示写错误的地址,请核对是否超出IAP空间大小
			{
				Value=codeaddr;
// 				Out_EY_BIT();
			}
		}
	}
}
//=======================================================================================================
// 函数名称: IAPFlashReadMode
//
// 功能描述:  单字节读取模式
//
// 输 入:  unsigned int codeaddr
//          
// 输 出:  unsigned char
//         
// 全局变量:  
// 调用模块: 无
//
// 作 者:  卢明君
// 日 期:  2009年9月15日
// 备  注:  
//-------------------------------------------------------------------------------------------------------
// 修改人:
// 日 期:
// 备  注: 
//-------------------------------------------------------------------------------------------------------
//=======================================================================================================
unsigned char IAPFlashReadMode(unsigned int codeaddr)	// 读模式
{
	ISPCR=0x83;			// ISPCR.7=1,启用ISP
						// ISPCR[2:0]=011, 假设MPC82系列运行在11.0592M
	IFMT=0x01;			// 进入读模式
	IFADRH=codeaddr>>8;	// 这个字节必须在IAP存储区
	IFADRL=codeaddr;
	SCMD=0x46;			// 触发的ISP处理
	SCMD=0xb9;			// MCU将会停止运行.直到处理完成	// 触发IAP
	return IFD;			// 读出的数据
}

⌨️ 快捷键说明

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