?? iap.c
字號:
#include "system.h"
extern signed int xdata _D[31]; // 位元件 D 內(nèi)存分配
#define Value _D[31] // 變頻顯示器LED顯示緩沖區(qū)
//=======================================================================================================
// 函數(shù)名稱: IAPFlashErasureMode
//
// 功能描述: 頁面擦除模式
//
// 輸 入: unsigned int pageaddr
//
// 輸 出: void
//
// 全局變量:
// 調(diào)用模塊: 無
//
// 作 者: 盧明君
// 日 期: 2009年9月15日
// 備 注:
//-------------------------------------------------------------------------------------------------------
// 修改人:
// 日 期:
// 備 注:
//-------------------------------------------------------------------------------------------------------
//=======================================================================================================
void IAPFlashErasureMode(unsigned int pageaddr)
{
ISPCR=0x83; // ISPCR.7=1,啟用ISP
// ISPCR[2:0]=011, 假設(shè)MPC82系列運行在11.0592M
IFMT=0x03; // 選擇頁擦除模式
IFADRH=pageaddr>>8; // 這個頁面必須在IAP存儲區(qū)
IFADRL=pageaddr;
SCMD=0x46; // 觸發(fā)的ISP處理
SCMD=0xb9; // MCU將會停止運行.直到處理完成
}
//=======================================================================================================
// 函數(shù)名稱: IAPFlashProgrem
//
// 功能描述: 單字節(jié)寫入模式(無"檢查是否寫入成功")
//
// 輸 入: unsigned int codeaddr,unsigned char ucdata
//
// 輸 出: void
//
// 全局變量:
// 調(diào)用模塊: 無
//
// 作 者: 盧明君
// 日 期: 2009年9月15日
// 備 注: 此函數(shù)不包含"檢查是否寫入成功".
//-------------------------------------------------------------------------------------------------------
// 修改人:
// 日 期:
// 備 注:
//-------------------------------------------------------------------------------------------------------
//=======================================================================================================
void IAPFlashProgrem(unsigned int codeaddr,unsigned char ucdata)
{
ISPCR=0x83; // ISPCR.7=1,啟用ISP
// ISPCR[2:0]=011, 假設(shè)MPC82系列運行在11.0592M
IFMT=0x02; // 進入編程模式
IFADRH=codeaddr>>8; // 這個字節(jié)必須在IAP存儲區(qū)
IFADRL=codeaddr;
IFD=ucdata; // 填寫待編程的數(shù)據(jù)
SCMD=0x46; // 觸發(fā)的ISP處理
SCMD=0xb9; // MCU將會停止運行.直到處理完成
}
//=======================================================================================================
// 函數(shù)名稱: IAPFlashProgremMode
//
// 功能描述: 單字節(jié)寫入模式(含有"檢查是否寫入成功")
//
// 輸 入: unsigned int codeaddr,unsigned char ucdata
//
// 輸 出: void
//
// 全局變量:
// 調(diào)用模塊: IAPFlashErasureMode ; IAPFlashProgrem ; IAPFlashReadMode
//
// 作 者: 盧明君
// 日 期: 2009年9月15日
// 備 注: 此函數(shù)包含"檢查是否寫入成功".
//-------------------------------------------------------------------------------------------------------
// 修改人:
// 日 期:
// 備 注:
//-------------------------------------------------------------------------------------------------------
//=======================================================================================================
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; // 為節(jié)省RAM 應(yīng)運而生的變量.
checkdata=IAPFlashReadMode(codeaddr);
while(checkdata!=ucdata) // 判斷不相等后,再寫入,相等就不必寫入重新寫入了.
{
IAPFlashProgrem(codeaddr,ucdata);
if(++retry>ReTryTimes) // 2次嘗試機會
{
tempaddr=codeaddr-codeaddr%512; // 計算當(dāng)前頁首地址
IAPFlashErasureMode(PLCTempAddr); // 擦除IAP緩存?zhèn)浞菘臻g 為節(jié)省RAM 應(yīng)運而生的空間.
for(i=0;i<512;i++) // 讀出當(dāng)前頁所有數(shù)據(jù),備份
{
tempdata=IAPFlashReadMode(i+tempaddr);
if(tempdata!=0xff)IAPFlashProgrem(i+PLCTempAddr,tempdata);
}
IAPFlashErasureMode(tempaddr); // 擦除當(dāng)前頁
if(ucdata!=0xff)IAPFlashProgrem(codeaddr,ucdata); // 重寫
for(i=0;i<512;i++) // 將備份數(shù)據(jù)寫回
{
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();
}
}
}
}
//=======================================================================================================
// 函數(shù)名稱: IAPFlashReadMode
//
// 功能描述: 單字節(jié)讀取模式
//
// 輸 入: unsigned int codeaddr
//
// 輸 出: unsigned char
//
// 全局變量:
// 調(diào)用模塊: 無
//
// 作 者: 盧明君
// 日 期: 2009年9月15日
// 備 注:
//-------------------------------------------------------------------------------------------------------
// 修改人:
// 日 期:
// 備 注:
//-------------------------------------------------------------------------------------------------------
//=======================================================================================================
unsigned char IAPFlashReadMode(unsigned int codeaddr) // 讀模式
{
ISPCR=0x83; // ISPCR.7=1,啟用ISP
// ISPCR[2:0]=011, 假設(shè)MPC82系列運行在11.0592M
IFMT=0x01; // 進入讀模式
IFADRH=codeaddr>>8; // 這個字節(jié)必須在IAP存儲區(qū)
IFADRL=codeaddr;
SCMD=0x46; // 觸發(fā)的ISP處理
SCMD=0xb9; // MCU將會停止運行.直到處理完成 // 觸發(fā)IAP
return IFD; // 讀出的數(shù)據(jù)
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -