從430論壇看到Flash模擬epprom的問題。我之前沒有碰到過,存儲數(shù)據(jù)用epprom,也許我的水平太菜了,但無論如何,我想知道個深切。
網(wǎng)上關(guān)于430Flash模擬epprom的帖子很多,我找來了幾個
----------------------------------------------------
//******************************************************************************
// 參數(shù): adr 為地址 , 范圍 0x1000~0xFFFF
void FlashRead(long adr,uint8 *bBuf,uint8bLen)
{
while (bLen--)
*bBuf++=*(uint8 *)adr++;
return;
}
// 寫入地址 adr 寫入數(shù)據(jù):*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); //如果處于忙狀態(tài),則等待
while(count--)
{
while(FCTL3 & BUSY);
*(uchar*)adr++ = *Datain++;
}
FCTL1 = FWKEY;
FCTL3 = FWKEY + LOCK;
while(FCTL3 & BUSY);
}
EraseSectorFlash 過程

void EraseSectorFlash(unsigned intadr)
{
_DINT();
uchar *p0;
//FCTL2 = FWKEY + FSSEL_1 + FN3 + FN4;//選擇時鐘源,分頻
FCTL3 = FWKEY;//清除LOCK
while(FCTL3 & BUSY);//如果出于忙,則等待
FCTL1 = FWKEY + ERASE;//使能段操作 每段512字節(jié)
p0 = (unsigned char *)adr;//數(shù)值強(qiáng)制轉(zhuǎn)換成指針
*p0 =0; //向段內(nèi)任意地址寫0,即空寫入,啟動擦除操作
FCTL1 = FWKEY;
FCTL3 = FWKEY + LOCK;
while(FCTL3 & BUSY);
_EINT(); //開總中斷
}
查看空閑的FLASH 地址,避免擦除代碼所在的地址。每次擦除均是一段一段的擦除,每段512字節(jié)。
找不到datasheet,不知道段的起止地址的,可以打開memory,在內(nèi)存窗口,用代碼嘗試隨便寫入一個任意地址,看哪些地方被改寫成0xFF 就知道段的起止,如:
我們在0x15000寫入(EraseSectorFlash(0x15000);),那里原本有非0xFF數(shù)據(jù),好辨認(rèn)(是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 ,在內(nèi)存窗口,點下拉框選擇 SER可知,SFR地址為 0x0000-0fff
RAM地址為:0x1c00-5bff
FLASH地址:0x5c00-45bff
結(jié)合看下面的地址分配圖,即可知道各部分代碼和數(shù)據(jù)被分配到什么地方。
****************************************
* *
* SEGMENTS IN ADDRESSORDER *
* *
****************************************
SEGMENT SPACE STARTADDRESS ENDADDRESS SIZE TYPE ALIGN
======= ===== ============= =========== ==== ==== =====
DATA16_AN 0102 -0103 2 rel 0
0120 -0121 2
0140 -0141 2
0144 -0145 2
015C -015D 2
0168 -016F 8
020A -020B 2
0222 -0225 4
0228 -0229 2
0242 -0245 4
024A -024B 2
026A -026B 2
0282 -0285 4
028A -028B 2
02A2 -02A5 4
02A8 -02A9 2
0340 -0341 2
0350 -0351 2
0380 -0387 8
0392 -0397 6
03AE -03AF 2
03C0 -03C3 4
03D2 -03D3 2
0640 -0641 2
0646 -0648 3
064C -064C 1
064E -064E 1
065C -065D 2
DATA20_I 1C00 -1E26 227 rel 1
DATA20_Z 1E28 -28B7 A90 rel 1
CSTACK 5400 -5BFF 800 rel 1
//-------------------------------------以下為編譯到FLASH的代碼---------------------------
CSTART 5C00 -5C2F 30 rel 1
ISR_CODE 5C30 -5E63 234 rel 1
<CODE>1 5E64 -D123 72C0 rel 1
INTVEC FF80 -FFF9 7A com 1
RESET FFFE -FFFF 2 rel 1
DATA20_C 00010000 -00019486 9487 rel 1
DATA20_ID 00019488 -000196AE 227 rel 1
****************************************
* *
* END OF CROSSREFERENCE *
* *
****************************************
30 112 bytes of CODE memory
5 303 bytes of DATA memory (+81 absolute )
38 574 bytes of CONST memory
Errors: none
Warnings: none
官方資料:http://pan.baidu.com/share/link?shareid=249328&uk=3523275049
1 Msp430Flash型單片機(jī)內(nèi)部Flash存儲器介紹
MSP430的Flash存儲器是可位、字節(jié)、字尋址和編程的存儲器。該模塊由一個集成控制器來控制編程和擦除的操作。控制器包括三個寄存器,一個時序發(fā)生器及一個提供編程、擦除電壓的電壓發(fā)生器。
Msp430的Flash存儲器的特點有:
1) 產(chǎn)生內(nèi)部編程電壓
2) 可位、字節(jié)、字編程,可以單個操作,也可以連續(xù)多個操作
3) 超低功耗操作
4) 支持段擦除和多段模塊擦除
2 Flash存儲器的分割
Msp430Flash存儲器分成多個段。可對其進(jìn)行單個字節(jié)、字的寫入,也可以進(jìn)行連續(xù)多個字、字節(jié)的寫入操作,但是最小的擦除單位是段。
Flash存儲器被分割成兩部分:主存儲器和信息存儲器,兩者在操作上沒有什么區(qū)別。兩部分的區(qū)別在于段的大小和物理地址的不同。
以Msp430F149為例,信息存儲器有兩個128字節(jié)的段,即segmentA和segmentB,主存儲器有多個512字節(jié)的段。Msp430F149內(nèi)部Flash的地址為0x1000H~0xFFFFH,計60K。信息段SegA的起始地址為0x1080H,信息段SegB的起始地址為0x1000H。
3 Flash存儲器的操作
在默認(rèn)狀態(tài)下,處于讀操作模式。在讀操作模式中,F(xiàn)lash存儲器不能被擦除和寫入,時序發(fā)生器和電壓發(fā)生被關(guān)閉,存儲器操作指向ROM區(qū)。
Msp430 Flash存儲器在系統(tǒng)編程ISP(in-systemprogrammable)不需要額外的外部電壓。CPU能夠?qū)lash直接編程。Flash存儲器的寫入/擦除通過BLKWRT、WRT、MERAS、ERASE等位確定。
3.1 擦除
Flash存儲器各位的缺省值為1,每一位都可以單獨編程為0,但只有擦除操作才能將其恢復(fù)為1。擦除操作的最小單位是段。通過erase和meras位設(shè)置可選擇3種擦除模式。
MERAS |
ERASE |
擦除模式 |
0 |
1 |
段擦除 |
1 |
0 |
多段擦除(所有主存儲器的段) |
1 |
1 |
整體擦除(LOCKA=0時,擦除所有主存儲器和信息存儲器的段;主存儲器的段只有當(dāng)LOCKA=0時可以擦除) |
擦除操作開始于對擦除的地址范圍內(nèi)的任意位置執(zhí)行一次空寫入。空寫入的目的是啟動時序發(fā)生器和擦除操作。在空寫入操作之后,BUSY位自動置位,并保持到擦除周期結(jié)束。BUSY、MERAS、ERASE在擦除周期結(jié)束后自動復(fù)位。
3.2 寫入
寫入模式由WRT和BLKWRT位進(jìn)行設(shè)置。
BLKWRT(塊寫入模式選擇) |
WRT(寫模式選擇位) |
寫入模式 |
0 |
1 |
單字節(jié)、單字寫入 |
1 |
1 |
塊寫入 | 所有的寫入模式使用一系列特有的寫入命令,采用塊寫入的速度大約是單個寫入的2
倍,因為電壓發(fā)生器在塊寫入完成器件均能保持。對于這兩種寫入模式,任何能修改目的操作數(shù)的指令均能用于修改地址。一個Flash字不能再擦除器件進(jìn)行兩次以上的寫入。
當(dāng)啟動寫入操作時,BUSY置位,寫入結(jié)束時復(fù)位。
4 操作編程
4.1 Flash擦除
對Flash要寫入數(shù)據(jù),必須先擦除相應(yīng)的段,且對Flash存儲器的擦除必須是整段進(jìn)行的,可以一段一段擦,也可以多段一起擦除。擦除操作的順序如下:
1) 選擇適當(dāng)?shù)臅r鐘源和分頻因子;
2) 清除LOCK位
3) 判斷BUSY位,只有當(dāng)BUSY=0時才可以執(zhí)行下一步
4) 使能段操作,設(shè)置ERASE、MERAS位等(如果是擦除一段,則ERASE=1,如果擦除多段,則MERAS=1,如果擦除整個Flash,則ERASE=1,MERAS=1)
5) 對擦除的地址范圍內(nèi)的任意位置作一次空寫入,以啟動擦除操作
6) 在擦除周期內(nèi),時鐘源始終有效,不修改分頻因子
7) 操作完成后,置位LOCK
根據(jù)上述操作順序,編寫程序代碼如下:
void FlashErase(unsigned int adr)
{
uchar *p0;
(關(guān)閉中斷:_DINT();//關(guān)閉總中斷 本人注)
FCTL2 = FWKEY + FSSEL_1 + FN3 +FN4;//選擇時鐘源,分頻
FCTL3 = FWKEY;//清除LOCK
while(FCTL3 &BUSY);//如果出于忙,則等待
FCTL1 = FWKEY + ERASE;//使能段操作
p0 = (unsigned char *)adr;//數(shù)值強(qiáng)制轉(zhuǎn)換成指針
*p0 =0; //向段內(nèi)任意地址寫0,即空寫入,啟動擦除操作
FCTL1 = FWKEY;
FCTL3 = FWKEY + LOCK;
while(FCTL3 & BUSY);
(_EINT(); //開總中斷 本人注)
}
4.2 寫入
對Flash的寫入數(shù)據(jù)可以是單字、單字節(jié),也可以是連續(xù)多個字或字節(jié)(即塊操作)。編程寫入操作的順序如下:
1) 選擇適當(dāng)?shù)臅r鐘源和分頻因子;
2) 清除LOCK位
3) 判斷BUSY位,只有當(dāng)BUSY=0時才可以執(zhí)行下一步操作
4) 使能寫入功能,設(shè)置WRT、BLKWRT(如果寫入單字或單字節(jié)則WRT=1,如果是塊寫入,或者是多字、多字節(jié)連續(xù)寫入則WRT=1,BLKWRT=1);
5) 判斷BUSY位,只有當(dāng)BUSY=0時才可以執(zhí)行下一步操作
6) 寫入數(shù)據(jù)
7) 判忙,完了之后清除WRT,置位LOCK
根據(jù)上述操作順序,編寫程序代碼如下:
//write single byte
//Adr 為要編程的地址,沒有奇偶地址要求、DataB為要編程的字節(jié)數(shù)據(jù)
void FlashWB(unsigned char Adr,unsigned char DataB)
{
FCTL2 = FWKEY + FSSEL_1 + FN3 +FN4;//MCLK 16*FN4 + 8*FN3
FCTL3 = FWKEY;
FCTL1 = FWKEY + WRT;
while(FCTL3 & BUSY);
*((unsigned int*)Adr)=DataB;//數(shù)值強(qiáng)制轉(zhuǎn)換成指針,指向地址數(shù)據(jù)Adr所表示的內(nèi)存單元
(*((unsigned char*)Adr)?本人注) //將數(shù)據(jù)字DataW賦值給內(nèi)存單元
FCTL1 = FWKEY;
FCTL3 = FWKEY + LOCK;
while(FCTL3 &BUSY);
}
//write single word
//Adr 為要編程的地址,應(yīng)該是偶地址、DataW為要編程的字?jǐn)?shù)據(jù)
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;//數(shù)值強(qiáng)制轉(zhuǎn)換成指針,指向地址數(shù)據(jù)Adr所表示的內(nèi)存單元
//將數(shù)據(jù)字DataW賦值給內(nèi)存單元
FCTL1 = FWKEY;
FCTL3 = FWKEY + LOCK;
while(FCTL3 & BUSY);
}
// 寫入地址 *pc_byte 寫入數(shù)據(jù):*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); //如果處于忙狀態(tài),則等待
while(count--)
{
while(FCTL3 & BUSY);
*pc_byte++ = *Datain++;
}
FCTL1 = FWKEY;
FCTL3 = FWKEY + LOCK;
while(FCTL3 &BUSY);
}
注意:在對字寫入和字節(jié)寫入的時候,用于指向信息區(qū)數(shù)據(jù)指針類型的區(qū)別,字寫入時候為*((unsigned int*)Adr),字節(jié)寫入時候為*((unsigned char *)Adr)。
4.3 讀取
根據(jù)查看的書籍資料和網(wǎng)絡(luò)資料得出,內(nèi)部Flash的讀取操作沒有順序的要求,一般Flash默認(rèn)的操作方式即為讀模式。讀取Flash的程序代碼如下:
void FlashRead(uchar *pc_byte,uchar *Dataout,uint count)
{
while(count--)
{
*Dataout= *pc_byte;
Dataout++;
pc_byte++;
}
}
在網(wǎng)上查找資料的時候,好像看到過有位網(wǎng)友的博客說,內(nèi)部Flash的地址是自動加1的,按照他的理解,函數(shù)中pc_byte++語句就沒有用處了,可是事實不然,我在調(diào)試過程中,發(fā)現(xiàn)并不能自動加1,pc_byte++語句還是有必要的。調(diào)用上述函數(shù),可以通過這樣的方式FlashRead((uchar*)0x1000,a,4);即從0x1080地址處開始,連續(xù)讀取4個字節(jié)的數(shù)據(jù),送給數(shù)組a。
5 小結(jié)
對Msp430 片內(nèi)Flash的操作是通過對3個控制字中的相應(yīng)位來完成的,只有控制位的正確組合,才能實現(xiàn)相應(yīng)的功能。
同時在編程中注意靈活使用數(shù)組和指針,以及指向數(shù)組的指針等,可以達(dá)到靈活編程的目的,不過本文中給出的幾個程序段,基本上能夠?qū)崿F(xiàn)對Msp430Flash的擦除、寫入等操作。這是我最近3天所作的一些努力,整理一下與大家分享。
本文參考了TI的《MSP430x1xx Family UsersGuide》及TI網(wǎng)上提供的關(guān)于Flash操作的實例代碼,并在網(wǎng)絡(luò)上收集了一些資料,在此不一一列出,不過本文應(yīng)該算本人原創(chuàng),轉(zhuǎn)載請注明。謝謝
MSP430X14X Flash 讀寫操作總結(jié)開發(fā)平臺:IAR Embedded Workbench、MSP430F149開發(fā)板作者:譚貝貝Flash操作注意事項 在讀寫的過程中電壓不能小于2.7V否則擦除和讀寫的結(jié)果將不可預(yù)測。Flash的可操作時鐘頻率為~257KHZ---~476KHZ。如果頻率不符合要求,則結(jié)果不可預(yù)測。
在擦除先需要關(guān)閉中斷和看門狗,在擦除的過程中如果產(chǎn)生了中斷,則會在重新使能中斷后產(chǎn)生一個中斷請求。Flash只能從1寫為0,不能從從0寫為1,所以需要擦除。
可以被擦除的最小模塊是片段,tAll Erase = tMass Erase = 5297/fFTG, tSeg Erase =4819/fFTG。
Flash ERASEMSP430X14X的擦除模式可以從Flash或者RAM中進(jìn)行。
從Flash中擦除從Flash中擦除的過程中所有的定時都會被Flash控制,CPU被掛起。擦除完成后需要一個假寫入CPU才能復(fù)位。從Flash擦除時有可能把后面CPU需要執(zhí)行的代碼擦除。如果發(fā)生這樣的情況,在擦除后CPU的執(zhí)行狀況將不可預(yù)測。
Flash中擦除流程圖圖片地址:http://wenku.baidu.com/view/b82c0b1a52d380eb62946d4b.html從RAM中擦除從RAM中擦除時CPU不會被掛起,可以繼續(xù)執(zhí)行代碼。必須檢測BUSY位以判斷擦除是否結(jié)束,如果在擦除的過程中(即BUSY=1時)訪問Flash,這是一個違規(guī)的訪問,ACCVIFG會置位,而擦除的結(jié)果也將不可預(yù)測。
RAM中擦除流程圖圖片地址:http://wenku.baidu.com/view/b82c0b1a52d380eb62946d4b.htmlFlash WriteMSP430X14X有兩種寫入模式,分為段寫入(byte/word write),和塊寫入(BlockWrite),塊寫入要快得多,但是操作麻煩,在擦除的過程中不能有一個Flash word(low + highbyte),則會發(fā)生損壞。CPU不能在BUSY=1時訪問Flash,否則ACCFIG將置位寫入將不可預(yù)測。
1.Byte/Word writeByte/Word寫入可以從Flash或者RAM初始化,當(dāng)從Flash中初始化時,所有的定時都會被Flash控制,CPU被掛起。寫完后CPU將繼續(xù)執(zhí)行后面的代碼。
當(dāng)從RAM中初始化時,BUSY必須在CPU訪問Flash前置0.否則ACCFIG將被置位,寫入的結(jié)果將不可預(yù)測。
在Byte/Word 寫模式下寫入總時間不能超過4ms,如果超過了,當(dāng)再想這塊任何地址寫入數(shù)據(jù)時必須先擦除。
Byte/Word 寫入流程圖
從RAM中執(zhí)行Byte/Word 寫入塊寫入塊寫入時沒一小塊不能超過t_cpt=4ms,塊寫入只能從RAM中進(jìn)行,在塊寫入的過程中WAIT位要置0,當(dāng)想Flash中寫入數(shù)據(jù)時,需要先檢查WAIT位是否為1.當(dāng)前塊寫完后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 <msp430x14x.h>
#include "BoardConfig.h"
void Write_A(uchar value);
void Copy_A2B(void);
void main( void )
{
// Stop watchdog timer to prevent time outreset
WDTCTL = WDTPW + WDTHOLD;
BoardConfig(0xb8);
FCTL2 = FWKEY + FSSEL0 + FN0; //Selectsource
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
voidCopy_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;
}
再來個塊寫入的(TI例程)//****************************************************************************
// MSP430F14x Demo - Flash In-SystemProgramming, BlockWrite
//
// Description: This program first copies theFlashWrite routine to RAM, then
// erases flash seg A, then it increments allvalues 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 toavoid Stressing Flash **
//
// MSP430F149
// -----------------
// /|\| XIN|-
// || |
// --|RST XOUT|-
// | |
//
// H. Grewal / L. Westlund
// Texas Instruments Inc.
// Jun 2006
// Built with IAR Embedded Workbench Version:3.30A
//******************************************************************************
#include <msp430x16x.h>
// 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 inti; // 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
}
voidEnd_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存儲器由很多相對獨立的段組成,因此可在一個段中運行程序,而對另一個段進(jìn)行擦除或?qū)懭氩僮鳌U趫?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ū)懭耄瑒t將設(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的非法操作
------------------------------------------------------------------------------------------
我從文庫里也看到Flash與epprom的區(qū)別,但沒有找到文庫,只好在網(wǎng)上找了篇博客
--------------------------------------------------------------
掉電需保護(hù)且在程序運行過程中需要修改的想少量參數(shù)保存在EEPROM中,其擦除次數(shù)較Flash多,F(xiàn)lash用來做程序和一些掉電保護(hù)和不需要修改的數(shù)據(jù)。 Flash memory指的是“閃存”,所謂“閃存”,它也是一種非易失性的內(nèi)存,屬于EEPROM的改進(jìn)產(chǎn)品,它的最大特點是必須按塊(Block)擦除(每個區(qū)塊的大小不定,不同廠家的產(chǎn)品有不同的規(guī)格),而EEPROM則可以一次只擦除一個字節(jié)(Byte),目前“閃存”被廣泛用在PC機(jī)的主板上,用來保存BIOS程序,便于進(jìn)行程序的升級。其另外一大應(yīng)用領(lǐng)域是用來作為硬盤的替代品,具有抗震、速度快、無噪聲、耗電低的優(yōu)點,但是將其用來取代RAM就顯的不合適,因為RAM需要能夠按字節(jié)改寫,而Flash ROM做不到。 FLASH的全稱是FLASH EEPROM,但跟常規(guī)EEPROM的操作方法不同。FLASH和EEPROM的最大區(qū)別是FLASH按扇區(qū)操作,EEPROM則按字節(jié)操作,二者尋址方法不同,存儲單元的結(jié)構(gòu)也不同,F(xiàn)LASH的電路結(jié)構(gòu)較簡單,同樣容量占芯片面積較小,成本自然比EEPROM低,因而適合用作程序存儲器,EEPROM麻煩的多,所以更“人性化”的MCU設(shè)計會集成FLASH和EEPROM兩種非易失性存儲器,而廉價型設(shè)計往往只有FLASH,EEPROM在運行中可以被修改,而FLASH在運行時不能修改,EEPROM可以存儲一些修改的參數(shù),F(xiàn)lash中存儲程序代碼和不需要修改的數(shù)據(jù),所謂的Flash是用來形容整個存儲單元的內(nèi)容可以一次性擦除。所以,理論上凡是具備這樣特征的存儲器都可以稱為Flash memory。EEPROM里面也分FF-EEPROM和FLASH EEPROM的,現(xiàn)在大家所講的Flash memory實際上分為兩大類,一類是Floating Gate Debice,一類是Charge Trapping Debice,這里的分類標(biāo)準(zhǔn)主要是program與crase的機(jī)制不同。 一:FLASH和EEPROM的區(qū)別 1:相同點是兩者都能掉電存儲數(shù)據(jù) 2:不同點是: A:FALSH寫入時間長,EEPROM寫入時間短。 B:FLASH擦寫次數(shù)少(10000次),EEPROM次數(shù)多(1000000次) 二:單片機(jī)的數(shù)據(jù)存儲器不能用FLASH,因為: 1:FLASH有一定的擦除,寫入次數(shù),一般的單片機(jī)的FLASH擦除寫入次數(shù)的標(biāo)稱值是10000次。 2:FLASH寫入數(shù)據(jù)需要比較長的時間,大約需要4-6ms,而且寫FLASH需要加上9V的高壓,麻煩。 三:至于EEPROM,可以作為數(shù)據(jù)存儲器,但是單片機(jī)如atmegal28,一般用RAM作為數(shù)據(jù)存儲器,因為EEPROM工藝復(fù)雜,成本高,適合于存儲掉電保護(hù)的數(shù)據(jù),而這類數(shù)據(jù)往往不需要太多,所以一般的單片機(jī)都沒在內(nèi)部集成EEPROM,需要的時候可以讓單片機(jī)外掛24C01一類的串行EEPROM。 區(qū)別: 1、 FLASH按扇區(qū)操作,EEPROM則按字節(jié)操作 2、 FLASH寫入時間長,EEPROM寫入時間短 3、 FLASH擦寫次數(shù)少(10000次),EEPROM次數(shù)多(1000000次) 4、 FLASH的電路結(jié)構(gòu)簡單,成本低,EEPROM工藝復(fù)雜,成本高
EEPROM
百科名片
EEPROM (Electrically Erasable Programmable Read-Only Memory),電可擦可編程只讀存儲器--一種掉電后數(shù)據(jù)不丟失的存儲芯片。 EEPROM 可以在電腦上或?qū)S迷O(shè)備上擦除已有信息,重新編程。一般用在即插即用。
目錄
發(fā)展 背景知識 基本原理
編輯本段發(fā)展
EEPROM(電可擦寫可編程只讀存儲器)是可用戶更改的只讀存儲器(ROM),其可通過高于普通
EEPROM 電壓的作用來擦除和重編程(重寫)。不像EPROM芯片,EEPROM不需從計算機(jī)中取出即可修改。在一個EEPROM中,當(dāng)計算機(jī)在使用的時候是可頻繁地重編程的,EEPROM的壽命是一個很重要的設(shè)計考慮參數(shù)。EEPROM的一種特殊形式是閃存,其應(yīng)用通常是個人電腦中的電壓來擦寫和重編程。 EEPROM,一般用于即插即用(Plug & Play)。 常用在接口卡中,用來存放硬件設(shè)置數(shù)據(jù)。 也常用在防止軟件非法拷貝的"硬件鎖"上面。
編輯本段背景知識
在微機(jī)的發(fā)展初期,BIOS都存放在ROM(Read Only Memory,只讀存儲器)中。ROM內(nèi)部的資料是在ROM的制造工序中,在工廠里用特殊的方法被燒錄進(jìn)去的,其中的內(nèi)容只能讀不能改,一旦燒錄進(jìn)去,用戶只能驗證寫入的資料是否正確,不能再作任何修改。如果發(fā)現(xiàn)資料有任何錯誤,則只有舍棄不用,
EEPROM 重新訂做一份。ROM是在生產(chǎn)線上生產(chǎn)的,由于成本高,一般只用在大批量應(yīng)用的場合。 由于ROM制造和升級的不便,后來人們發(fā)明了PROM(Programmable ROM,可編程ROM)。最初從工廠中制作完成的PROM內(nèi)部并沒有資料,用戶可以用專用的編程器將自己的資料寫入,但是這種機(jī)會只有一次,一旦寫入后也無法修改,若是出了錯誤,已寫入的芯片只能報廢。PROM的特性和ROM相同,但是其成本比ROM高,而且寫入資料的速度比ROM的量產(chǎn)速度要慢,一般只適用于少量需求的場合或是ROM量產(chǎn)前的驗證。 EPROM(Erasable Programmable ROM,可擦除可編程ROM)芯片可重復(fù)擦除和寫入,解決了PROM芯片只能寫入一次的弊端。EPROM芯片有一個很明顯的特征,在其正面的陶瓷封裝上,開有一個玻璃窗口,透過該窗口,可以看到其內(nèi)部的集成電路,紫外線透過該孔照射內(nèi)部芯片就可以擦除其內(nèi)的數(shù)據(jù),完成芯片擦除的操作要用到EPROM擦除器。EPROM內(nèi)資料的寫入要用專用的編程器,并且往芯片中寫內(nèi)容時必須要加一定的編程電壓(VPP=12—24V,隨不同的芯片型號而定)。EPROM的型號是以27開頭的,如27C020(8*256K)是一片2M Bits容量的EPROM芯片。EPROM芯片在寫入資料后,還要以不透光的貼紙或膠布把窗口封住,以免受到周圍的紫外線照射而使資料受損。
編輯本段基本原理
由EPROM操作的不便,后來出的主板上BIOS ROM芯片大部分都采用EEPROM(Electrically Erasable Programmable ROM,電可擦除可編程ROM)。EEPROM的擦除不需要借助于其它設(shè)備,它是以電子信號來修改其內(nèi)容的,而且是以Byte為最小修改單位,不必將資料全部洗掉才能寫入,徹底擺脫了EPROM Eraser和編程器的束縛。EEPROM在寫入數(shù)據(jù)時,仍要利用一定的編程電壓,此時,只需用廠商提供的專用刷新程序就可以輕而易舉地改寫內(nèi)容,所以,它屬于雙電壓芯片。借助于EEPROM芯片的雙電壓特性,可以使BIOS具有良好的防毒功能,在升級時,把跳線開關(guān)打至“ON”的位置,即給芯片加上相應(yīng)的編程電壓,就可以方便地升級;平時使用時,則把跳線開關(guān)打至“OFF”的位置,防止CIH類的病毒對BIOS芯片的非法修改。所以,至今仍有不少主板采用EEPROM作為BIOS芯片并作為自己主板的一大特色。
EEPROM和flash的區(qū)別
之前對各種存儲器一直不太清楚,今天總結(jié)一下。 存儲器分為兩大類:ram和rom。 ram就不講了,今天主要討論rom。 rom最初不能編程,出廠什么內(nèi)容就永遠(yuǎn)什么內(nèi)容,不靈活。后來出現(xiàn)了prom,可以自己寫入一次,要是寫錯了,只能換一片,自認(rèn)倒霉。人類文明不斷進(jìn)步,終于出現(xiàn)了可多次擦除寫入的EPROM,每次擦除要把芯片拿到紫外線上照一下,想一下你往單片機(jī)上下了一個程序之后發(fā)現(xiàn)有個地方需要加一句話,為此你要把單片機(jī)放紫外燈下照半小時,然后才能再下一次,這么折騰一天也改不了幾次。歷史的車輪不斷前進(jìn),偉大的EEPROM出現(xiàn)了,拯救了一大批程序員,終于可以隨意的修改rom中的內(nèi)容了。 EEPROM的全稱是“電可擦除可編程只讀存儲器”,即Electrically Erasable Programmable Read-Only Memory。是相對于紫外擦除的rom來講的。但是今天已經(jīng)存在多種EEPROM的變種,變成了一類存儲器的統(tǒng)稱。 狹義的EEPROM: 這種rom的特點是可以隨機(jī)訪問和修改任何一個字節(jié),可以往每個bit中寫入0或者1。這是最傳統(tǒng)的一種EEPROM,掉電后數(shù)據(jù)不丟失,可以保存100年,可以擦寫100w次。具有較高的可靠性,但是電路復(fù)雜/成本也高。因此目前的EEPROM都是幾十千字節(jié)到幾百千字節(jié)的,絕少有超過512K的。 flash: flash屬于廣義的EEPROM,因為它也是電擦除的rom。但是為了區(qū)別于一般的按字節(jié)為單位的擦寫的EEPROM,我們都叫它flash。 flash做的改進(jìn)就是擦除時不再以字節(jié)為單位,而是以塊為單位,一次簡化了電路,數(shù)據(jù)密度更高,降低了成本。上M的rom一般都是flash。 flash分為nor flash和nand flash。nor flash數(shù)據(jù)線和地址線分開,可以實現(xiàn)ram一樣的隨機(jī)尋址功能,可以讀取任何一個字節(jié)。但是擦除仍要按塊來擦。 nand flash同樣是按塊擦除,但是數(shù)據(jù)線和地址線復(fù)用,不能利用地址線隨機(jī)尋址。讀取只能按頁來讀取。(nandflash按塊來擦除,按頁來讀,norflash沒有頁) 由于nandflash引腳上復(fù)用,因此讀取速度比nor flash慢一點,但是擦除和寫入速度比nor flash快很多。nand flash內(nèi)部電路更簡單,因此數(shù)據(jù)密度大,體積小,成本也低。因此大容量的flash都是nand型的。小容量的2~12M的flash多是nor型的。 使用壽命上,nand flash的擦除次數(shù)是nor的數(shù)倍。而且nand flash可以標(biāo)記壞塊,從而使軟件跳過壞塊。nor flash 一旦損壞便無法再用。 因為nor flash可以進(jìn)行字節(jié)尋址,所以程序可以在nor flash中運行。嵌入式系統(tǒng)多用一個小容量的nor flash存儲引導(dǎo)代碼,用一個大容量的nand flash存放文件系統(tǒng)和內(nèi)核。
PROM、ROM、EPROM、EEPROM、Flash ROM的區(qū)別 ROM 指的是“只讀存儲器”,即Read-Only Memory。這是一種線路最簡單半導(dǎo)體電路,通過掩模工藝, 一次性制造,其中的代碼與數(shù)據(jù)將永久保存(除非壞掉),不能進(jìn)行修改。這玩意一般在大批量生產(chǎn)時才會被用的,優(yōu)點是成本低、非常低,但是其風(fēng)險比較大,在 產(chǎn)品設(shè)計時,如果調(diào)試不徹底,很容易造成幾千片的費片,行內(nèi)話叫“掩砸了”!
PROM 指的是“可編程只讀存儲器”既Programmable Red-Only Memory。這樣的產(chǎn)品只允許寫入一次,所以也被稱為“一次可編程只讀存儲器”(One Time Progarmming ROM,OTP-ROM)。PROM在出廠時,存儲的內(nèi)容全為1,用戶可以根據(jù)需要將其中的某些單元寫入數(shù)據(jù)0(部分的PROM在出廠時數(shù)據(jù)全為0,則用 戶可以將其中的部分單元寫入1), 以實現(xiàn)對其“編程”的目的。PROM的典型產(chǎn)品是“雙極性熔絲結(jié)構(gòu)”,如果我們想改寫某些單元,則可以給這些單元通以足夠大的電流,并維持一定的時間,原 先的熔絲即可熔斷,這樣就達(dá)到了改寫某些位的效果。另外一類經(jīng)典的PROM為使用“肖特基二極管”的PROM,出廠時,其中的二極管處于反向截止?fàn)顟B(tài),還 是用大電流的方法將反相電壓加在“肖特基二極管”,造成其永久性擊穿即可。
EPROM 指的是“可擦寫可編程只讀存儲器”,即Erasable Programmable Read-Only Memory。 它的特點是具有可擦除功能,擦除后即可進(jìn)行再編程,但是缺點是擦除需要使用紫外線照射一定的時間。這一類芯片特別容易識別,其封裝中包含有“石英玻璃窗 ”,一個編程后的EPROM芯片的“石英玻璃窗”一般使用黑色不干膠紙蓋住, 以防止遭到 陽光直射。
EEPROM 指的是“電可擦除可編程只讀存儲器”,即Electrically Erasable Programmable Read-Only Memory。它的最大優(yōu)點是可直接用電信號擦除,也可用電信號寫入。EEPROM不能取代RAM的原應(yīng)是其工藝復(fù)雜, 耗費的門電路過多,且重編程時間比較長,同時其有效重編程次數(shù)也比較低。
Flash memory 指的是“閃存”,所謂“閃存”,它也是一種非易失性的內(nèi)存,屬于EEPROM的改進(jìn)產(chǎn)品。它的最大特點是必須按塊(Block)擦除(每個區(qū)塊的大小不 定,不同廠家的產(chǎn)品有不同的規(guī)格), 而EEPROM則可以一次只擦除一個字節(jié)(Byte)。目前“閃存”被廣泛用在PC機(jī)的主板上,用來保存BIOS程序,便于進(jìn)行程序的升級。其另外一大應(yīng) 用領(lǐng)域是用來作為硬盤的替代品,具有抗震、速度快、無噪聲、耗電低的優(yōu)點,但是將其用來取代RAM就顯得不合適,因為RAM需要能夠按字節(jié)改寫,而 Flash ROM做不到。
Flash存儲器
百科名片
FLASH閃存 閃存的英文名稱是"Flash Memory",一般簡稱為"Flash",它屬于內(nèi)存器件的一種。 不過閃存的物理特性與常見的內(nèi)存有根本性的差異: 目前各類 DDR 、 SDRAM 或者 RDRAM 都屬于揮發(fā)性內(nèi)存,只要停止電流供應(yīng)內(nèi)存中的數(shù)據(jù)便無法保持,因此每次電腦開機(jī)都需要把數(shù)據(jù)重新載入內(nèi)存;
目錄
flash memory的簡要介紹? flash memory的工作原理
展開
編輯本段flash memory的簡要介紹?
閃存則是一種不揮發(fā)性( Non-Volatile )內(nèi)存,在沒有電流供應(yīng)的條件下也能夠長久地保持?jǐn)?shù)據(jù),其存儲特性相當(dāng)于硬盤,這項特性正是閃存得以成為各類便攜型數(shù)字設(shè)備的存儲介質(zhì)的基礎(chǔ)。 NAND 閃存的存儲單元則采用串行結(jié)構(gòu),存儲單元的讀寫是以頁和塊為單位來進(jìn)行(一頁包含若干字節(jié),若干頁則組成儲存塊, NAND 的存儲塊大小為 8 到 32KB ),這種結(jié)構(gòu)最大的優(yōu)點在于容量可以做得很大,超過 512MB 容量的 NAND 產(chǎn)品相當(dāng)普遍, NAND 閃存的成本較低,有利于大規(guī)模普及。 NAND 閃存的缺點在于讀速度較慢,它的 I/O 端口只有 8 個,比 NOR 要少多了。這區(qū)區(qū) 8 個 I/O 端口只能以信號輪流傳送的方式完成數(shù)據(jù)的傳送,速度要比 NOR 閃存的并行傳輸模式慢得多。再加上 NAND 閃存的邏輯為電子盤模塊結(jié)構(gòu),內(nèi)部不存在專門的存儲控制器,一旦出現(xiàn)數(shù)據(jù)壞塊將無法修,可靠性較 NOR 閃存要差。 NAND 閃存被廣泛用于移動存儲、數(shù)碼相機(jī)、 MP3 播放器、掌上電腦等新興數(shù)字設(shè)備中。由于受到數(shù)碼設(shè)備強(qiáng)勁發(fā)展的帶動, NAND 閃存一直呈現(xiàn)指數(shù)級的超高速增長. NOR和NAND是現(xiàn)在市場上兩種主要的非易失閃存技術(shù)。Intel于1988年首先開發(fā)出NOR flash技術(shù),徹底改變了原先由EPROM和EEPROM一統(tǒng)天下的局面。緊接著,1989年,東芝公司發(fā)表了NAND flash結(jié)構(gòu),強(qiáng)調(diào)降低每比特的成本,更高的性能,并且象磁盤一樣可以通過接口輕松升級。但是經(jīng)過了十多年之后,仍然有相當(dāng)多的硬件工程師分不清NOR和NAND閃存。 相“flash存儲器”經(jīng)常可以與相“NOR存儲器”互換使用。許多業(yè)內(nèi)人士也搞不清楚NAND閃存技術(shù)相對于NOR技術(shù)的優(yōu)越之處,因為大多數(shù)情況下閃存只是用來存儲少量的代碼,這時NOR閃存更適合一些。而NAND則是高數(shù)據(jù)存儲密度的理想解決方案。 NOR的特點是芯片內(nèi)執(zhí)行(XIP, eXecute In Place),這樣應(yīng)用程序可以直接在flash閃存內(nèi)運行,不必再把代碼讀到系統(tǒng)RAM中。NOR的傳輸效率很高,在1~4MB的小容量時具有很高的成本效益,但是很低的寫入和擦除速度大大影響了它的性能。 NAND結(jié)構(gòu)能提供極高的單元密度,可以達(dá)到高存儲密度,并且寫入和擦除的速度也很快。應(yīng)用NAND的困難在于flash的管理和需要特殊的系統(tǒng)接口。
性能比較
flash閃存是非易失存儲器,可以對稱為塊的存儲器單元塊進(jìn)行擦寫和再編程。任何flash器件的寫入操作只能在空或已擦除的單元內(nèi)進(jìn)行,所以大多數(shù)情況下,在進(jìn)行寫入操作之前必須先執(zhí)行擦除。NAND器件執(zhí)行擦除操作是十分簡單的,而NOR則要求在進(jìn)行擦除前先要將目標(biāo)塊內(nèi)所有的位都寫為0。 由于擦除NOR器件時是以64~128KB的塊進(jìn)行的,執(zhí)行一個寫入/擦除操作的時間為5s,與此相反,擦除NAND器件是以8~32KB的塊進(jìn)行的,執(zhí)行相同的操作最多只需要4ms。 執(zhí)行擦除時塊尺寸的不同進(jìn)一步拉大了NOR和NADN之間的性能差距,統(tǒng)計表明,對于給定的一套寫入操作(尤其是更新小文件時),更多的擦除操作必須在基于NOR的單元中進(jìn)行。這樣,當(dāng)選擇存儲解決方案時,設(shè)計師必須權(quán)衡以下的各項因素。 ● NOR的讀速度比NAND稍快一些。 ● NAND的寫入速度比NOR快很多。 ● NAND的4ms擦除速度遠(yuǎn)比NOR的5s快。 ● 大多數(shù)寫入操作需要先進(jìn)行擦除操作。 ● NAND的擦除單元更小,相應(yīng)的擦除電路更少。
接口差別
NOR flash帶有SRAM接口,有足夠的地址引腳來尋址,可以很容易地存取其內(nèi)部的每一個字節(jié)。 NAND器件使用復(fù)雜的I/O口來串行地存取數(shù)據(jù),各個產(chǎn)品或廠商的方法可能各不相同。8個引腳用來傳送控制、地址和數(shù)據(jù)信息。 NAND讀和寫操作采用512字節(jié)的塊,這一點有點像硬盤管理此類操作,很自然地,基于NAND的存儲器就可以取代硬盤或其他塊設(shè)備。
容量和成本
NAND flash的單元尺寸幾乎是NOR器件的一半,由于生產(chǎn)過程更為簡單,NAND結(jié)構(gòu)可以在給定的模具尺寸內(nèi)提供更高的容量,也就相應(yīng)地降低了價格。 NOR flash占據(jù)了容量為1~16MB閃存市場的大部分,而NAND flash只是用在8~128MB的產(chǎn)品當(dāng)中,這也說明NOR主要應(yīng)用在代碼存儲介質(zhì)中,NAND適合于數(shù)據(jù)存儲,NAND在CompactFlash、Secure Digital、PC Cards和MMC存儲卡市場上所占份額最大。
可靠性和耐用性
采用flahs介質(zhì)時一個需要重點考慮的問題是可靠性。對于需要擴(kuò)展MTBF的系統(tǒng)來說,Flash是非常合適的存儲方案。可以從壽命(耐用性)、位交換和壞塊處理三個方面來比較NOR和NAND的可靠性。
壽命(耐用性)
在NAND閃存中每個塊的最大擦寫次數(shù)是一百萬次,而NOR的擦寫次數(shù)是十萬次。NAND存儲器除了具有10比1的塊擦除周期優(yōu)勢,典型的NAND塊尺寸要比NOR器件小8倍,每個NAND存儲器塊在給定的時間內(nèi)的刪除次數(shù)要少一些。
位交換
所有flash器件都受位交換現(xiàn)象的困擾。在某些情況下(很少見,NAND發(fā)生的次數(shù)要比NOR多),一個比特位會發(fā)生反轉(zhuǎn)或被報告反轉(zhuǎn)了。 一位的變化可能不很明顯,但是如果發(fā)生在一個關(guān)鍵文件上,這個小小的故障可能導(dǎo)致系統(tǒng)停機(jī)。如果只是報告有問題,多讀幾次就可能解決了。 當(dāng)然,如果這個位真的改變了,就必須采用錯誤探測/錯誤更正(EDC/ECC)算法。位反轉(zhuǎn)的問題更多見于NAND閃存,NAND的供應(yīng)商建議使用NAND閃存的時候,同時使用EDC/ECC算法。 這個問題對于用NAND存儲多媒體信息時倒不是致命的。當(dāng)然,如果用本地存儲設(shè)備來存儲操作系統(tǒng)、配置文件或其他敏感信息時,必須使用EDC/ECC系統(tǒng)以確保可靠性。
壞塊處理
NAND器件中的壞塊是隨機(jī)分布的。以前也曾有過消除壞塊的努力,但發(fā)現(xiàn)成品率太低,代價太高,根本不劃算。 NAND器件需要對介質(zhì)進(jìn)行初始化掃描以發(fā)現(xiàn)壞塊,并將壞塊標(biāo)記為不可用。在已制成的器件中,如果通過可靠的方法不能進(jìn)行這項處理,將導(dǎo)致高故障率。
易于使用
可以非常直接地使用基于NOR的閃存,可以像其他存儲器那樣連接,并可以在上面直接運行代碼。 由于需要I/O接口,NAND要復(fù)雜得多。各種NAND器件的存取方法因廠家而異。 在使用NAND器件時,必須先寫入驅(qū)動程序,才能繼續(xù)執(zhí)行其他操作。向NAND器件寫入信息需要相當(dāng)?shù)募记?因為設(shè)計師絕不能向壞塊寫入,這就意味著在NAND器件上自始至終都必須進(jìn)行虛擬映射。
軟件支持?
當(dāng)討論軟件支持的時候,應(yīng)該區(qū)別基本的讀/寫/擦操作和高一級的用于磁盤仿真和閃存管理算法的軟件,包括性能優(yōu)化。 在NOR器件上運行代碼不需要任何的軟件支持,在NAND器件上進(jìn)行同樣操作時,通常需要驅(qū)動程序,也就是內(nèi)存技術(shù)驅(qū)動程序(MTD),NAND和NOR器件在進(jìn)行寫入和擦除操作時都需要MTD。 使用NOR器件時所需要的MTD要相對少一些,許多廠商都提供用于NOR器件的更高級軟件,這其中包括M-System的TrueFFS驅(qū)動,該驅(qū)動被Wind River System、Microsoft、QNX Software System、Symbian和Intel等廠商所采用。
編輯本段flash memory的工作原理
[原理]
經(jīng)典物理學(xué)認(rèn)為,物體越過勢壘,有一閾值能量;粒子能量小于此能量則不能越過,大于此能量則可以越過。例如騎自行車過小坡,先用力騎,如果坡很低,不蹬自行車也能靠慣性過去。如果坡很高,不蹬自行車,車到一半就停住,然后退回去。 量子力學(xué)則認(rèn)為,即使粒子能量小于閾值能量,很多粒子沖向勢壘,一部分粒子反彈,還會有一些粒子能過去,好象有一個隧道,稱作“量子隧道(quantum tunneling)”。 可見,宏觀上的確定性在微觀上往往就具有不確定性。雖然在通常的情況下,隧道效應(yīng)并不影響經(jīng)典的宏觀效應(yīng),因為隧穿幾率極小,但在某些特丁的條件下宏觀的隧道效應(yīng)也會出現(xiàn)。
[發(fā)現(xiàn)者]
1957年,受雇于索尼公司的江崎玲於奈(Leo Esaki,1940~)在改良高頻晶體管2T7的過程中發(fā)現(xiàn),當(dāng)增加PN結(jié)兩端的電壓時電流反而減少,江崎玲於奈將這種反常的負(fù)電阻現(xiàn)象解釋為隧道效應(yīng)。此后,江崎利用這一效應(yīng)制成了隧道二極管(也稱江崎二極管)。 1960年,美裔挪威籍科學(xué)家加埃沃(Ivan Giaever,1929~)通過實驗證明了在超導(dǎo)體隧道結(jié)中存在單電子隧道效應(yīng)。在此之前的1956年出現(xiàn)的“庫珀對”及BCS理論被公認(rèn)為是對超導(dǎo)現(xiàn)象的完美解釋,單電子隧道效應(yīng)無疑是對超導(dǎo)理論的一個重要補(bǔ)充。 1962年,年僅20歲的英國劍橋大學(xué)實驗物理學(xué)研究生約瑟夫森(Brian David Josephson,1940~)預(yù)言,當(dāng)兩個超導(dǎo)體之間設(shè)置一個絕緣薄層構(gòu)成SIS(Superconductor-Insulator-Superconductor)時,電子可以穿過絕緣體從一個超導(dǎo)體到達(dá)另一個超導(dǎo)體。約瑟夫森的這一預(yù)言不久就為P.W.安德森和J.M.羅厄耳的實驗觀測所證實——電子對通過兩塊超導(dǎo)金屬間的薄絕緣層(厚度約為10埃)時發(fā)生了隧道效應(yīng),于是稱之為“約瑟夫森效應(yīng)”。 宏觀量子隧道效應(yīng)確立了微電子器件進(jìn)一步微型化的極限,當(dāng)微電子器件進(jìn)一步微型化時必須要考慮上述的量子效應(yīng)。例如,在制造半導(dǎo)體集成電路時,當(dāng)電路的尺寸接近電子波長時,電子就通過隧道效應(yīng)而穿透絕緣層,使器件無法正常工作。因此,宏觀量子隧道效應(yīng)已成為微電子學(xué)、光電子學(xué)中的重要理論。
[應(yīng)用]?
閃存 閃存的存儲單元為三端器件,與場效應(yīng)管有相同的名稱:源極、漏極和柵極。柵極與硅襯底之間有二氧化硅絕緣層,用來保護(hù)浮置柵極中的電荷不會泄漏。采用這種結(jié)構(gòu),使得存儲單元具有了電荷保持能力,就像是裝進(jìn)瓶子里的水,當(dāng)你倒入水后,水位就一直保持在那里,直到你再次倒入或倒出,所以閃存具有記憶能力。 與場效應(yīng)管一樣,閃存也是一種電壓控制型器件。NAND型閃存的擦和寫均是基于隧道效應(yīng),電流穿過浮置柵極與硅基層之間的絕緣層,對浮置柵極進(jìn)行充電(寫數(shù)據(jù))或放電(擦除數(shù)據(jù))。而NOR型閃存擦除數(shù)據(jù)仍是基于隧道效應(yīng)(電流從浮置柵極到硅基層),但在寫入數(shù)據(jù)時則是采用熱電子注入方式(電流從浮置柵極到源極)。
場效應(yīng)管工作原理場效應(yīng)晶體管(Field Effect Transistor縮寫(FET))簡稱場效應(yīng)管。一般的晶體管是由兩種極性的載流子,即多數(shù)載流子和反極性的少數(shù)載流子參與導(dǎo)電,因此稱為雙極型晶體管,而FET僅是由多數(shù)載流子參與導(dǎo)電,它與雙極型相反,也稱為單極型晶體管。它屬于電壓控制型半導(dǎo)體器件,具有輸入電阻高(108~109Ω)、噪聲小、功耗低、動態(tài)范圍大、易于集成、沒有二次擊穿現(xiàn)象、安全工作區(qū)域?qū)挼葍?yōu)點,現(xiàn)已成為雙極型晶體管和功率晶體管的強(qiáng)大競爭者。 -------------------------------------------------------------------
我想既然msp430有256bit的Flash空間,而stm32本身是用Flash替代ROM的,那使stm32也是可以對Flash操作的,掉后也是可以保存數(shù)據(jù)的,不知道我想的對不對,請各位壇友解答?
在價格速度方面,F(xiàn)lash相對于epprom有著很大優(yōu)勢,但Flash操作起來確實沒有epprom容易,且壽命是個問題,那么問題來了,在工程項目中,是不是如果能不用epprom就不用epprom,能不用外置Flash就可以用內(nèi)置Flash?
|