MSP430 flash的操做

今天順便研究了一下msp430的flash操做,不少人也許看了個人博客,會發現網站上有不少的人總結得比我要好,這點我認可,由於本身能力有限,可是,從這篇博客起,我會參照之前大神們寫的博客,添加大神們寫過的博客連接,分享給你們,註明:本人從不抄襲他人博客,博客只是我的技術的一個總結~~~,下面進入今天的正題html

msp430F149有60k的flash,這個對於51來講,是至關的驚人的了,在涉及到flash的操做的時候,每每涉及到三個寄存器,FCTL1,FCTL2,FCTL3。忽然間發現msp430的寄存器都有CTL這個字樣,這對於記住不一樣的寄存器操做頗有必要,這裏咱們要明白各個寄存器的用途編程

 

FCTL1是控制如何進行操做,好比讀寫,複製,擦除安全

FCLT2是控制讀寫的時鐘頻率,由於flash的操做頻率必須是257K到476K之間ide

FCTL3用於控制FLASH存儲器操做,保存相應的狀態標誌和錯誤條件函數

 

關於Flash控制寄存器的介紹網站

這裏推薦一篇比較好的博客:http://www.cnblogs.com/sky1991/archive/2012/08/18/2645529.htmlui

也能夠參照這一篇博客:http://www.cnblogs.com/Engin/archive/2011/08/31/2160534.htmlspa

 

下面咱們來總結一下如何對flash進行編程操做:指針

這裏也總結下操做flash的三個寄存器的規律,全部的寄存器操做都是等於,全部的寄存器操做都要加上FWKEY,也就是密匙,瞭解這一點對編程這很重要code

 

步驟1:設置時鐘頻率

這個時候,是對FCTL2進行操做,FCTL2 = FWKEY+FSSEL0+FN0;

這裏解釋一下,FSSELx他有5種選擇格式,這裏能夠查看頭文件

#define FSSEL0              (0x0040)  /* Flash clock select 0 */        /* to distinguish from USART SSELx */
#define FSSEL1              (0x0080)  /* Flash clock select 1 */

#define FSSEL_0             (0x0000)  /* Flash clock select: 0 - ACLK */
#define FSSEL_1             (0x0040)  /* Flash clock select: 1 - MCLK */
#define FSSEL_2             (0x0080)  /* Flash clock select: 2 - SMCLK */
#define FSSEL_3             (0x00C0)  /* Flash clock select: 3 - SMCLK */

FNx是分頻比:這裏有5種分頻比:

#define FN0                 (0x0001)  /* Divide Flash clock by 1 to 64 using FN0 to FN5 according to: */
#define FN1                 (0x0002)  /*  32*FN5 + 16*FN4 + 8*FN3 + 4*FN2 + 2*FN1 + FN0 + 1 */
#ifndef FN2
#define FN2                 (0x0004)
#endif
#ifndef FN3
#define FN3                 (0x0008)
#endif
#ifndef FN4
#define FN4                 (0x0010)

 


步驟2:設置完分頻的基本操做以後,通常就不用在對FCTL2進行操做了,這個時候

通常是對FCTL1進行設置,須要明白的是,對flash的操做是以段位操做的,並且在對flash進行操做的時候,通常要採用指針,這個時候,就要進行強制轉化,例如設置一個flash的寫函數所用的指針爲 unsigned *Flash_ptr; Flash_ptr = (unsigned char *)0x1080

先對一個段進行擦除前,要進行一個假寫入,因此這個時候要配置FCTL3,FCTL1,由於flash只能是讀權限,要更改她的權限,要對flash的寫的標誌位進行置位

也就是

FCTL1 = FWKEY+ERASE;

FCTL3 = FWEKY;//#define FWKEY(0xA500)  /* Flash key for write */

這裏要注意一個ERASE這個宏定義;這裏是設置擦除的格式,查看頭文件會發現有幾種擦除格式

#define ERASE               (0x0002)  /* Enable bit for Flash segment erase */
#define MERAS               (0x0004)  /* Enable bit for Flash mass erase */

這個時候,假寫入一個數據,就會使得cpu掛起,flash進行擦除
 *Flash_ptr = 0;  //從flash中啓動一個擦除,這時候要假寫入,啓動擦除過程
 

 

步驟3:

啓動擦除以後,就能夠想flash中寫入數據了,寫入數據的格式:

 FCTL1 = FWKEY+WRT;//擦除的話,由於從flash中進行擦除,
                               //設定寫模式
 for(i=0;i<128;i++)
    {
        *Flash_ptr ++ = value;//寫入128個字節
    }

 

 

步驟4:作完上述操做,要對flash進行鎖保護,以防止誤寫
 FCTL1 = FWKEY;//清掉寫的操做位,防止寫完後誤操做
  FCTL3 = FWKEY +LOCK;//安全恢復保護

 

在實際編程的過程當中,用到flash高深的地步,還能夠將flash做爲一個內部的SD卡,用來存儲數據,這個功能算是比較高級的應用了,推薦幾篇博客介紹這種功能的使用

flash的擴展使用http://www.cnblogs.com/hrj2012/archive/2012/05/17/2506306.html

 

版權全部,轉載請註明連接地址:http://www.cnblogs.com/fengdashen/p/3408218.html

相關文章
相關標籤/搜索