新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 寫MSP430片內flash

        寫MSP430片內flash

        作者: 時間:2016-11-25 來源:網絡 收藏
        //******************************************************************************

        // 參數: adr 為地址 , 范圍 0x1000~0xFFFF
        void FlashRead(long adr,uint8 *bBuf,uint8 bLen)
        {
        while (bLen--)
        *bBuf++=*(uint8 *)adr++;
        return;
        }

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


        // 寫入地址 adr 寫入數據:*pc_byte

        void FlashWrite(long adr,uchar *Datain,uint len)
        {

        //FCTL2 = FWKEY + FSSEL_1 + FN3 + FN4;//MCLK 16*FN4 + 8*FN3
        FCTL3 = FWKEY;
        FCTL1 = FWKEY + WRT;

        while(FCTL3 & BUSY); //如果處于忙狀態,則等待
        while(count--)
        {

        while(FCTL3 & BUSY);
        *(uchar*)adr++ = *Datain++;
        }
        FCTL1 = FWKEY;
        FCTL3 = FWKEY + LOCK;
        while(FCTL3 & BUSY);
        }

        EraseSectorFlash 過程



        void EraseSectorFlash(unsigned int adr)
        {

        _DINT();
        uchar *p0;
        //FCTL2 = FWKEY + FSSEL_1 + FN3 + FN4;//選擇時鐘源,分頻
        FCTL3 = FWKEY;//清除LOCK
        while(FCTL3 & BUSY);//如果出于忙,則等待
        FCTL1 = FWKEY + ERASE;//使能段操作 每段512字節
        p0 = (unsigned char *)adr;//數值強制轉換成指針
        *p0 = 0; //向段內任意地址寫0,即空寫入,啟動擦除操作
        FCTL1 = FWKEY;
        FCTL3 = FWKEY + LOCK;
        while(FCTL3 & BUSY);
        _EINT(); //開總中斷
        }

        查看空閑的FLASH 地址,避免擦除代碼所在的地址。每次擦除均是一段一段的擦除,每段512字節。

        找不到datasheet,不知道段的起止地址的,可以打開memory ,在內存窗口,用代碼嘗試隨便寫入一個任意地址,看哪些地方被改寫成0xFF 就知道段的起止,如:

        我們在0x15000寫入(EraseSectorFlash(0x15000);),那里原本有非0xFF數據,好辨認(是FF的可以先寫再擦)。看到段的起止是15000-151ff 剛好是512 。

        0x15000+0x200->0x15200 所以下一段的起始地址是 0x15200 以此類推。

        驗證代碼:

        EraseSectorFlash(0x2A000);
        EraseSectorFlash(0x2A200);
        EraseSectorFlash(0x2A400);
        EraseSectorFlash(0x2A600);

        FlashWrite(0x2A000,origin_protect_data,512);
        memset(origin_protect_data,0xCB,900);
        FlashWrite(0x2A200,origin_protect_data,512);
        memset(origin_protect_data,0xCA,900);
        FlashWrite(0x2A400,origin_protect_data,512);
        memset(origin_protect_data,0xC9,900);
        FlashWrite(0x2A600,origin_protect_data,512);


        編譯地址分配:
        在IAR窗口中,點擊view》memory ,在內存窗口,點下拉框選擇 SER 可知,SFR地址為 0x0000-0fff
        RAM地址為:0x1c00-5bff
        FLASH地址:0x5c00-45bff
        結合看下面的地址分配圖,即可知道各部分代碼和數據被分配到什么地方。
        ****************************************
        * *
        * SEGMENTS IN ADDRESS ORDER *
        * *
        ****************************************

        SEGMENT SPACE START ADDRESS END ADDRESS SIZE TYPE ALIGN
        ======= ===== ============= =========== ==== ==== =====
        DATA16_AN 0102 - 0103 2 rel 0
        0120 - 0121 2
        0140 - 0141 2
        0144 - 0145 2
        015C - 015D 2
        0168 - 016F 8
        020A - 020B 2
        0222 - 0225 4
        0228 - 0229 2
        0242 - 0245 4
        024A - 024B 2
        026A - 026B 2
        0282 - 0285 4
        028A - 028B 2
        02A2 - 02A5 4
        02A8 - 02A9 2
        0340 - 0341 2
        0350 - 0351 2
        0380 - 0387 8
        0392 - 0397 6
        03AE - 03AF 2
        03C0 - 03C3 4
        03D2 - 03D3 2
        0640 - 0641 2
        0646 - 0648 3
        064C - 064C 1
        064E - 064E 1
        065C - 065D 2
        DATA20_I 1C00 - 1E26 227 rel 1
        DATA20_Z 1E28 - 28B7 A90 rel 1
        CSTACK 5400 - 5BFF 800 rel 1
        //-------------------------------------以下為編譯到FLASH的代碼---------------------------
        CSTART 5C00 - 5C2F 30 rel 1
        ISR_CODE 5C30 - 5E63 234 rel 1
        1 5E64 - D123 72C0 rel 1
        INTVEC FF80 - FFF9 7A com 1
        RESET FFFE - FFFF 2 rel 1
        DATA20_C 00010000 - 00019486 9487 rel 1
        DATA20_ID 00019488 - 000196AE 227 rel 1
        ****************************************
        * *
        * END OF CROSS REFERENCE *
        * *
        ****************************************
        30 112 bytes of CODE memory
        5 303 bytes of DATA memory (+ 81 absolute )
        38 574 bytes of CONST memory
        Errors: none
        Warnings: none
        官方資料:http://pan.baidu.com/share/link?shareid=249328&uk=3523275049

        1 Msp430Flash型單片機內部Flash存儲器介紹


        MSP430的Flash存儲器是可位、字節、字尋址和編程的存儲器。該模塊由一個集成控制器來控制編程和擦除的操作。控制器包括三個寄存器,一個時序發生器及一個提供編程、擦除電壓的電壓發生器。


        Msp430的Flash存儲器的特點有:


        1) 產生內部編程電壓


        2) 可位、字節、字編程,可以單個操作,也可以連續多個操作


        3) 超低功耗操作


        4) 支持段擦除和多段模塊擦除


        2 Flash存儲器的分割


        Msp430 Flash存儲器分成多個段。可對其進行單個字節、字的寫入,也可以進行連續多個字、字節的寫入操作,但是最小的擦除單位是段。


        上一頁 1 2 3 4 下一頁

        關鍵詞: MSP430片內flas

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 鲜城| 曲周县| 赤水市| 太仆寺旗| 大姚县| 南江县| 建平县| 成武县| 曲麻莱县| 莱芜市| 理塘县| 怀柔区| 额敏县| 中阳县| 潞城市| 霍州市| 昂仁县| 英山县| 象州县| 大丰市| 内丘县| 抚顺市| 峨山| 永德县| 泰顺县| 塔河县| 历史| 富顺县| 东至县| 灵台县| 上杭县| 尖扎县| 嫩江县| 沾益县| 睢宁县| 鄱阳县| 凌云县| 贡嘎县| 噶尔县| 从江县| 仲巴县|