<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > LPC1100處理器SD卡升級應用程序

LPC1100處理器SD卡升級應用程序

作者: 時(shí)間:2016-11-10 來(lái)源:網(wǎng)絡(luò ) 收藏
隨著(zhù)處理器的發(fā)展,IAP升級方式越來(lái)越受到歡迎。而IAP升級的方式也由很多,如:通過(guò)串口升級、GPRS遠程升級、SD卡升級等等。這里詳細介紹怎樣使用SD卡升級應用程序的方法。

下面先介紹LPC1100處理器IAP的基礎知識:

本文引用地址:http://dyxdggzs.com/article/201611/317393.htm

1. LPC1100處理器(LPC1114)Flash分配:LPC1114一共有32K Flash,共分為8個(gè)扇區,每個(gè)扇區的大小為4K,具體如下:

2.NXP的IAP命令都一樣,一共有9條:

3.IAP命令是通過(guò)寄存器R0和R1進(jìn)行參數傳遞的,R0傳遞參數,R1傳遞返回值:

IAP功能應用:

1.定義IAP程序的入口地址

代碼:

#define IAP_ENTER_ADR 0x1FFF1FF1 /* IAP入口地址定義 */

2.定義參數

代碼:

uint32 ParamIn[8]; /* IAP入口參數緩沖區 */
uint32 ParamOut[8];/* IAP出口參數緩沖區 */

3.定義函數類(lèi)型指針

代碼:

void (*IAP_Entry)(uint32 *param_tab, uint32 *result_tab) =

(void(*)())IAP_ENTER_ADR; // 定義函數指針

4.注意事項:

①按照上面函數類(lèi)型調用IAP函數即可,不過(guò)要注意函數的參數。

②由于在擦寫(xiě)操作期間,片上Flash存儲器不可訪(fǎng)問(wèn)。IAP代碼不能使用或禁止中斷。

③Flash編程命令使用片上RAM頂端32字節,用戶(hù)程序不能使用此空間。

IAP命令應用(代碼來(lái)自周工):

1.準備寫(xiě)操作扇區

代碼:

/*****************************************************************************
** Function name: SectorPrepare
** Descriptions: IAP操作扇區選擇,命令代碼50
** input parameters: sec1: 起始扇區
** sec2: 終止扇區
** output parameters: ParamOut[0]: IAP操作狀態(tài)碼,IAP返回值
** Returned value: ParamOut[0]: IAP操作狀態(tài)碼,IAP返回值
*******************************************************************************/
uint32 SectorPrepare(uint8 sec1, uint8 sec2)
{
ParamIn[0] = IAP_Prepare;/* 設置命令字 */
ParamIn[1] = sec1; /* 設置參數*/
ParamIn[2] = sec2;
(*IAP_Entry)(ParamIn, ParamOut);/* 調用IAP服務(wù)程序 */

return (ParamOut[0]); /* 返回狀態(tài)碼*/
}

2.將RAM 內容復制到Flash

代碼:

/*******************************************************************************
** Function name: RamToFlash
** Descriptions: 復制RAM的數據到FLASH,命令代碼51
** input parameters: dst: 目標地址,即FLASH起始地址。以512字節為分界
** src: 源地址,即RAM地址。地址必須字對齊
** no: 復制字節個(gè)數,為512/1024/4096/8192
** output parameters: ParamOut[0]: IAP操作狀態(tài)碼,IAP返回值
** Returned value: ParamOut[0]: IAP操作狀態(tài)碼,IAP返回值
********************************************************************************/
uint32 RamToFlash(uint32 dst, uint32 src, uint32 no)
{
ParamIn[0] = IAP_RAMTOFLASH; /* 設置命令字 */
ParamIn[1] = dst;/* 設置參數 */
ParamIn[2] = src;
ParamIn[3] = no;
ParamIn[4] = IAP_FCCLK;
(*IAP_Entry)(ParamIn, ParamOut); /* 調用IAP服務(wù)程序*/

return (ParamOut[0]); /* 返回狀態(tài)碼*/
}

3.擦除扇區

代碼:

/*******************************************************************************
** Function name: SectorErase
** Descriptions: 扇區擦除,命令代碼52
** input parameters: sec1 起始扇區
** sec2 終止扇區92
** output parameters: ParamOut[0]: IAP操作狀態(tài)碼,IAP返回值
** Returned value: ParamOut[0]: IAP操作狀態(tài)碼,IAP返回值
********************************************************************************/
uint32 SectorErase(uint8 sec1, uint8 sec2)
{
ParamIn[0] = IAP_ERASESECTOR; /* 設置命令字 */
ParamIn[1] = sec1; /* 設置參數 */
ParamIn[2] = sec2;
ParamIn[3] = IAP_FCCLK;
(*IAP_Entry)(ParamIn, ParamOut);/* 調用IAP服務(wù)程序 */

return (ParamOut[0]); /* 返回狀態(tài)碼 */
}

4.扇區查空

代碼:

/**********************************************************************************
** Function name: BlankChk
** Descriptions: 扇區查空,命令代碼53
** input parameters: sec1: 起始扇區
** sec2: 終止扇區92
** output parameters: ParamOut[0]: IAP操作狀態(tài)碼,IAP返回值
** Returned value: ParamOut[0]: IAP操作狀態(tài)碼,IAP返回值
**********************************************************************************/
uint32 BlankChk(uint8 sec1, uint8 sec2)
{
ParamIn[0] = IAP_BLANKCHK; /* 設置命令字 */
ParamIn[1] = sec1;/* 設置參數 */
ParamIn[2] = sec2;
(*IAP_Entry)(ParamIn, ParamOut);/* 調用IAP服務(wù)程序 */

return (ParamOut[0]);/* 返回狀態(tài)碼*/
}

5.比較<地址1><地址2><字節數>

代碼:

/*******************************************************************************
** Function name: DataCompare
** Descriptions: 校驗數據,命令代碼56
** input parameters: dst: 目標地址,即RAM/FLASH起始地址。地址必須字對齊
** src: 源地址,即FLASH/RAM地址。地址必須字對齊
** no: 復制字節個(gè)數,必須能被4整除
** output parameters: ParamOut[0]: IAP操作狀態(tài)碼,IAP返回值
** Returned value: ParamOut[0]: IAP操作狀態(tài)碼,IAP返回值
********************************************************************************/
uint32 DataCompare(uint32 dst, uint32 src, uint32 no)
{
ParamIn[0] = IAP_COMPARE; /* 設置命令字 */
ParamIn[1] = dst; /* 設置參數 */
ParamIn[2] = src;
ParamIn[3] = no;
(*IAP_Entry)(ParamIn, ParamOut); /* 調用IAP服務(wù)程序 */

return (ParamOut[0]); /* 返回狀態(tài)碼 */
}

有上面的幾個(gè)函數后,下面就可以根據需要編寫(xiě)SD卡升級函數了:

1.定義用戶(hù)程序地址

代碼:

#define APP_CODE_START_ADDR 0x00006000 // 用戶(hù)程序起始地址

2.從SD卡中讀寫(xiě)bin文件更新升級

從SD卡中升級程序很簡(jiǎn)單,從SD卡中打開(kāi)升級文件,每次讀取512自己,然后寫(xiě)入Flash,直到編寫(xiě)完成。

代碼:

/**********************************************************************************
* FunctionName : UCSDCardProgram()
* Description : 從SD卡編程
* EntryParameter : fileName - 應用程序在SD卡中的名字, buf - 緩沖
* ReturnValue : None
*********************************************************************************/
uint8 UCSDCardProgram(uint8 *fileName, uint8 *buf)
{
uint32 addr = 0;
FATFS fs; /*Work area (file system object) for logical drive*/
FIL file; /*file objects*/
UINT br; /*File R/W count*/
FRESULT res;

DisableIRQ();// 禁止中斷
SectorPrepare(6, 6); // 選擇扇區
SectorErase(6, 6); // 擦除扇區
EnableIRQ(); // 使能中斷

/*Register a work area for logical drive 0*/
f_mount(0, &fs);

/*Create file*/
res = f_open(&file, (const TCHAR *)fileName, FA_OPEN_EXISTING|FA_READ);

if(res != FR_OK)
{
return res;
}
else
{
while (1)
{
res = f_read(&file, buf, 512, &br); // 讀取數據

DisableIRQ();
SectorPrepare(6, 6);
RamToFlash(APP_CODE_START_ADDR + addr, (uint32)buf, 512); // 寫(xiě)數據到FLASH
EnableIRQ();
addr += 512;

if ((res != FR_OK) || (br < 512))
{
break;
}
}
}

/*Close all files*/
f_close(&file); // 關(guān)閉文件,必須和f_open函數成對出現

/*Unregister a work area before discard it*/
f_mount(0, 0);

return FR_OK;
}

3.主函數:

主函數實(shí)現按鍵掃描,如果有按鍵,進(jìn)行SD卡升級,如果沒(méi)有按鍵直接跳轉到應用程序

代碼:

/**********************************************************************************
* FunctionName : main()
* Description : 主函數
* EntryParameter : None
* ReturnValue : None
*********************************************************************************/
int main(void)
{
void (*userProgram)() = (void (*)())OSInit; // 函數指針

OSInit(); // 初始化系統

while (1)
{
if (KeyGetValue())
{
UCSDCardProgram("LPC1114.bin", SDBuf);
}

userProgram = (void (*)())(APP_CODE_START_ADDR + 1);
(*userProgram)(); // 啟動(dòng)程序
}
}

到此IAP程序完成了,下面就是編寫(xiě)應用程序了。。。。。。。。。。。。。。。。。。。。。。

應用程序編寫(xiě):

應用程序編寫(xiě)沒(méi)有什么特殊的,只是需要注意幾個(gè)地方的設置

1.設置編譯地址:

2.編譯設置

3.生存bin文件

4.編寫(xiě)應用程序,并把bin文件存放SD卡中,運行IAP升級程序。




關(guān)鍵詞: LPC1100處理器SD卡升

評論


技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>