天天看點

【430片内FLASH】寫MSP430片内flash

官方文檔:​​http://pan.baidu.com/share/link?shareid=248887&uk=3523275049​​   第60頁

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

// 參數: adr 為位址 , 範圍 0x1000~0xFFFF

void  FlashRead(long adr,uint8 *bBuf,uint8 bLen)

{

   while (bLen--)

     *bBuf++=*(uint8 *)adr++;

   return;

}

// 寫入位址 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