?? iaptest.c
字號(hào):
/****************************************************************************
* 文件名:IAPTEST.C
* 功能:LPC2200的IAP功能測(cè)試。
* 說(shuō)明:調(diào)用IAP服務(wù)程序,完成FLASH編程操作。
* 將paramout添加到Watch窗口,觀察返回值。
****************************************************************************/
#include "config.h"
/* 定義IAP命令字 */
#define IAP_SELSECTOR 50
#define IAP_RAMTOFLASH 51
#define IAP_ERASESECTOR 52
#define IAP_BLANKCHK 53
#define IAP_READPARTID 54
#define IAP_BOOTCODEID 55
#define IAP_COMPARE 56
/* 定義IAP返回狀態(tài)字 */
#define CMD_SUCCESS 0
#define INVALID_COMMAND 1
#define SRC_ADDR_ERROR 2
#define DST_ADDR_ERROR 3
#define SRC_ADDR_NOT_MAPPED 4
#define DST_ADDR_NOT_MAPPED 5
#define COUNT_ERROR 6
#define INVALID_SECTOR 7
#define SECTOR_NOT_BLANK 8
#define SECTOR_NOT_PREPARED_FOR_WRITE_OPERATION 9
#define COMPARE_ERROR 10
#define BUSY 11
#define PARAM_ERROR 12
#define ADDR_ERROR 13
#define ADDR_NOT_MAPPED 14
#define CMD_LOCKED 15
#define INVALID_CODE 16
#define INVALID_BAUD_RATE 17
#define INVALID_STOP_BIT 18
uint32 paramin[8]; // IAP入口參數(shù)緩沖區(qū)
uint32 paramout[8]; // IAP出口參數(shù)緩沖區(qū)
/****************************************************************************
* 名稱(chēng):SelSector()
* 功能:IAP操作扇區(qū)選擇,命令代碼50。
* 入口參數(shù):sec1 起始扇區(qū)
* sec2 終止扇區(qū)
* 出口參數(shù):IAP返回值(paramout緩沖區(qū))
****************************************************************************/
void SelSector(uint8 sec1, uint8 sec2)
{ paramin[0] = IAP_SELSECTOR; // 設(shè)置命令字
paramin[1] = sec1; // 設(shè)置參數(shù)
paramin[2] = sec2;
iap_entry(paramin, paramout); // 調(diào)用IAP服務(wù)程序
}
/****************************************************************************
* 名稱(chēng):RamToFlash()
* 功能:復(fù)制RAM的數(shù)據(jù)到FLASH,命令代碼51。
* 入口參數(shù):dst 目標(biāo)地址,即FLASH起始地址。以512字節(jié)為分界
* src 源地址,即RAM地址。地址必須字對(duì)齊
* no 復(fù)制字節(jié)個(gè)數(shù),為512/1024/4096/8192
* 出口參數(shù):IAP返回值(paramout緩沖區(qū))
****************************************************************************/
void 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] = Fosc/1000; // 當(dāng)不使用PLL功能時(shí),F(xiàn)cclk=Fosc
iap_entry(paramin, paramout); // 調(diào)用IAP服務(wù)程序
}
/****************************************************************************
* 名稱(chēng):EraseSector()
* 功能:扇區(qū)擦除,命令代碼52。
* 入口參數(shù):sec1 起始扇區(qū)
* sec2 終止扇區(qū)
* 出口參數(shù):IAP返回值(paramout緩沖區(qū))
****************************************************************************/
void EraseSector(uint8 sec1, uint8 sec2)
{ paramin[0] = IAP_ERASESECTOR; // 設(shè)置命令字
paramin[1] = sec1; // 設(shè)置參數(shù)
paramin[2] = sec2;
paramin[3] = Fosc/1000; // 當(dāng)不使用PLL功能時(shí),F(xiàn)cclk=Fosc
iap_entry(paramin, paramout); // 調(diào)用IAP服務(wù)程序
}
/****************************************************************************
* 名稱(chēng):BlankCHK()
* 功能:扇區(qū)查空,命令代碼53。
* 入口參數(shù):sec1 起始扇區(qū)
* sec2 終止扇區(qū)
* 出口參數(shù):IAP返回值(paramout緩沖區(qū))
****************************************************************************/
void BlankCHK(uint8 sec1, uint8 sec2)
{ paramin[0] = IAP_BLANKCHK; // 設(shè)置命令字
paramin[1] = sec1; // 設(shè)置參數(shù)
paramin[2] = sec2;
iap_entry(paramin, paramout); // 調(diào)用IAP服務(wù)程序
}
/****************************************************************************
* 名稱(chēng):ReadParID()
* 功能:扇區(qū)查空,命令代碼53。
* 入口參數(shù):無(wú)
* 出口參數(shù):IAP返回值(paramout緩沖區(qū))
****************************************************************************/
void ReadParID(void)
{ paramin[0] = IAP_READPARTID; // 設(shè)置命令字
iap_entry(paramin, paramout); // 調(diào)用IAP服務(wù)程序
}
/****************************************************************************
* 名稱(chēng):BootCodeID()
* 功能:讀取boot代碼版本號(hào),命令代碼55。
* 入口參數(shù):無(wú)
* 出口參數(shù):IAP返回值(paramout緩沖區(qū))
****************************************************************************/
void BootCodeID(void)
{ paramin[0] = IAP_BOOTCODEID; // 設(shè)置命令字
iap_entry(paramin, paramout); // 調(diào)用IAP服務(wù)程序
}
/****************************************************************************
* 名稱(chēng):Compare()
* 功能:校驗(yàn)數(shù)據(jù),命令代碼56。
* 入口參數(shù):dst 目標(biāo)地址,即RAM/FLASH起始地址。地址必須字對(duì)齊
* src 源地址,即FLASH/RAM地址。地址必須字對(duì)齊
* no 復(fù)制字節(jié)個(gè)數(shù),必須能被4整除
* 出口參數(shù):IAP返回值(paramout緩沖區(qū))
****************************************************************************/
void Compare(uint32 dst, uint32 src, uint32 no)
{ paramin[0] = IAP_COMPARE; // 設(shè)置命令字
paramin[1] = dst; // 設(shè)置參數(shù)
paramin[2] = src;
paramin[3] = no;
iap_entry(paramin, paramout); // 調(diào)用IAP服務(wù)程序
}
/****************************************************************************
* 名稱(chēng):main()
* 功能:IAP函數(shù)調(diào)用,測(cè)試。通過(guò)觀察IAP出口參數(shù)來(lái)判斷操作是否成功。
* 說(shuō)明:程序沒(méi)有進(jìn)行出錯(cuò)處理。
* 要設(shè)置編譯參數(shù)-apcs /interwork,因?yàn)镮AP為T(mén)humb指令。
* 使用IAP功能時(shí),片內(nèi)RAM的頂端的32字節(jié)保留給IAP操作使用,所以在STARTUP.S文件中
* 初始化用戶(hù)模式堆棧為StackUsr-20*4,以保證IAP正常操作。
****************************************************************************/
int main(void)
{ MAMCR = 0; // 關(guān)閉MAM
PLLCON = 0; // 關(guān)閉PLL
PLLFEED = 0xaa;
PLLFEED = 0x55;
ReadParID();
BootCodeID();
SelSector(1,1); // 選擇扇區(qū)1
EraseSector(1,1); // 擦除扇區(qū)1
BlankCHK(1,1) ; // 查空扇區(qū)1
SelSector(1,1);
RamToFlash(0x00002000, 0x40000000, 512); // 寫(xiě)數(shù)據(jù)到扇區(qū)1
BlankCHK(1,1) ;
Compare(0x00002000, 0x40000000, 512); // 比較數(shù)據(jù)
while(1);
return(0);
}
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -