<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          寫MSP430片內(nèi)flash

          作者: 時間:2016-11-25 來源:網(wǎng)絡(luò) 收藏

          本文引用地址:http://www.ex-cimer.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

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

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

          二、FLASH存儲器的操作
          由于FLASH存儲器由很多相對獨(dú)立的段組成,因此可在一個段中運(yùn)行程序,而對另一個段進(jìn)行擦除或?qū)懭氩僮?。正在?zhí)行編程或擦除等操作的FLASH段是不能被訪問的,因為這時該段是與片內(nèi)地址總線暫時斷開的。對FLASH模塊的操作可分為3類:擦除、寫入及讀出。而擦除又可分為單段擦除和整個模塊擦除;寫入可分為字寫入、字節(jié)寫入、字連續(xù)寫入和字節(jié)連續(xù)寫入
          1.FLASH擦除操作:對FLASH要寫入數(shù)據(jù),必須先擦除相應(yīng)的段,對FLASH存儲器的擦除必須是整段地進(jìn)行,可以一段一段地擦除,也可以多端一起擦除,但不能一個字節(jié)或一個字地擦除。擦除之后各位為1。擦除操作的順序如下:
          選擇適當(dāng)?shù)臅r鐘源和分頻因子,為時序發(fā)生器提供正確時鐘輸入
          如果Lock=1,則將它復(fù)位:
          BUSY標(biāo)志位,只有當(dāng)BUSY=0時才可以執(zhí)行下一步,否則不行
          如果擦除一段,則設(shè)置ERASE=1
          如果擦除多段,則設(shè)置MERAS=1
          如果擦除整個FLASH,則設(shè)置RASE=1,同時MERAS=1
          對擦除的地址范圍內(nèi)的任意位置作一次空寫入,用以啟動擦除操作。
          在擦除周期選擇的時鐘源始終有效
          在擦除周期不修改分頻因子
          在BUSY=1期間不再訪問所操作的段
          電源電壓應(yīng)符合芯片的相應(yīng)要求// 來自 :ST_M_8.C_N
          對FLASH擦除要做4件事
          對FLASH控制寄存器寫入適當(dāng)?shù)目刂莆?br />BUSY位
          空寫一次
          等待
          2.FLASH編程操作。對FLASH編程按如下順序進(jìn)行:
          選擇適當(dāng)?shù)臅r鐘源和分頻因子
          如果Lock=1,則將它復(fù)位
          BUSY標(biāo)志位,只有當(dāng)BUSY=0時才可以執(zhí)行下一步,否則不行
          如果寫入單字或單字節(jié),則將設(shè)置WRT=1
          如果是塊寫或多字、多字節(jié)順序?qū)懭?,則將設(shè)置WRT=1,BLKWRT=1
          將數(shù)據(jù)寫入選定地址時啟動時序發(fā)生器,在時序發(fā)生器的控制下完成整個過程
          塊寫入可用于在FLASH段中的一個連續(xù)的存儲區(qū)域?qū)懭胍幌盗袛?shù)據(jù)。一個塊為64字節(jié)長度。塊開始在0XX00H、0XX40H、0XX80H、0XXC0H等地址,塊結(jié)束在0XX3FH、0XX7FH、0XXBFH、0XXFFH等地址。塊操作在64字節(jié)分界處需要特殊的軟件支持,操作如下:
          等待WAIT位,直到WAIT=1,表明最后一個字或字節(jié)寫操作結(jié)束
          將控制位BLKWRT復(fù)位
          保持BUSY位為1,直到編程電壓撤離FLASH模塊
          在新塊被編程前,等待trcv(編程電壓恢復(fù)時間)時間
          在寫周期中,必須保證滿足以下條件:
          被選擇的時鐘源在寫過程中保持有效
          分頻因子不變
          在BUSY=1期間,不訪問FLASH存儲器模塊
          對FLASH寫入要做4件事
          對FLASH控制寄存器寫入適當(dāng)?shù)目刂莆?br />BUSY位
          寫一個數(shù)據(jù)
          繼續(xù)寫一直到寫完
          3.FLASH錯誤操作的處理:在寫入FLASH控制寄存器控制參數(shù)時,可引發(fā)以下錯誤:
          如果寫入高字節(jié)口令碼錯誤,則引發(fā)PUC信號。小心操作可避免
          在對FLASH操作期間讀FLASH內(nèi)容,會引發(fā)ACCVFIG狀態(tài)位的設(shè)置。小心操作可避免
          在對FLASH操作期間看門狗定時器溢出。建議用戶程序在進(jìn)行FLASH操作之前先停止看門狗定時器,等操作結(jié)束后再打開看門狗
          所有的FLASH類型的MSP430器件0段都包含有中斷向量等重要的程序代碼,如果對其進(jìn)行擦除操作,將會引起嚴(yán)重的后果
          不要在FLASH操作期間允許中斷的發(fā)生
          4.FLASH操作小結(jié)
          對FLASH的操作是通過對3個控制字中的相應(yīng)位來完成的,只有控制位的唯一組合才能實現(xiàn)相應(yīng)的功能。下表給出了正確的控制位組合:
          功能 BLKWRT WRT Meras Erase BUSY WAIT Lock
          字或字節(jié)寫入 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)的各位進(jìn)行定義。它們使用安全鍵值(口令碼)來防止錯誤的編程和擦除周期,口令出錯將產(chǎn)生非屏蔽中斷請求。安全鍵值位于每個控制字的高字節(jié),讀時為96H,寫時為5AH。
          1.FCTL1 控制寄存器1(用于控制所有寫/編程或者刪除操作的有效位),各位定義如下:
          bit15~8 bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0
          安全鍵值,讀為96H,寫5AH BLKWRT WRT -- -- -- MERAS ERASE --
          BLKWRT——段編程位。如果有較多的連續(xù)數(shù)據(jù)要編程到某一段或某幾段,則可選擇這種方式,這樣可縮短編程時間。在一段程序完畢,再編程其它段,需對該位先復(fù)位再置位,在下一條寫指令執(zhí)行前WAIT位應(yīng)為1。
          0:未選用段編程方式
          1:選用段編程方式
          WRT——編程位
          0:不編程,如對FLASH寫操作,發(fā)生非法訪問,使ACCVIFG位置位;
          1:編程
          MERAS——主存控制擦除位
          0:不擦除
          1:主存全擦除,對主存空寫時啟動擦除操作,完成后MERAS自動復(fù)位
          ERASE——擦除一段控制位
          0:不擦除
          1:擦除一段。由空寫指令帶入段號來指定擦除哪一段,操作完成后自動復(fù)位
          2.FCTL2 控制寄存器2(對進(jìn)入時序發(fā)生器的時鐘進(jìn)行定義),各位定義如下:
          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——分頻系數(shù)選擇位
          0:直通
          1:2分頻
          2:3分頻
          ...... read datasheet
          63:64分頻
          3.FCTL3 控制寄存器3(用于控制FLASH存儲器操作,保存相應(yīng)的狀態(tài)標(biāo)志和錯誤條件),各位定義如下:
          bit15~8 bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0
          安全鍵值,讀為96H,寫5AH -- -- EMEX Lock WAIT ACCVIFG KEYV BUSY
          EMEX——緊急退出位。對FLASH的操作失敗時使用該位作緊急處理
          0:無作用
          1:立即停止對FLASH的操作
          Lock——鎖定位,給已經(jīng)編程好的FLASH存儲器加鎖
          0:不加鎖,F(xiàn)LASH存儲器可讀、可寫、可擦除
          1:加鎖,加鎖的FLASH存儲器可讀、不可寫、不可擦除
          WAIT——等待指示信號,該位只讀。// 來自 :ST_M_8.C_N
          0:段編程操作已經(jīng)開始,編程操作進(jìn)行中
          1:段編程操作有效,當(dāng)前數(shù)據(jù)已經(jīng)正確地寫入FLASH存儲器,后續(xù)編程數(shù)據(jù)被列入計劃
          ACCVIFG——非法訪問中斷標(biāo)志。當(dāng)對FLASH陣列進(jìn)行編程或擦除操作時不能訪問FLASH,否則將使得該位置位
          0:沒有對FLASH存儲器的非法訪問
          1:有對FLASH存儲器的非法訪問
          KEYV——安全鍵值(口令碼)出錯標(biāo)志位
          0:對3個控制寄存器的訪問,寫入時高字節(jié)是0A5H
          1:對3個控制寄存器的訪問,寫入時高字節(jié)不是0A5H,同時引發(fā)PUC信號
          KEYV不會自動復(fù)位,須用軟件復(fù)位
          BUSY——忙標(biāo)志位。該位只讀。每次編程或擦除之前都應(yīng)該檢查BUSY位。當(dāng)編程或擦除啟動后,時序發(fā)生器將自動設(shè)置該位為1,操作完成后BUSY位自動復(fù)位
          0:FLASH存儲器不忙
          1:FLASH存儲器忙

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



          上一頁 1 2 3 4 下一頁

          關(guān)鍵詞: MSP430片內(nèi)flas

          評論


          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();