新聞中心

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

        寫MSP430片內flash

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

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

        再來個塊寫入的(TI例程)

        //****************************************************************************

        // MSP430F14x Demo - Flash In-System Programming, BlockWrite

        //

        // Description: This program first copies the FlashWrite routine to RAM, then

        // erases flash seg A, then it increments all values in seg A using the 64

        // byte block write mode.

        //

        // Assumed default MCLK = DCO ~800 kHz.

        // Minimum RAM requirement = 512 bytes

        //

        // ** Set Breakpoint on NOP in the Mainloop to avoid Stressing Flash **

        //

        // MSP430F149

        // -----------------

        // /|| XIN|-

        // | | |

        // --|RST XOUT|-

        // | |

        //

        // H. Grewal / L. Westlund

        // Texas Instruments Inc.

        // Jun 2006

        // Built with IAR Embedded Workbench Version: 3.30A

        //******************************************************************************

        #include

        // Global variables

        char value = 0; // 8-bit value to write to segment A

        char* Flash_ptr; // Flash pointer

        char* RAM_ptr; // RAM pointer

        char* END_ptr; // End of FlashWrite routine

        // Function prototypes

        void FlashWrite();

        void CopyRoutine();

        void End_of_FlashWrite();

        void main(void)

        {

        WDTCTL = WDTPW + WDTHOLD; // Stop watchdog timer

        _DINT(); // Diable Interrupts

        CopyRoutine(); // Copy FlashWrite routine to RAM

        _EINT(); // Enable Interrupts

        while(1) // Repeat forever

        {

        Flash_ptr = (char *) 0x1000; // Initialize Flash pointer

        FCTL2 = FWKEY + FSSEL1 + FN0; // MCLK/2 for Flash Timing Generator

        FCTL1 = FWKEY + ERASE; // Set Erase bit

        FCTL3 = FWKEY; // Clear Lock bit

        *Flash_ptr = 0; // Dummy write to erase Flash segment

        while(!(FCTL3 & WAIT)); // WAIT until Flash is ready

        asm("CALL #300h"); // Execute FlashWrite from RAM

        // Inline Assembly

        value++; // Increment value

        _NOP(); // SET BREAKPOINT HERE

        }

        }

        void CopyRoutine()

        {

        Flash_ptr = (char*)FlashWrite; // Set pointer to FlashWrite routine

        RAM_ptr = (char*)0x0300; // Set pointer to RAM

        END_ptr = (char*)End_of_FlashWrite; // Set pointer to End_of_FlashWrite

        while(END_ptr != Flash_ptr) // Check for end of FlashWrite

        {

        *RAM_ptr = *Flash_ptr; // Copy word to RAM

        Flash_ptr++; // Increment Flash pointer

        RAM_ptr++; // Increment RAM pointer

        }

        }

        void FlashWrite()

        {

        volatile int i; // Use as write counter

        Flash_ptr = (char*)0x1000; // Initialize Flash pointer

        while(FCTL3 & BUSY); // Check Flash BUSY bit

        FCTL1 = FWKEY + BLKWRT + WRT; // Enable block-write operation

        for(i = 0; i < 64; i++)

        {

        *Flash_ptr = value; // Write value to flash

        Flash_ptr++; // Double-increment Flash pointer

        while(!(FCTL3 & WAIT)); // WAIT until Flash is ready

        }

        FCTL1 = FWKEY; // Clear BLKWRT & WRT bits

        while(FCTL3 & BUSY); // Check Flash BUSY bit

        FCTL3 = FWKEY + LOCK; // Reset LOCK bit

        return; // Exits routine

        }

        void End_of_FlashWrite(){} // Marks end of FlashWrite

        內容摘要:一、MSP430單片機FLASH存儲器模塊特點1.8~3.6V工作電壓,2.7~3.6V編程電壓;擦除/編程次數可達100000次:數據保持時間從10年到100年不等:60KB空間編程時間<5秒:保密熔絲燒斷后不可恢復,不能再對JTAG進行任何訪問;FLASH編...

        一、MSP430 FLASH模塊特點
        1.8~3.6V工作電壓,2.7~3.6V編程電壓;
        擦除/編程次數可達100000次:
        數據保持時間從10年到100年不等:// 來自 :ST_M_8.C_N
        60KB空間編程時間<5秒:
        保密熔絲燒斷后不可恢復,不能再對JTAG進行任何訪問;
        FLASH編程/擦除時間由內部硬件控制,無任何軟件干預;

        二、FLASH存儲器的操作
        由于FLASH存儲器由很多相對獨立的段組成,因此可在一個段中運行程序,而對另一個段進行擦除或寫入操作。正在執行編程或擦除等操作的FLASH段是不能被訪問的,因為這時該段是與片內地址總線暫時斷開的。對FLASH模塊的操作可分為3類:擦除、寫入及讀出。而擦除又可分為單段擦除和整個模塊擦除;寫入可分為字寫入、字節寫入、字連續寫入和字節連續寫入
        1.FLASH擦除操作:對FLASH要寫入數據,必須先擦除相應的段,對FLASH存儲器的擦除必須是整段地進行,可以一段一段地擦除,也可以多端一起擦除,但不能一個字節或一個字地擦除。擦除之后各位為1。擦除操作的順序如下:
        選擇適當的時鐘源和分頻因子,為時序發生器提供正確時鐘輸入
        如果Lock=1,則將它復位:
        BUSY標志位,只有當BUSY=0時才可以執行下一步,否則不行
        如果擦除一段,則設置ERASE=1
        如果擦除多段,則設置MERAS=1
        如果擦除整個FLASH,則設置RASE=1,同時MERAS=1
        對擦除的地址范圍內的任意位置作一次空寫入,用以啟動擦除操作。
        在擦除周期選擇的時鐘源始終有效
        在擦除周期不修改分頻因子
        在BUSY=1期間不再訪問所操作的段
        電源電壓應符合芯片的相應要求// 來自 :ST_M_8.C_N
        對FLASH擦除要做4件事
        對FLASH控制寄存器寫入適當的控制位
        BUSY位
        空寫一次
        等待
        2.FLASH編程操作。對FLASH編程按如下順序進行:
        選擇適當的時鐘源和分頻因子
        如果Lock=1,則將它復位
        BUSY標志位,只有當BUSY=0時才可以執行下一步,否則不行
        如果寫入單字或單字節,則將設置WRT=1
        如果是塊寫或多字、多字節順序寫入,則將設置WRT=1,BLKWRT=1
        將數據寫入選定地址時啟動時序發生器,在時序發生器的控制下完成整個過程
        塊寫入可用于在FLASH段中的一個連續的存儲區域寫入一系列數據。一個塊為64字節長度。塊開始在0XX00H、0XX40H、0XX80H、0XXC0H等地址,塊結束在0XX3FH、0XX7FH、0XXBFH、0XXFFH等地址。塊操作在64字節分界處需要特殊的軟件支持,操作如下:
        等待WAIT位,直到WAIT=1,表明最后一個字或字節寫操作結束
        將控制位BLKWRT復位
        保持BUSY位為1,直到編程電壓撤離FLASH模塊
        在新塊被編程前,等待trcv(編程電壓恢復時間)時間
        在寫周期中,必須保證滿足以下條件:
        被選擇的時鐘源在寫過程中保持有效
        分頻因子不變
        在BUSY=1期間,不訪問FLASH存儲器模塊
        對FLASH寫入要做4件事
        對FLASH控制寄存器寫入適當的控制位
        BUSY位
        寫一個數據
        繼續寫一直到寫完
        3.FLASH錯誤操作的處理:在寫入FLASH控制寄存器控制參數時,可引發以下錯誤:
        如果寫入高字節口令碼錯誤,則引發PUC信號。小心操作可避免
        在對FLASH操作期間讀FLASH內容,會引發ACCVFIG狀態位的設置。小心操作可避免
        在對FLASH操作期間看門狗定時器溢出。建議用戶程序在進行FLASH操作之前先停止看門狗定時器,等操作結束后再打開看門狗
        所有的FLASH類型的MSP430器件0段都包含有中斷向量等重要的程序代碼,如果對其進行擦除操作,將會引起嚴重的后果
        不要在FLASH操作期間允許中斷的發生
        4.FLASH操作小結
        對FLASH的操作是通過對3個控制字中的相應位來完成的,只有控制位的唯一組合才能實現相應的功能。下表給出了正確的控制位組合:
        功能 BLKWRT WRT Meras Erase BUSY WAIT Lock
        字或字節寫入 0 1 0 0 0 0 0
        塊寫入 1 1 0 0 0 1 0
        段擦除并寫入 0 0 0 1 0 0 0
        擦除A和B以外段 0 0 1 0 0 0 0
        全部擦除并寫入 0 0 1 1 0 x 0

        三、FLASH寄存器說明// 來自 :ST_M_8.C_N
        允許編程、擦除等操作首先要對3個控制寄存器(FCTL1、FCTL2、FCTL3)的各位進行定義。它們使用安全鍵值(口令碼)來防止錯誤的編程和擦除周期,口令出錯將產生非屏蔽中斷請求。安全鍵值位于每個控制字的高字節,讀時為96H,寫時為5AH。
        1.FCTL1 控制寄存器1(用于控制所有寫/編程或者刪除操作的有效位),各位定義如下:
        bit15~8 bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0
        安全鍵值,讀為96H,寫5AH BLKWRT WRT -- -- -- MERAS ERASE --
        BLKWRT——段編程位。如果有較多的連續數據要編程到某一段或某幾段,則可選擇這種方式,這樣可縮短編程時間。在一段程序完畢,再編程其它段,需對該位先復位再置位,在下一條寫指令執行前WAIT位應為1。
        0:未選用段編程方式
        1:選用段編程方式
        WRT——編程位
        0:不編程,如對FLASH寫操作,發生非法訪問,使ACCVIFG位置位;
        1:編程
        MERAS——主存控制擦除位
        0:不擦除
        1:主存全擦除,對主存空寫時啟動擦除操作,完成后MERAS自動復位
        ERASE——擦除一段控制位
        0:不擦除
        1:擦除一段。由空寫指令帶入段號來指定擦除哪一段,操作完成后自動復位
        2.FCTL2 控制寄存器2(對進入時序發生器的時鐘進行定義),各位定義如下:
        bit15~8 bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0
        安全鍵值,讀為96H,寫5AH SSEL1 SSEL0 FN5 FN4 FN3 FN2 FN1 FN0
        SSEL1、SSEL0——選擇時鐘源
        0:ACLK
        1:MCLK
        2:SMCLK
        3:SMCLK
        FN5~FN0——分頻系數選擇位
        0:直通
        1:2分頻
        2:3分頻
        ...... read datasheet
        63:64分頻
        3.FCTL3 控制寄存器3(用于控制FLASH存儲器操作,保存相應的狀態標志和錯誤條件),各位定義如下:
        bit15~8 bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0
        安全鍵值,讀為96H,寫5AH -- -- EMEX Lock WAIT ACCVIFG KEYV BUSY
        EMEX——緊急退出位。對FLASH的操作失敗時使用該位作緊急處理
        0:無作用
        1:立即停止對FLASH的操作
        Lock——鎖定位,給已經編程好的FLASH存儲器加鎖
        0:不加鎖,FLASH存儲器可讀、可寫、可擦除
        1:加鎖,加鎖的FLASH存儲器可讀、不可寫、不可擦除
        WAIT——等待指示信號,該位只讀。// 來自 :ST_M_8.C_N
        0:段編程操作已經開始,編程操作進行中
        1:段編程操作有效,當前數據已經正確地寫入FLASH存儲器,后續編程數據被列入計劃
        ACCVIFG——非法訪問中斷標志。當對FLASH陣列進行編程或擦除操作時不能訪問FLASH,否則將使得該位置位
        0:沒有對FLASH存儲器的非法訪問
        1:有對FLASH存儲器的非法訪問
        KEYV——安全鍵值(口令碼)出錯標志位
        0:對3個控制寄存器的訪問,寫入時高字節是0A5H
        1:對3個控制寄存器的訪問,寫入時高字節不是0A5H,同時引發PUC信號
        KEYV不會自動復位,須用軟件復位
        BUSY——忙標志位。該位只讀。每次編程或擦除之前都應該檢查BUSY位。當編程或擦除啟動后,時序發生器將自動設置該位為1,操作完成后BUSY位自動復位
        0:FLASH存儲器不忙
        1:FLASH存儲器忙

        可以在程序中擦寫FLASH這樣就不用判斷Busy的標志,因為只有擦寫完成的時候FLASH才有效!程序才能繼續走!如果把程序拷到RAM中擦除就要判斷BUSY了!
        擦寫完成后可以不用LOCK,用LOCK只是一個保險作用!防止你對FLASH的非法操作



        上一頁 1 2 3 4 下一頁

        關鍵詞: MSP430片內flas

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 大荔县| 长垣县| 平潭县| 吐鲁番市| 辽阳市| 读书| 仁化县| 肇庆市| 贡嘎县| 同江市| 北流市| 台南市| 巴林右旗| 炎陵县| 资兴市| 上蔡县| 东兰县| 进贤县| 闸北区| 山西省| 高陵县| 石首市| 宽城| 龙州县| 满城县| 炎陵县| 三江| 溆浦县| 湾仔区| 沁阳市| 丁青县| 肥东县| 曲松县| 冀州市| 沂水县| 永善县| 新晃| 泽普县| 黑山县| 寿光市| 兴仁县|