新聞中心

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

        寫MSP430片內flash

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

        void FlashWW(unsigned int Adr,unsigned int DataW)

        {

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

        FCTL3 = FWKEY;

        FCTL1 = FWKEY + WRT;

        while(FCTL3 & BUSY);

        *((unsigned int *)Adr)=DataW;//數值強制轉換成指針,指向地址數據Adr所表示的內存單元

        //將數據字DataW賦值給內存單元

        FCTL1 = FWKEY;

        FCTL3 = FWKEY + LOCK;

        while(FCTL3 & BUSY);

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

        void FlashWrite(uchar *pc_byte,uchar *Datain,uint count)

        {

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

        FCTL3 = FWKEY;

        FCTL1 = FWKEY + WRT;

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


        while(count--)

        {

        while(FCTL3 & BUSY);

        *pc_byte++ = *Datain++;

        }


        FCTL1 = FWKEY;

        FCTL3 = FWKEY + LOCK;

        while(FCTL3 & BUSY);

        }

        注意:在對字寫入和字節寫入的時候,用于指向信息區數據指針類型的區別,字寫入時候為*((unsigned int *)Adr),字節寫入時候為*((unsigned char *)Adr)。

        4.3 讀取

        根據查看的書籍資料和網絡資料得出,內部Flash的讀取操作沒有順序的要求,一般Flash默認的操作方式即為讀模式。讀取Flash的程序代碼如下:

        void FlashRead(uchar *pc_byte,uchar *Dataout,uint count)

        {

        while(count--)

        {

        *Dataout = *pc_byte;

        Dataout++;

        pc_byte++;

        }

        }

        在網上查找資料的時候,好像看到過有位網友的博客說,內部Flash的地址是自動加1的,按照他的理解,函數中pc_byte++語句就沒有用處了,可是事實不然,我在調試過程中,發現并不能自動加1,pc_byte++語句還是有必要的。調用上述函數,可以通過這樣的方式FlashRead((uchar *)0x1000,a,4);即從0x1080地址處開始,連續讀取4個字節的數據,送給數組a。

        5 小結

        對Msp430 片內Flash的操作是通過對3個控制字中的相應位來完成的,只有控制位的正確組合,才能實現相應的功能。

        同時在編程中注意靈活使用數組和指針,以及指向數組的指針等,可以達到靈活編程的目的,不過本文中給出的幾個程序段,基本上能夠實現對Msp430 Flash的擦除、寫入等操作。這是我最近3天所作的一些努力,整理一下與大家分享。

        本文參考了TI的《MSP430x1xx Family Users Guide》及TI網上提供的關于Flash操作的實例代碼,并在網絡上收集了一些資料,在此不一一列出,不過本文應該算本人原創,轉載請注明。謝謝


        MSP430X14X Flash 讀寫操作總結

        開發平臺:IAR Embedded Workbench、MSP430F149開發板

        作者:譚貝貝

        Flash操作注意事項

        在讀寫的過程中電壓不能小于2.7V否則擦除和讀寫的結果將不可預測。Flash的可操作時鐘頻率為~257KHZ---~476KHZ。如果頻率不符合要求,則結果不可預測。

        在擦除先需要關閉中斷和看門狗,在擦除的過程中如果產生了中斷,則會在重新使能中斷后產生一個中斷請求。Flash只能從1寫為0,不能從從0寫為1,所以需要擦除。

        可以被擦除的最小模塊是片段,tAll Erase = tMass Erase = 5297/fFTG, tSeg Erase = 4819/fFTG。

        Flash ERASE

        MSP430X14X的擦除模式可以從Flash或者RAM中進行。

        從Flash中擦除

        從Flash中擦除的過程中所有的定時都會被Flash控制,CPU被掛起。擦除完成后需要一個假寫入CPU才能復位。從Flash擦除時有可能把后面CPU需要執行的代碼擦除。如果發生這樣的情況,在擦除后CPU的執行狀況將不可預測。

        Flash中擦除流程圖

        圖片地址:http://wenku.baidu.com/view/b82c0b1a52d380eb62946d4b.html

        從RAM中擦除

        從RAM中擦除時CPU不會被掛起,可以繼續執行代碼。必須檢測BUSY位以判斷擦除是否結束,如果在擦除的過程中(即BUSY=1時)訪問Flash,這是一個違規的訪問,ACCVIFG會置位,而擦除的結果也將不可預測。

        RAM中擦除流程圖

        圖片地址:http://wenku.baidu.com/view/b82c0b1a52d380eb62946d4b.html

        Flash Write

        MSP430X14X有兩種寫入模式,分為段寫入(byte/word write),和塊寫入(Block Write),塊寫入要快得多,但是操作麻煩,在擦除的過程中不能有一個Flash word(low + high byte),則會發生損壞。CPU不能在BUSY=1時訪問Flash,否則ACCFIG將置位寫入將不可預測。

        1.Byte/Word write

        Byte/Word 寫入可以從Flash或者RAM初始化,當從Flash中初始化時,所有的定時都會被Flash控制,CPU被掛起。寫完后CPU將繼續執行后面的代碼。

        當從RAM中初始化時,BUSY必須在CPU訪問Flash前置0.否則ACCFIG將被置位,寫入的結果將不可預測。

        在Byte/Word 寫模式下寫入總時間不能超過4ms,如果超過了,當再想這塊任何地址寫入數據時必須先擦除。

        Byte/Word 寫入流程圖

        從RAM中執行Byte/Word 寫入

        塊寫入

        塊寫入時沒一小塊不能超過t_cpt=4ms,塊寫入只能從RAM中進行,在塊寫入的過程中WAIT位要置0,當想Flash中寫入數據時,需要先檢查WAIT位是否為1.當前塊寫完后BLKWRT要清0.

        流程圖

        圖片地址:http://wenku.baidu.com/view/b82c0b1a52d380eb62946d4b.html

        在擦除或者寫入的過程中訪問Flash,見下表

        Flash的寄存器

        FCTL1,選擇擦除和寫入模式的寄存器

        FRKEY/FWKEY 高八位為密碼讀的密碼為96h,寫的密碼為A5h。

        BLKWRT 塊寫入模式選擇位,可以自動被EMEX置位

        WRT 字寫入模式選擇位,可任意自動被EMEX置位

        MERASE和ERASE,擦除模式選擇位

        FCTL2時鐘選擇寄存器

        FWKEYx密碼位

        FSSELx時鐘選擇位

        FNx分頻比 分頻值等于FN+1

        兩個例子

        #include

        #include "BoardConfig.h"

        void Write_A(uchar value);

        void Copy_A2B(void);

        void main( void )

        {

        // Stop watchdog timer to prevent time out reset

        WDTCTL = WDTPW + WDTHOLD;

        BoardConfig(0xb8);

        FCTL2 = FWKEY + FSSEL0 + FN0; //Select source

        uchar value = 0;

        for(;;)

        {

        Write_A(value++); //Write data to segment A

        Copy_A2B(); //Copy data from segment A to segment B

        _NOP();

        }

        }

        void Write_A(uchar value)

        {

        uchar i;

        uchar *Flash_ptr;

        Flash_ptr = (uchar *)0x1080;

        FCTL1 = FWKEY + ERASE; //Set ERASE mode

        FCTL3 = FWKEY; //Clear LOCK

        *Flash_ptr = 0; //Dummy write

        FCTL1 = FWKEY + WRT;

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

        {

        *Flash_ptr++ = value; //Write value

        }

        FCTL1 = FWKEY; //Clear WRT

        FCTL3 = FWKEY + LOCK; //Set LOCK

        }

        //Copy data from B to A

        void Copy_A2B(void)

        {

        uchar *Flash_ptrA;

        uchar *Flash_ptrB;

        uint i;

        Flash_ptrA = (uchar *)0X1080;

        Flash_ptrB = (uchar *)0x1000;

        FCTL1 = FWKEY + ERASE;

        FCTL3 = FWKEY;

        *Flash_ptrB = 0;

        FCTL1 = FWKEY + WRT;

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

        {

        *Flash_ptrB++ = *Flash_ptrA++;

        }

        FCTL1 = FWKEY;

        FCTL3 = FWKEY + LOCK;

        }



        關鍵詞: MSP430片內flas

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 来安县| 兖州市| 察雅县| 封丘县| 社会| 小金县| 苍南县| 临桂县| 隆子县| 河津市| 新田县| 古蔺县| 安化县| 景洪市| 布拖县| 岗巴县| 永登县| 西宁市| 伊吾县| 怀集县| 中牟县| 双峰县| 灌南县| 临潭县| 丹凤县| 普定县| 普兰店市| 临城县| 万州区| 张家港市| 吐鲁番市| 栾川县| 古浪县| 沂源县| 紫金县| 嘉义县| 高碑店市| 余姚市| 彭泽县| 六安市| 新建县|