?? iap.c
字號:
/****************************************Copyright (c)**************************************************
** 廣州周立功單片機發(fā)展有限公司
** 研 究 所
** 產(chǎn)品一部
**
** http://www.zlgmcu.com
**
**--------------文件信息--------------------------------------------------------------------------------
**文 件 名: IAP.h
**創(chuàng) 建 人:
**最后修改日期:
**描 述: LPC2400硬件SSP軟件包,包含主機和從機的操作
**
**--------------歷史版本信息----------------------------------------------------------------------------
** 創(chuàng)建人: zhangbin
** 版 本: v1.00
** 日 期: 2007-3-30
** 描 述: 定義IAP頭文件
** 說明:
**------------------------------------------------------------------------------------------------------
** 修改人:
** 版 本:
** 日 期:
** 描 述:
**
**--------------當(dāng)前版本修訂------------------------------------------------------------------------------
** 修改人: Li Baihua
** 版 本: v1.01
** 日 期: 2008-07-01
** 描 述: 定義LPC2400的IAP頭文件
** 說明:
**------------------------------------------------------------------------------------------------------
*********************************************************************************************************/
#include "IAP.h"
/*定義CCLK值大小,單位為KHz*/
#define IAP_FCCLK 48000
#define IAP_ENTER_ADR 0x7FFFFFF1 // IAP入口地址定義
uint32 paramin[8]; //IAP入口參數(shù)緩沖區(qū)
uint32 paramout[8]; //IAP出口參數(shù)緩沖區(qū)
/*********************************************************************************************************
**函數(shù)名稱:SelSector
**函數(shù)功能:IAP操作緩沖區(qū)選擇,代碼為50
**入口參數(shù):sec1 起始扇區(qū)
** sec2 終止扇區(qū)
**出口參數(shù):IAP 操作狀態(tài)碼
** IAP返回值(paramout緩沖區(qū))
*********************************************************************************************************/
uint32 SelSector(uint8 sec1, uint8 sec2)
{
paramin[0] = IAP_SELECTOR; // 設(shè)置命令字
paramin[1] = sec1; // 設(shè)置參數(shù)
paramin[2] = sec2;
(*(void(*)())IAP_ENTER_ADR)(paramin,paramout); // 調(diào)用IAP服務(wù)程序
return(paramout[0]); // 返回狀態(tài)碼
}
/*********************************************************************************************************
**函數(shù)名稱:RamToFlash
**函數(shù)功能:復(fù)制RAM的數(shù)據(jù)到FLASH,命令代碼51
**入口參數(shù):dst 目標(biāo)地址,即FLASH起始地址,以256字節(jié)為分界
** src 源地址,即RAM地址,地址必須字對其
** no 復(fù)制字節(jié)個數(shù),為256/512/1024/4096
**出口參數(shù):IAP 操作狀態(tài)碼
** IAP返回值(paramout緩沖區(qū))
*********************************************************************************************************/
uint32 RamToFlash(uint32 dst, uint32 src, uint32 no)
{
paramin[0] = IAP_RAMTOFLASH; //設(shè)置命令字
paramin[1] = dst; //設(shè)置參數(shù)
paramin[2] = src;
paramin[3] = no;
paramin[4] = IAP_FCCLK;
(*(void(*)())IAP_ENTER_ADR)(paramin,paramout); //調(diào)用IAP服務(wù)程序
return(paramout[0]); //返回狀態(tài)碼
}
/*********************************************************************************************************
**函數(shù)名稱:EraseSector
**函數(shù)功能:擦除扇區(qū),命令代碼52
**入口參數(shù):sec1 起始扇區(qū)
** sec2 終止扇區(qū)
**出口參數(shù):IAP 操作狀態(tài)碼
** IAP返回值(paramout緩沖區(qū))
********************************************************************************************************/
uint32 EraseSector(uint32 sec1, uint32 sec2)
{
paramin[0] = IAP_ERASESECTOR; //設(shè)置命令字
paramin[1] = sec1; //設(shè)置參數(shù)
paramin[2] = sec2;
paramin[3] = IAP_FCCLK;
(*(void(*)())IAP_ENTER_ADR)(paramin,paramout); //調(diào)用IAP服務(wù)程序
return(paramout[0]); //返回狀態(tài)碼
}
/*********************************************************************************************************
**函數(shù)名稱:BlankCHK
**函數(shù)功能:查空扇區(qū),命令代碼53
**入口參數(shù):sec1 起始扇區(qū)
** sec2 終止扇區(qū)
**出口參數(shù):IAP 操作狀態(tài)碼
** IAP返回值(paramout緩沖區(qū))
********************************************************************************************************/
uint32 BlankCHK(uint32 sec1, uint32 sec2)
{
paramin[0] = IAP_BLANKCHK; //設(shè)置命令字
paramin[1] = sec1; //設(shè)置參數(shù)
paramin[2] = sec2;
paramin[3] = IAP_FCCLK;
(*(void(*)())IAP_ENTER_ADR)(paramin,paramout); //調(diào)用IAP服務(wù)程序
return(paramout[0]); //返回狀態(tài)碼
}
/*********************************************************************************************************
**函數(shù)名稱:ReadParID
**函數(shù)功能:讀器件ID,命令代碼54
**入口參數(shù):器件ID地址指針
**出口參數(shù):IAP 操作狀態(tài)碼
** IAP返回值(paramout緩沖區(qū))
********************************************************************************************************/
uint32 ReadParID(uint32 *Device_ID)
{
paramin[0] = IAP_READPARTID; //設(shè)置命令字
(*(void(*)())IAP_ENTER_ADR)(paramin,paramout); //調(diào)用IAP服務(wù)程序
*Device_ID = paramout[1];
return(paramout[0]); //返回狀態(tài)碼
}
/*********************************************************************************************************
**函數(shù)名稱:BootCodeID
**函數(shù)功能:讀boot代碼ID,命令代碼55
**入口參數(shù):boot代碼ID地址指針
**出口參數(shù):IAP 操作狀態(tài)碼
** IAP返回值(paramout緩沖區(qū))
********************************************************************************************************/
uint32 BootCodeID(uint32 *Boot_ID)
{
paramin[0] = IAP_BOOTCODEID; //設(shè)置命令字
(*(void(*)())IAP_ENTER_ADR)(paramin,paramout); //調(diào)用IAP服務(wù)程序
*Boot_ID = paramout[1];
return(paramout[0]); //返回狀態(tài)碼
}
/*********************************************************************************************************
**函數(shù)名稱:Compare
**函數(shù)功能:校驗數(shù)據(jù),命令代碼56
**入口參數(shù):dst 目標(biāo)地址,即RAM/FLASH起始地址,地址必須字對齊
** src 源地址,即RAM/RAM地址,地址必須字對齊
** no 比較字節(jié)個數(shù),必須能被4整除
**出口參數(shù):IAP 操作狀態(tài)碼
** IAP返回值(paramout緩沖區(qū))
********************************************************************************************************/
uint32 Compare(uint32 dst,uint32 src,uint32 no)
{
paramin[0] = IAP_COMPARE; //設(shè)置命令字
paramin[1] = dst; //設(shè)置參數(shù)
paramin[2] = src;
paramin[3] = no;
(*(void(*)())IAP_ENTER_ADR)(paramin,paramout); //調(diào)用IAP服務(wù)程序
return(paramout[0]); //返回狀態(tài)碼
}
/*********************************************************************************************************
**函數(shù)名稱:Reinvoke_ISP
**函數(shù)功能:重新調(diào)用ISP,命令代碼57。
**入口參數(shù):無
**出口參數(shù):無
********************************************************************************************************/
void Reinvoke_ISP(void)
{
paramin[0] = IAP_REINVOKE_ISP; // 設(shè)置命令字
(*(void(*)())IAP_ENTER_ADR)(paramin,paramout); // 重新調(diào)用ISP
}
/*********************************************************************************************************
**函數(shù)名稱:WriteFlash
**函數(shù)功能:向FLASH中寫入數(shù)據(jù)
**入口參數(shù):dst 目標(biāo)地址,即FLASH起始地址,地址必須以256字節(jié)對齊,即地址的低8位必須為0
** src 源地址,即RAM地址,地址必須字對齊,即地址的低兩位必須為0
** no 寫入字節(jié)數(shù),必須為256/512/1024/4096
**出口參數(shù):Compare的返回值,操作成功正確返回0
********************************************************************************************************/
uint8 WriteFlash(uint32 dst, uint32 src, uint32 no)
{
SelSector((uint8)(dst/0x1000),(uint8)((dst+no)/0x1000));//選擇扇區(qū)
EraseSector((dst/0x1000),(dst+no)/0x1000); //擦除扇區(qū)
BlankCHK((dst/0x1000),(dst+no)/0x1000); //查空扇區(qū)
SelSector((uint8)(dst/0x1000),(uint8)((dst+no)/0x1000));//選擇扇區(qū)
RamToFlash(dst,src,no); //寫數(shù)據(jù)到FLASH
return((uint8)(Compare(dst,src,no))); //比較數(shù)據(jù)
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -