📄 iap.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 + -