新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > C8051FXXX單片機FLASH程序的自動升級

        C8051FXXX單片機FLASH程序的自動升級

        作者: 時間:2004-12-11 來源:網絡 收藏

        作者Email: wolfman6353@sina.com

        引言:

        系列高速SOC是由美國Cygnal公司開發的完全集成的混合信號系統級芯片,具有與8051兼容的微處理器內核,內部集成存儲器,具有在系統重新編程能力,以C8051F020為例,內部集成64K的存儲器。在系統控制軟件的開發調試階段,可用集成開發環境來下載及測試系統,但當將C8051F020目標系統集成到產品后,則由于操作系統及軟硬件接口不一樣等等原因,不能在最終產品中用集成開發環境來下載,故產品到了用戶處之后,如要再進行FLASH程序的更新,則必須更換相應的集成電路印刷板,造成很多麻煩及不可靠因素。筆者通過實驗,在用戶操作界面的PC機及C8051F020的控制系統之間,通過串行口進行C8051F020控制程序的及程序加密,從而使用戶只要從互聯網上下載控制程序,即可實現單片機程序的。以下以64KBFLASH RAM為例簡要介紹單片機目標程序的準備及的制作過程。

        1)系統簡介及自動升級的實現方法

        PC機(80486/DX2以上) 具有1.44既砬及串行口。單片機控制系統(具有串行口及內置的FLASH程序區)。PC與之間通過九針串行接口線相連。設置傳送速率為115200BIT/S。

        C8051F020單片機的FLASH RAM分為用戶程序區(0000H~0FDFDH),廠家保留及加密區(0FDFEH~0FFFFH)兩部分。現將用戶程序區(0000H~0FDFDH)的0000H~0DFFFH部分用于裝載用戶程序,而0E000H~0FDFDH部分作為引導程序區,引導程序區在升級時不能改變,它用于與用戶操作界面的PC機部分進行程序接收及裝載等工作。

        在控制程序區0000H~0DFFFH中,做一握手程序塊,在上電時,用于和用戶操作界面PC機部分進行握手,當接收到PC機部分要進行軟件升級的命令時,程序跳至引導程序區,執行如下流程:

        ->發送準備升級字節到PC機

        ->刪除FLASH程序區

        ->發送開始下載命令到PC機

        ->接收且放到相應地址

        ->加密

        為了達到自動升級的目的,需要在用戶界面的PC機引導時,自動檢測PC機外設,軟盤控制器,一旦檢索到軟盤中有升級文件及其索引文件,且其版本比現有的單片機控制程序的版本高,則開始執行PC機中的下載程序。

        2)刪除0000H~ODFFFH的FLASH程序區
        系列單片機將FLASH程序區按512字節為一頁(PAGE)來組織,在刪除控制程序區0000H~ODFFFH時,首先屏蔽掉所有中斷,使能程序刪除位PSEE(PSCTL.1),同時使能PSWE(PSCTL.0)MOVX指令指向FALSH程序區。應用MOVX指令在每一頁的任意一地址寫0FFH,則將該頁的所有字節都置為0FFH,從而實現了該頁的刪除。依此操作可刪除所有的程序頁。刪除部分程序如下:


        //刪除0000H’ODFFFH的FLASH程序區
        DEL_NEXT_PAGE:
        CLR EA
        MOV A,FLSCL
        ANL A,#0FEH
        ORL A,#01H
        MOV FLSCL,A
        MOV A,PSCTL
        ANL A,#0FCH
        ORL A,#03H
        MOV PSCTL,A;#03H//使能頁刪除及頁寫操作
        MOV A,#0FFH
        MOVX @DPTR,A//將該頁全填充為0FFH
        INC DPH
        INC DPH//調節頁指針
        MOV A,PSCTL
        ANL A,#0FDH
        MOV PSCTL,A;#03H
        MOV A,DPH
        CJNE A,#0E0H,DEL01_NEXT_PAGE
        DEL01_NEXT_PAGE:
        JC DEL_NEXT_PAGE

        3)從PC中接收FLASH字節
        以下程序用于從PC機中接收程序并放到相應的FLASH地址。在此僅使能PSWE(PSCTL.0)位,使MOVX指令指向FALSH程序區。
        MOV DPTR,#0000H
        MOV FLSCL,#01H
        MOV PSCTL,#01H;
        RECEIVE_NEXT_DOWNLOAD_CHAR:
        MOV FLSCL,#01H
        MOV PSCTL,#01H;
        JNB RI,$
        CLR RI
        MOV A,SBUF0
        MOVX @DPTR,A
        INC DPTR
        MOV A,DPH
        CJNE A,#0E0H,RECEIVE_NEXT_DOWNLOAD_CHAR
        MOV FLSCL,#01H //FLASH 寫使能
        MOV PSCTL,#01H
        MOV DPTR,#0FDFEH
        CLR A
        MOVX @DPTR,A
        MOV DPTR,#0FDFFH
        MOVX @DPTR,A
        MOV PSCTL,#00H
        MOV FLSCL,#00H
        CYCLE_FOREVER:SJMP CYCLE_FOREVER;死循環
        RET


        4)FLASH程序的準備

        為了更快地得到―下載到C8051F020的FLASH程序,先在CYGNAL IDE開發環境中,將做好的控制程序編澤,鏈按,然后用廠家提供的串行適配器將PC與目標板連接起來,傳送FLASH程序到目標系統中去。接下來用“UPLOAD MEMORY T0 PILE…”(如圖示)功能將0000H~OEOOOH的FLASH代碼程序上載到硬盤存儲器中,再將此ASCII文件轉化為16進制的HE文件,注意將其十的0DH,0AH等回車換行字節取消,最后生成的HEX文件即可被直接下載到FLASH的0000H~0DFFFH的相應地址中。此HEX文件即可發送至用戶處,用于升級用戶的單片機FLASH程序。

        5)C程序的準備
        //發送FLASH程序文件到單片機中去
        BOOL SendFileToFlash()
        {
        unsigned char ch;
        FILE *fp;
        long int flen,wi=0;
        int i,j;

        if ((fp = fopen("flashwl","rb"))==NULL)
        {
        return FALSE;
        }
        //初使化串口,且與單片機系統握手
        InitialCommuClass();

        //發送數據
        for (wi=0,j=0;wiflen;wi++)
        {
        if (feof(fp)!=0)//到達文件結束
        break;

        fread(ch,sizeof(unsigned char),1,fp);
        for (;;)
        if (SendAByte(ch)==TRUE)
        break;

        Printf("%ld bytes is transmitted!",wi);}
        fclose(fp);
        for (;;)
        {
        Printf("All bytes is transmitted!");
        }

        }

        //轉換上載文件為可下載的HEX目標文件
        BOOL ConvertFileToFlash()
        {
        unsigned char ch,ru;
        FILE *fp,*fpw;
        long int flen,wi=0;
        int i,j;

        if ((fp = fopen("SOURCEC","rb"))==NULL)
        {
        return FALSE;
        }
        if ((fpw = fopen("HEXOBJECT","wb"))==NULL)
        {
        return FALSE;
        }

        for (wi=0,j=0;;wi++)
        {
        if (feof(fp)!=0)
        break;
        ru=0;
        fread(ch,sizeof(unsigned char),1,fp);
        if ((ch>=0x30) (ch=0x39))
        ru+=(ch-0x30)*16;
        else if ((ch>=0x61) (ch=0x66))
        ru+=((ch-0x61)+0x0a)*16;
        fread(ch,sizeof(unsigned char),1,fp);
        if ((ch>=0x30) (ch=0x39))
        ru+=ch-0x30;
        else if ((ch>=0x61) (ch=0x66))
        ru+=(ch-0x61)+0x0a;
        fwrite(ru,sizeof(unsigned char),1,fpw);
        fread(ch,sizeof(unsigned char),1,fp);/*0x0d*/
        fread(ch,sizeof(unsigned char),1,fp);/*0x0d*/
        fread(ch,sizeof(unsigned char),1,fp);/*0x0a*/
        j++;
        if (j==255)
        {
        j=0;
        fread(ch,sizeof(unsigned char),1,fp);
        fread(ch,sizeof(unsigned char),1,fp);
        fread(ch,sizeof(unsigned char),1,fp);
        fread(ch,sizeof(unsigned char),1,fp);
        fread(ch,sizeof(unsigned char),1,fp);
        continue;
        }
        }
        fclose(fp);fclose(fpw);
        }
        結束語

        以上所介紹的FLASH自動升級程序的PC部分在VC6.0及TC2.0中開發,并與805lFXXX系列的單片機聯機成功,并最后用于在用戶處的單片機FLASH程序升級。



        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 潞西市| 昆山市| 五指山市| 中超| 石河子市| 许昌市| 乐亭县| 衡东县| 乌恰县| 辽中县| 进贤县| 芷江| 台前县| 丰都县| 得荣县| 阿合奇县| 万全县| 锡林浩特市| 宁强县| 金塔县| 宜兰县| 天等县| 临桂县| 桂林市| 桓台县| 涞源县| 正定县| 田东县| 弋阳县| 临夏市| 菏泽市| 积石山| 英德市| 屏东市| 锦屏县| 虎林市| 乐业县| 札达县| 台东市| 文成县| 南宁市|