今天順便研究了一下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