新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > LPC1100處理器通過SD卡實現IAP功能

        LPC1100處理器通過SD卡實現IAP功能

        作者: 時間:2016-11-27 來源:網絡 收藏

        代碼:

        本文引用地址:http://www.104case.com/article/201611/322352.htm


        uint32 BlankChk(uint8 sec1, uint8 sec2)
        {
        ParamIn[0] = IAP_BLANKCHK;
        ParamIn[1] = sec1;
        ParamIn[2] = sec2;
        (*IAP_Entry)(ParamIn, ParamOut);

        return (ParamOut[0]);
        }

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

        代碼:


        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);

        return (ParamOut[0]);
        }

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

        1.定義用戶程序地址

        定義用戶程序的起始地址,用戶可以根據自己的實際情況設定,一般都從0x0000 0000開始存放IAP代碼,之后的空間才是存放用戶代碼的。

        代碼:

        #define APP_CODE_START_ADDR0x00006000// 用戶程序起始地址

        2.從SD卡中讀寫bin文件更新升級

        從SD卡中升級程序很簡單。流程是:從SD卡中打開升級文件,每次讀取512字節,然后寫入Flash,直到編寫完成。

        IAP支持256/512/1024/2048/4096等多字節編程方式,只是SD卡每扇區大小一般都是512字節,所以這里使用512字節為單位進行編程。

        代碼:
        uint8 UCSDCardProgram(uint8 *fileName, uint8 *buf)
        {
        uint32 addr = 0;
        FATFS fs;
        FIL file;
        UINTbr;
        FRESULT res;

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


        f_mount(0, &fs);


        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); // 寫數據到FLASH
        EnableIRQ();
        addr += 512;

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


        f_close(&file);// 關閉文件,必須和f_open函數成對出現


        f_mount(0, 0);

        return FR_OK;
        }

        3.主函數:

        主函數實現按鍵掃描,如果有按鍵,進行SD卡升級,如果沒有按鍵直接跳轉到應用程序。

        代碼一開始判斷按鍵,所以一般都是需要按下按鍵后復位系統,當然也可以適當循環掃描按鍵的次數。等待一定的時間。。。。。。。

        代碼:


        int main(void)
        {
        void (*userProgram)() = (void (*)())OSInit;// 函數指針

        OSInit();// 初始化系統

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

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

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

        應用程序編寫:

        應用程序編寫沒有什么特殊的,只是需要注意幾個地方的設置

        1.設置編譯地址:

        設置用戶程序的開始地址,根據需要設置,一般都在IAP函數之上,需要適當大于IAP,給IAP自己增加功能提供空間。內存也可以適當設置一下,不過一般應用程都沒有完全使用完內存,所以不設置也是可以的。

        2.編譯設置

        設置NO_CRP條件編譯,否則程序編譯會出錯,此字段在啟動代碼中使用,如果要加密代碼,此段號也需要設置。

        3.生存bin文件

        設置bin文件生成命令,具體的設置方法請看<>:http://bbs.eeworld.com.cn/thread-314169-1-1.html

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

        具體的升級過程:

        1.把IAP程序下載到板子上。

        2.編寫并編譯好應用程序,需要是的bin文件。

        3.把應用程序的bin文件拷貝到SD卡中。

        4.在板子上插入SD卡,并按下按鍵重啟系統。

        5.板子就會自動實現升級并跳轉到應用中運行。



        上一頁 1 2 下一頁

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 台北市| 阿拉尔市| 哈尔滨市| 潢川县| 伊春市| 赤城县| 合江县| 新丰县| 合水县| 太原市| 厦门市| 诸城市| 驻马店市| 瑞丽市| 屏山县| 安仁县| 吉隆县| 贡嘎县| 绥宁县| 东山县| 高邮市| 瑞昌市| 阿克苏市| 衡阳县| 长子县| 永顺县| 游戏| 剑阁县| 库伦旗| 丰都县| 香港 | 满城县| 莱州市| 天祝| 平原县| 青神县| 紫阳县| 黄骅市| 凤阳县| 原阳县| 汉源县|