標題: stm32flash模擬epprom問題 [打印本頁]
作者: 51黑ss 時間: 2016-3-30 19:42
標題: stm32flash模擬epprom問題
從430論壇看到Flash模擬epprom的問題。我之前沒有碰到過,存儲數據用epprom,也許我的水平太菜了,但無論如何,我想知道個深切。
網上關于430Flash模擬epprom的帖子很多,我找來了幾個
----------------------------------------------------
//******************************************************************************
// 參數: adr 為地址 , 范圍 0x1000~0xFFFF
void FlashRead(long adr,uint8 *bBuf,uint8bLen)
{
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 intadr)
{
_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 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型單片機內部Flash存儲器介紹
MSP430的Flash存儲器是可位、字節、字尋址和編程的存儲器。該模塊由一個集成控制器來控制編程和擦除的操作。控制器包括三個寄存器,一個時序發生器及一個提供編程、擦除電壓的電壓發生器。
Msp430的Flash存儲器的特點有:
1) 產生內部編程電壓
2) 可位、字節、字編程,可以單個操作,也可以連續多個操作
3) 超低功耗操作
4) 支持段擦除和多段模塊擦除
2 Flash存儲器的分割
Msp430Flash存儲器分成多個段。可對其進行單個字節、字的寫入,也可以進行連續多個字、字節的寫入操作,但是最小的擦除單位是段。
Flash存儲器被分割成兩部分:主存儲器和信息存儲器,兩者在操作上沒有什么區別。兩部分的區別在于段的大小和物理地址的不同。
以Msp430F149為例,信息存儲器有兩個128字節的段,即segmentA和segmentB,主存儲器有多個512字節的段。Msp430F149內部Flash的地址為0x1000H~0xFFFFH,計60K。信息段SegA的起始地址為0x1080H,信息段SegB的起始地址為0x1000H。
3 Flash存儲器的操作
在默認狀態下,處于讀操作模式。在讀操作模式中,Flash存儲器不能被擦除和寫入,時序發生器和電壓發生被關閉,存儲器操作指向ROM區。
Msp430 Flash存儲器在系統編程ISP(in-systemprogrammable)不需要額外的外部電壓。CPU能夠對Flash直接編程。Flash存儲器的寫入/擦除通過BLKWRT、WRT、MERAS、ERASE等位確定。
3.1 擦除
Flash存儲器各位的缺省值為1,每一位都可以單獨編程為0,但只有擦除操作才能將其恢復為1。擦除操作的最小單位是段。通過erase和meras位設置可選擇3種擦除模式。
MERAS |
ERASE |
擦除模式 |
0 |
1 |
段擦除 |
1 |
0 |
多段擦除(所有主存儲器的段) |
1 |
1 |
整體擦除(LOCKA=0時,擦除所有主存儲器和信息存儲器的段;主存儲器的段只有當LOCKA=0時可以擦除) |
擦除操作開始于對擦除的地址范圍內的任意位置執行一次空寫入。空寫入的目的是啟動時序發生器和擦除操作。在空寫入操作之后,BUSY位自動置位,并保持到擦除周期結束。BUSY、MERAS、ERASE在擦除周期結束后自動復位。
3.2 寫入
寫入模式由WRT和BLKWRT位進行設置。
BLKWRT(塊寫入模式選擇) |
WRT(寫模式選擇位) |
寫入模式 |
0 |
1 |
單字節、單字寫入 |
1 |
1 |
塊寫入 |
所有的寫入模式使用一系列特有的寫入命令,采用塊寫入的速度大約是單個寫入的2
倍,因為電壓發生器在塊寫入完成器件均能保持。對于這兩種寫入模式,任何能修改目的操作數的指令均能用于修改地址。一個Flash字不能再擦除器件進行兩次以上的寫入。
當啟動寫入操作時,BUSY置位,寫入結束時復位。
4 操作編程
4.1 Flash擦除
對Flash要寫入數據,必須先擦除相應的段,且對Flash存儲器的擦除必須是整段進行的,可以一段一段擦,也可以多段一起擦除。擦除操作的順序如下:
1) 選擇適當的時鐘源和分頻因子;
2) 清除LOCK位
3) 判斷BUSY位,只有當BUSY=0時才可以執行下一步
4) 使能段操作,設置ERASE、MERAS位等(如果是擦除一段,則ERASE=1,如果擦除多段,則MERAS=1,如果擦除整個Flash,則ERASE=1,MERAS=1)
5) 對擦除的地址范圍內的任意位置作一次空寫入,以啟動擦除操作
6) 在擦除周期內,時鐘源始終有效,不修改分頻因子
7) 操作完成后,置位LOCK
根據上述操作順序,編寫程序代碼如下:
void FlashErase(unsigned int adr)
{
uchar *p0;
(關閉中斷:_DINT();//關閉總中斷 本人注)
FCTL2 = FWKEY + FSSEL_1 + FN3 +FN4;//選擇時鐘源,分頻
FCTL3 = FWKEY;//清除LOCK
while(FCTL3 &BUSY);//如果出于忙,則等待
FCTL1 = FWKEY + ERASE;//使能段操作
p0 = (unsigned char *)adr;//數值強制轉換成指針
*p0 =0; //向段內任意地址寫0,即空寫入,啟動擦除操作
FCTL1 = FWKEY;
FCTL3 = FWKEY + LOCK;
while(FCTL3 & BUSY);
(_EINT(); //開總中斷 本人注)
}
4.2 寫入
對Flash的寫入數據可以是單字、單字節,也可以是連續多個字或字節(即塊操作)。編程寫入操作的順序如下:
1) 選擇適當的時鐘源和分頻因子;
2) 清除LOCK位
3) 判斷BUSY位,只有當BUSY=0時才可以執行下一步操作
4) 使能寫入功能,設置WRT、BLKWRT(如果寫入單字或單字節則WRT=1,如果是塊寫入,或者是多字、多字節連續寫入則WRT=1,BLKWRT=1);
5) 判斷BUSY位,只有當BUSY=0時才可以執行下一步操作
6) 寫入數據
7) 判忙,完了之后清除WRT,置位LOCK
根據上述操作順序,編寫程序代碼如下:
//write single byte
//Adr 為要編程的地址,沒有奇偶地址要求、DataB為要編程的字節數據
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;//數值強制轉換成指針,指向地址數據Adr所表示的內存單元
(*((unsigned char*)Adr)?本人注) //將數據字DataW賦值給內存單元
FCTL1 = FWKEY;
FCTL3 = FWKEY + LOCK;
while(FCTL3 &BUSY);
}
//write single word
//Adr 為要編程的地址,應該是偶地址、DataW為要編程的字數據
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;//數值強制轉換成指針,指向地址數據Adr所表示的內存單元
//將數據字DataW賦值給內存單元
FCTL1 = FWKEY;
FCTL3 = FWKEY + LOCK;
while(FCTL3 & BUSY);
}
// 寫入地址 *pc_byte 寫入數據:*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); //如果處于忙狀態,則等待
while(count--)
{
while(FCTL3 & BUSY);
*pc_byte++ = *Datain++;
}
FCTL1 = FWKEY;
FCTL3 = FWKEY + LOCK;
while(FCTL3 &BUSY);
}
注意:在對字寫入和字節寫入的時候,用于指向信息區數據指針類型的區別,字寫入時候為*((unsigned int*)Adr),字節寫入時候為*((unsigned char *)Adr)。
4.3 讀取
根據查看的書籍資料和網絡資料得出,內部Flash的讀取操作沒有順序的要求,一般Flash默認的操作方式即為讀模式。讀取Flash的程序代碼如下:
void FlashRead(uchar *pc_byte,uchar *Dataout,uint count)
{
while(count--)
{
*Dataout= *pc_byte;
Dataout++;
pc_byte++;
}
}
在網上查找資料的時候,好像看到過有位網友的博客說,內部Flash的地址是自動加1的,按照他的理解,函數中pc_byte++語句就沒有用處了,可是事實不然,我在調試過程中,發現并不能自動加1,pc_byte++語句還是有必要的。調用上述函數,可以通過這樣的方式FlashRead((uchar*)0x1000,a,4);即從0x1080地址處開始,連續讀取4個字節的數據,送給數組a。
5 小結
對Msp430 片內Flash的操作是通過對3個控制字中的相應位來完成的,只有控制位的正確組合,才能實現相應的功能。
同時在編程中注意靈活使用數組和指針,以及指向數組的指針等,可以達到靈活編程的目的,不過本文中給出的幾個程序段,基本上能夠實現對Msp430Flash的擦除、寫入等操作。這是我最近3天所作的一些努力,整理一下與大家分享。
本文參考了TI的《MSP430x1xx Family UsersGuide》及TI網上提供的關于Flash操作的實例代碼,并在網絡上收集了一些資料,在此不一一列出,不過本文應該算本人原創,轉載請注明。謝謝
MSP430X14X Flash 讀寫操作總結開發平臺:IAR Embedded Workbench、MSP430F149開發板作者:譚貝貝Flash操作注意事項 在讀寫的過程中電壓不能小于2.7V否則擦除和讀寫的結果將不可預測。Flash的可操作時鐘頻率為~257KHZ---~476KHZ。如果頻率不符合要求,則結果不可預測。
在擦除先需要關閉中斷和看門狗,在擦除的過程中如果產生了中斷,則會在重新使能中斷后產生一個中斷請求。Flash只能從1寫為0,不能從從0寫為1,所以需要擦除。
可以被擦除的最小模塊是片段,tAll Erase = tMass Erase = 5297/fFTG, tSeg Erase =4819/fFTG。
Flash ERASEMSP430X14X的擦除模式可以從Flash或者RAM中進行。
從Flash中擦除從Flash中擦除的過程中所有的定時都會被Flash控制,CPU被掛起。擦除完成后需要一個假寫入CPU才能復位。從Flash擦除時有可能把后面CPU需要執行的代碼擦除。如果發生這樣的情況,在擦除后CPU的執行狀況將不可預測。
Flash中擦除流程圖圖片地址:http://wenku.baidu.com/view/b82c0b1a52d380eb62946d4b.html從RAM中擦除從RAM中擦除時CPU不會被掛起,可以繼續執行代碼。必須檢測BUSY位以判斷擦除是否結束,如果在擦除的過程中(即BUSY=1時)訪問Flash,這是一個違規的訪問,ACCVIFG會置位,而擦除的結果也將不可預測。
RAM中擦除流程圖圖片地址:http://wenku.baidu.com/view/b82c0b1a52d380eb62946d4b.htmlFlash WriteMSP430X14X有兩種寫入模式,分為段寫入(byte/word write),和塊寫入(BlockWrite),塊寫入要快得多,但是操作麻煩,在擦除的過程中不能有一個Flash word(low + highbyte),則會發生損壞。CPU不能在BUSY=1時訪問Flash,否則ACCFIG將置位寫入將不可預測。
1.Byte/Word writeByte/Word寫入可以從Flash或者RAM初始化,當從Flash中初始化時,所有的定時都會被Flash控制,CPU被掛起。寫完后CPU將繼續執行后面的代碼。
當從RAM中初始化時,BUSY必須在CPU訪問Flash前置0.否則ACCFIG將被置位,寫入的結果將不可預測。
在Byte/Word 寫模式下寫入總時間不能超過4ms,如果超過了,當再想這塊任何地址寫入數據時必須先擦除。
Byte/Word 寫入流程圖
從RAM中執行Byte/Word 寫入塊寫入塊寫入時沒一小塊不能超過t_cpt=4ms,塊寫入只能從RAM中進行,在塊寫入的過程中WAIT位要置0,當想Flash中寫入數據時,需要先檢查WAIT位是否為1.當前塊寫完后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
內容摘要:一、MSP430單片機FLASH存儲器模塊特點1.8~3.6V工作電壓,2.7~3.6V編程電壓;擦除/編程次數可達100000次:數據保持時間從10年到100年不等:60KB空間編程時間<5秒:保密熔絲燒斷后不可恢復,不能再對JTAG進行任何訪問;FLASH編...
一、MSP430 FLASH模塊特點
1.8~3.6V工作電壓,2.7~3.6V編程電壓;
擦除/編程次數可達100000次:
數據保持時間從10年到100年不等:// 來自 :ST_M_8.C_N
60KB空間編程時間<5秒:
保密熔絲燒斷后不可恢復,不能再對JTAG進行任何訪問;
FLASH編程/擦除時間由內部硬件控制,無任何軟件干預;
二、FLASH存儲器的操作
由于FLASH存儲器由很多相對獨立的段組成,因此可在一個段中運行程序,而對另一個段進行擦除或寫入操作。正在執行編程或擦除等操作的FLASH段是不能被訪問的,因為這時該段是與片內地址總線暫時斷開的。對FLASH模塊的操作可分為3類:擦除、寫入及讀出。而擦除又可分為單段擦除和整個模塊擦除;寫入可分為字寫入、字節寫入、字連續寫入和字節連續寫入
1.FLASH擦除操作:對FLASH要寫入數據,必須先擦除相應的段,對FLASH存儲器的擦除必須是整段地進行,可以一段一段地擦除,也可以多端一起擦除,但不能一個字節或一個字地擦除。擦除之后各位為1。擦除操作的順序如下:
選擇適當的時鐘源和分頻因子,為時序發生器提供正確時鐘輸入
如果Lock=1,則將它復位:
BUSY標志位,只有當BUSY=0時才可以執行下一步,否則不行
如果擦除一段,則設置ERASE=1
如果擦除多段,則設置MERAS=1
如果擦除整個FLASH,則設置RASE=1,同時MERAS=1
對擦除的地址范圍內的任意位置作一次空寫入,用以啟動擦除操作。
在擦除周期選擇的時鐘源始終有效
在擦除周期不修改分頻因子
在BUSY=1期間不再訪問所操作的段
電源電壓應符合芯片的相應要求// 來自 :ST_M_8.C_N
對FLASH擦除要做4件事
對FLASH控制寄存器寫入適當的控制位
BUSY位
空寫一次
等待
2.FLASH編程操作。對FLASH編程按如下順序進行:
選擇適當的時鐘源和分頻因子
如果Lock=1,則將它復位
BUSY標志位,只有當BUSY=0時才可以執行下一步,否則不行
如果寫入單字或單字節,則將設置WRT=1
如果是塊寫或多字、多字節順序寫入,則將設置WRT=1,BLKWRT=1
將數據寫入選定地址時啟動時序發生器,在時序發生器的控制下完成整個過程
塊寫入可用于在FLASH段中的一個連續的存儲區域寫入一系列數據。一個塊為64字節長度。塊開始在0XX00H、0XX40H、0XX80H、0XXC0H等地址,塊結束在0XX3FH、0XX7FH、0XXBFH、0XXFFH等地址。塊操作在64字節分界處需要特殊的軟件支持,操作如下:
等待WAIT位,直到WAIT=1,表明最后一個字或字節寫操作結束
將控制位BLKWRT復位
保持BUSY位為1,直到編程電壓撤離FLASH模塊
在新塊被編程前,等待trcv(編程電壓恢復時間)時間
在寫周期中,必須保證滿足以下條件:
被選擇的時鐘源在寫過程中保持有效
分頻因子不變
在BUSY=1期間,不訪問FLASH存儲器模塊
對FLASH寫入要做4件事
對FLASH控制寄存器寫入適當的控制位
BUSY位
寫一個數據
繼續寫一直到寫完
3.FLASH錯誤操作的處理:在寫入FLASH控制寄存器控制參數時,可引發以下錯誤:
如果寫入高字節口令碼錯誤,則引發PUC信號。小心操作可避免
在對FLASH操作期間讀FLASH內容,會引發ACCVFIG狀態位的設置。小心操作可避免
在對FLASH操作期間看門狗定時器溢出。建議用戶程序在進行FLASH操作之前先停止看門狗定時器,等操作結束后再打開看門狗
所有的FLASH類型的MSP430器件0段都包含有中斷向量等重要的程序代碼,如果對其進行擦除操作,將會引起嚴重的后果
不要在FLASH操作期間允許中斷的發生
4.FLASH操作小結
對FLASH的操作是通過對3個控制字中的相應位來完成的,只有控制位的唯一組合才能實現相應的功能。下表給出了正確的控制位組合:
功能 BLKWRT WRT Meras Erase BUSY WAIT Lock
字或字節寫入 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)的各位進行定義。它們使用安全鍵值(口令碼)來防止錯誤的編程和擦除周期,口令出錯將產生非屏蔽中斷請求。安全鍵值位于每個控制字的高字節,讀時為96H,寫時為5AH。
1.FCTL1 控制寄存器1(用于控制所有寫/編程或者刪除操作的有效位),各位定義如下:
bit15~8 bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0
安全鍵值,讀為96H,寫5AH BLKWRT WRT -- -- -- MERAS ERASE --
BLKWRT——段編程位。如果有較多的連續數據要編程到某一段或某幾段,則可選擇這種方式,這樣可縮短編程時間。在一段程序完畢,再編程其它段,需對該位先復位再置位,在下一條寫指令執行前WAIT位應為1。
0:未選用段編程方式
1:選用段編程方式
WRT——編程位
0:不編程,如對FLASH寫操作,發生非法訪問,使ACCVIFG位置位;
1:編程
MERAS——主存控制擦除位
0:不擦除
1:主存全擦除,對主存空寫時啟動擦除操作,完成后MERAS自動復位
ERASE——擦除一段控制位
0:不擦除
1:擦除一段。由空寫指令帶入段號來指定擦除哪一段,操作完成后自動復位
2.FCTL2 控制寄存器2(對進入時序發生器的時鐘進行定義),各位定義如下:
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——分頻系數選擇位
0:直通
1:2分頻
2:3分頻
...... read datasheet
63:64分頻
3.FCTL3 控制寄存器3(用于控制FLASH存儲器操作,保存相應的狀態標志和錯誤條件),各位定義如下:
bit15~8 bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0
安全鍵值,讀為96H,寫5AH -- -- EMEX Lock WAIT ACCVIFG KEYV BUSY
EMEX——緊急退出位。對FLASH的操作失敗時使用該位作緊急處理
0:無作用
1:立即停止對FLASH的操作
Lock——鎖定位,給已經編程好的FLASH存儲器加鎖
0:不加鎖,FLASH存儲器可讀、可寫、可擦除
1:加鎖,加鎖的FLASH存儲器可讀、不可寫、不可擦除
WAIT——等待指示信號,該位只讀。// 來自 :ST_M_8.C_N
0:段編程操作已經開始,編程操作進行中
1:段編程操作有效,當前數據已經正確地寫入FLASH存儲器,后續編程數據被列入計劃
ACCVIFG——非法訪問中斷標志。當對FLASH陣列進行編程或擦除操作時不能訪問FLASH,否則將使得該位置位
0:沒有對FLASH存儲器的非法訪問
1:有對FLASH存儲器的非法訪問
KEYV——安全鍵值(口令碼)出錯標志位
0:對3個控制寄存器的訪問,寫入時高字節是0A5H
1:對3個控制寄存器的訪問,寫入時高字節不是0A5H,同時引發PUC信號
KEYV不會自動復位,須用軟件復位
BUSY——忙標志位。該位只讀。每次編程或擦除之前都應該檢查BUSY位。當編程或擦除啟動后,時序發生器將自動設置該位為1,操作完成后BUSY位自動復位
0:FLASH存儲器不忙
1:FLASH存儲器忙
可以在程序中擦寫FLASH這樣就不用判斷Busy的標志,因為只有擦寫完成的時候FLASH才有效!程序才能繼續走!如果把程序拷到RAM中擦除就要判斷BUSY了!
擦寫完成后可以不用LOCK,用LOCK只是一個保險作用!防止你對FLASH的非法操作
------------------------------------------------------------------------------------------
我從文庫里也看到Flash與epprom的區別,但沒有找到文庫,只好在網上找了篇博客
--------------------------------------------------------------
掉電需保護且在程序運行過程中需要修改的想少量參數保存在EEPROM中,其擦除次數較Flash多,Flash用來做程序和一些掉電保護和不需要修改的數據。
Flash memory指的是“閃存”,所謂“閃存”,它也是一種非易失性的內存,屬于EEPROM的改進產品,它的最大特點是必須按塊(Block)擦除(每個區塊的大小不定,不同廠家的產品有不同的規格),而EEPROM則可以一次只擦除一個字節(Byte),目前“閃存”被廣泛用在PC機的主板上,用來保存BIOS程序,便于進行程序的升級。其另外一大應用領域是用來作為硬盤的替代品,具有抗震、速度快、無噪聲、耗電低的優點,但是將其用來取代RAM就顯的不合適,因為RAM需要能夠按字節改寫,而Flash ROM做不到。
FLASH的全稱是FLASH EEPROM,但跟常規EEPROM的操作方法不同。FLASH和EEPROM的最大區別是FLASH按扇區操作,EEPROM則按字節操作,二者尋址方法不同,存儲單元的結構也不同,FLASH的電路結構較簡單,同樣容量占芯片面積較小,成本自然比EEPROM低,因而適合用作程序存儲器,EEPROM麻煩的多,所以更“人性化”的MCU設計會集成FLASH和EEPROM兩種非易失性存儲器,而廉價型設計往往只有FLASH,EEPROM在運行中可以被修改,而FLASH在運行時不能修改,EEPROM可以存儲一些修改的參數,Flash中存儲程序代碼和不需要修改的數據,所謂的Flash是用來形容整個存儲單元的內容可以一次性擦除。所以,理論上凡是具備這樣特征的存儲器都可以稱為Flash memory。EEPROM里面也分FF-EEPROM和FLASH EEPROM的,現在大家所講的Flash memory實際上分為兩大類,一類是Floating Gate Debice,一類是Charge Trapping Debice,這里的分類標準主要是program與crase的機制不同。
一:FLASH和EEPROM的區別
1:相同點是兩者都能掉電存儲數據
2:不同點是:
A:FALSH寫入時間長,EEPROM寫入時間短。
B:FLASH擦寫次數少(10000次),EEPROM次數多(1000000次)
二:單片機的數據存儲器不能用FLASH,因為:
1:FLASH有一定的擦除,寫入次數,一般的單片機的FLASH擦除寫入次數的標稱值是10000次。
2:FLASH寫入數據需要比較長的時間,大約需要4-6ms,而且寫FLASH需要加上9V的高壓,麻煩。
三:至于EEPROM,可以作為數據存儲器,但是單片機如atmegal28,一般用RAM作為數據存儲器,因為EEPROM工藝復雜,成本高,適合于存儲掉電保護的數據,而這類數據往往不需要太多,所以一般的單片機都沒在內部集成EEPROM,需要的時候可以讓單片機外掛24C01一類的串行EEPROM。
區別:
1、 FLASH按扇區操作,EEPROM則按字節操作
2、 FLASH寫入時間長,EEPROM寫入時間短
3、 FLASH擦寫次數少(10000次),EEPROM次數多(1000000次)
4、 FLASH的電路結構簡單,成本低,EEPROM工藝復雜,成本高
EEPROM
百科名片
EEPROM (Electrically Erasable Programmable Read-Only Memory),電可擦可編程只讀存儲器--一種掉電后數據不丟失的存儲芯片。 EEPROM 可以在電腦上或專用設備上擦除已有信息,重新編程。一般用在即插即用。
目錄
發展
背景知識
基本原理
編輯本段發展
EEPROM(電可擦寫可編程只讀存儲器)是可用戶更改的只讀存儲器(ROM),其可通過高于普通
EEPROM
電壓的作用來擦除和重編程(重寫)。不像EPROM芯片,EEPROM不需從計算機中取出即可修改。在一個EEPROM中,當計算機在使用的時候是可頻繁地重編程的,EEPROM的壽命是一個很重要的設計考慮參數。EEPROM的一種特殊形式是閃存,其應用通常是個人電腦中的電壓來擦寫和重編程。
EEPROM,一般用于即插即用(Plug & Play)。
常用在接口卡中,用來存放硬件設置數據。
也常用在防止軟件非法拷貝的"硬件鎖"上面。
編輯本段背景知識
在微機的發展初期,BIOS都存放在ROM(Read Only Memory,只讀存儲器)中。ROM內部的資料是在ROM的制造工序中,在工廠里用特殊的方法被燒錄進去的,其中的內容只能讀不能改,一旦燒錄進去,用戶只能驗證寫入的資料是否正確,不能再作任何修改。如果發現資料有任何錯誤,則只有舍棄不用,
EEPROM
重新訂做一份。ROM是在生產線上生產的,由于成本高,一般只用在大批量應用的場合。
由于ROM制造和升級的不便,后來人們發明了PROM(Programmable ROM,可編程ROM)。最初從工廠中制作完成的PROM內部并沒有資料,用戶可以用專用的編程器將自己的資料寫入,但是這種機會只有一次,一旦寫入后也無法修改,若是出了錯誤,已寫入的芯片只能報廢。PROM的特性和ROM相同,但是其成本比ROM高,而且寫入資料的速度比ROM的量產速度要慢,一般只適用于少量需求的場合或是ROM量產前的驗證。
EPROM(Erasable Programmable ROM,可擦除可編程ROM)芯片可重復擦除和寫入,解決了PROM芯片只能寫入一次的弊端。EPROM芯片有一個很明顯的特征,在其正面的陶瓷封裝上,開有一個玻璃窗口,透過該窗口,可以看到其內部的集成電路,紫外線透過該孔照射內部芯片就可以擦除其內的數據,完成芯片擦除的操作要用到EPROM擦除器。EPROM內資料的寫入要用專用的編程器,并且往芯片中寫內容時必須要加一定的編程電壓(VPP=12—24V,隨不同的芯片型號而定)。EPROM的型號是以27開頭的,如27C020(8*256K)是一片2M Bits容量的EPROM芯片。EPROM芯片在寫入資料后,還要以不透光的貼紙或膠布把窗口封住,以免受到周圍的紫外線照射而使資料受損。
編輯本段基本原理
由EPROM操作的不便,后來出的主板上BIOS ROM芯片大部分都采用EEPROM(Electrically Erasable Programmable ROM,電可擦除可編程ROM)。EEPROM的擦除不需要借助于其它設備,它是以電子信號來修改其內容的,而且是以Byte為最小修改單位,不必將資料全部洗掉才能寫入,徹底擺脫了EPROM Eraser和編程器的束縛。EEPROM在寫入數據時,仍要利用一定的編程電壓,此時,只需用廠商提供的專用刷新程序就可以輕而易舉地改寫內容,所以,它屬于雙電壓芯片。借助于EEPROM芯片的雙電壓特性,可以使BIOS具有良好的防毒功能,在升級時,把跳線開關打至“ON”的位置,即給芯片加上相應的編程電壓,就可以方便地升級;平時使用時,則把跳線開關打至“OFF”的位置,防止CIH類的病毒對BIOS芯片的非法修改。所以,至今仍有不少主板采用EEPROM作為BIOS芯片并作為自己主板的一大特色。
EEPROM和flash的區別
之前對各種存儲器一直不太清楚,今天總結一下。
存儲器分為兩大類:ram和rom。
ram就不講了,今天主要討論rom。
rom最初不能編程,出廠什么內容就永遠什么內容,不靈活。后來出現了prom,可以自己寫入一次,要是寫錯了,只能換一片,自認倒霉。人類文明不斷進步,終于出現了可多次擦除寫入的EPROM,每次擦除要把芯片拿到紫外線上照一下,想一下你往單片機上下了一個程序之后發現有個地方需要加一句話,為此你要把單片機放紫外燈下照半小時,然后才能再下一次,這么折騰一天也改不了幾次。歷史的車輪不斷前進,偉大的EEPROM出現了,拯救了一大批程序員,終于可以隨意的修改rom中的內容了。
EEPROM的全稱是“電可擦除可編程只讀存儲器”,即Electrically Erasable Programmable Read-Only Memory。是相對于紫外擦除的rom來講的。但是今天已經存在多種EEPROM的變種,變成了一類存儲器的統稱。
狹義的EEPROM:
這種rom的特點是可以隨機訪問和修改任何一個字節,可以往每個bit中寫入0或者1。這是最傳統的一種EEPROM,掉電后數據不丟失,可以保存100年,可以擦寫100w次。具有較高的可靠性,但是電路復雜/成本也高。因此目前的EEPROM都是幾十千字節到幾百千字節的,絕少有超過512K的。
flash:
flash屬于廣義的EEPROM,因為它也是電擦除的rom。但是為了區別于一般的按字節為單位的擦寫的EEPROM,我們都叫它flash。
flash做的改進就是擦除時不再以字節為單位,而是以塊為單位,一次簡化了電路,數據密度更高,降低了成本。上M的rom一般都是flash。
flash分為nor flash和nand flash。nor flash數據線和地址線分開,可以實現ram一樣的隨機尋址功能,可以讀取任何一個字節。但是擦除仍要按塊來擦。
nand flash同樣是按塊擦除,但是數據線和地址線復用,不能利用地址線隨機尋址。讀取只能按頁來讀取。(nandflash按塊來擦除,按頁來讀,norflash沒有頁)
由于nandflash引腳上復用,因此讀取速度比nor flash慢一點,但是擦除和寫入速度比nor flash快很多。nand flash內部電路更簡單,因此數據密度大,體積小,成本也低。因此大容量的flash都是nand型的。小容量的2~12M的flash多是nor型的。
使用壽命上,nand flash的擦除次數是nor的數倍。而且nand flash可以標記壞塊,從而使軟件跳過壞塊。nor flash 一旦損壞便無法再用。
因為nor flash可以進行字節尋址,所以程序可以在nor flash中運行。嵌入式系統多用一個小容量的nor flash存儲引導代碼,用一個大容量的nand flash存放文件系統和內核。
PROM、ROM、EPROM、EEPROM、Flash ROM的區別
ROM 指的是“只讀存儲器”,即Read-Only Memory。這是一種線路最簡單半導體電路,通過掩模工藝, 一次性制造,其中的代碼與數據將永久保存(除非壞掉),不能進行修改。這玩意一般在大批量生產時才會被用的,優點是成本低、非常低,但是其風險比較大,在 產品設計時,如果調試不徹底,很容易造成幾千片的費片,行內話叫“掩砸了”!
PROM 指的是“可編程只讀存儲器”既Programmable Red-Only Memory。這樣的產品只允許寫入一次,所以也被稱為“一次可編程只讀存儲器”(One Time Progarmming ROM,OTP-ROM)。PROM在出廠時,存儲的內容全為1,用戶可以根據需要將其中的某些單元寫入數據0(部分的PROM在出廠時數據全為0,則用 戶可以將其中的部分單元寫入1), 以實現對其“編程”的目的。PROM的典型產品是“雙極性熔絲結構”,如果我們想改寫某些單元,則可以給這些單元通以足夠大的電流,并維持一定的時間,原 先的熔絲即可熔斷,這樣就達到了改寫某些位的效果。另外一類經典的PROM為使用“肖特基二極管”的PROM,出廠時,其中的二極管處于反向截止狀態,還 是用大電流的方法將反相電壓加在“肖特基二極管”,造成其永久性擊穿即可。
EPROM 指的是“可擦寫可編程只讀存儲器”,即Erasable Programmable Read-Only Memory。 它的特點是具有可擦除功能,擦除后即可進行再編程,但是缺點是擦除需要使用紫外線照射一定的時間。這一類芯片特別容易識別,其封裝中包含有“石英玻璃窗 ”,一個編程后的EPROM芯片的“石英玻璃窗”一般使用黑色不干膠紙蓋住, 以防止遭到 陽光直射。
EEPROM 指的是“電可擦除可編程只讀存儲器”,即Electrically Erasable Programmable Read-Only Memory。它的最大優點是可直接用電信號擦除,也可用電信號寫入。EEPROM不能取代RAM的原應是其工藝復雜, 耗費的門電路過多,且重編程時間比較長,同時其有效重編程次數也比較低。
Flash memory 指的是“閃存”,所謂“閃存”,它也是一種非易失性的內存,屬于EEPROM的改進產品。它的最大特點是必須按塊(Block)擦除(每個區塊的大小不 定,不同廠家的產品有不同的規格), 而EEPROM則可以一次只擦除一個字節(Byte)。目前“閃存”被廣泛用在PC機的主板上,用來保存BIOS程序,便于進行程序的升級。其另外一大應 用領域是用來作為硬盤的替代品,具有抗震、速度快、無噪聲、耗電低的優點,但是將其用來取代RAM就顯得不合適,因為RAM需要能夠按字節改寫,而 Flash ROM做不到。
Flash存儲器
百科名片
FLASH閃存 閃存的英文名稱是"Flash Memory",一般簡稱為"Flash",它屬于內存器件的一種。 不過閃存的物理特性與常見的內存有根本性的差異: 目前各類 DDR 、 SDRAM 或者 RDRAM 都屬于揮發性內存,只要停止電流供應內存中的數據便無法保持,因此每次電腦開機都需要把數據重新載入內存;
目錄
flash memory的簡要介紹?
flash memory的工作原理
展開
編輯本段flash memory的簡要介紹?
閃存則是一種不揮發性( Non-Volatile )內存,在沒有電流供應的條件下也能夠長久地保持數據,其存儲特性相當于硬盤,這項特性正是閃存得以成為各類便攜型數字設備的存儲介質的基礎。
NAND 閃存的存儲單元則采用串行結構,存儲單元的讀寫是以頁和塊為單位來進行(一頁包含若干字節,若干頁則組成儲存塊, NAND 的存儲塊大小為 8 到 32KB ),這種結構最大的優點在于容量可以做得很大,超過 512MB 容量的 NAND 產品相當普遍, NAND 閃存的成本較低,有利于大規模普及。
NAND 閃存的缺點在于讀速度較慢,它的 I/O 端口只有 8 個,比 NOR 要少多了。這區區 8 個 I/O 端口只能以信號輪流傳送的方式完成數據的傳送,速度要比 NOR 閃存的并行傳輸模式慢得多。再加上 NAND 閃存的邏輯為電子盤模塊結構,內部不存在專門的存儲控制器,一旦出現數據壞塊將無法修,可靠性較 NOR 閃存要差。
NAND 閃存被廣泛用于移動存儲、數碼相機、 MP3 播放器、掌上電腦等新興數字設備中。由于受到數碼設備強勁發展的帶動, NAND 閃存一直呈現指數級的超高速增長.
NOR和NAND是現在市場上兩種主要的非易失閃存技術。Intel于1988年首先開發出NOR flash技術,徹底改變了原先由EPROM和EEPROM一統天下的局面。緊接著,1989年,東芝公司發表了NAND flash結構,強調降低每比特的成本,更高的性能,并且象磁盤一樣可以通過接口輕松升級。但是經過了十多年之后,仍然有相當多的硬件工程師分不清NOR和NAND閃存。
相“flash存儲器”經常可以與相“NOR存儲器”互換使用。許多業內人士也搞不清楚NAND閃存技術相對于NOR技術的優越之處,因為大多數情況下閃存只是用來存儲少量的代碼,這時NOR閃存更適合一些。而NAND則是高數據存儲密度的理想解決方案。
NOR的特點是芯片內執行(XIP, eXecute In Place),這樣應用程序可以直接在flash閃存內運行,不必再把代碼讀到系統RAM中。NOR的傳輸效率很高,在1~4MB的小容量時具有很高的成本效益,但是很低的寫入和擦除速度大大影響了它的性能。
NAND結構能提供極高的單元密度,可以達到高存儲密度,并且寫入和擦除的速度也很快。應用NAND的困難在于flash的管理和需要特殊的系統接口。
性能比較
flash閃存是非易失存儲器,可以對稱為塊的存儲器單元塊進行擦寫和再編程。任何flash器件的寫入操作只能在空或已擦除的單元內進行,所以大多數情況下,在進行寫入操作之前必須先執行擦除。NAND器件執行擦除操作是十分簡單的,而NOR則要求在進行擦除前先要將目標塊內所有的位都寫為0。
由于擦除NOR器件時是以64~128KB的塊進行的,執行一個寫入/擦除操作的時間為5s,與此相反,擦除NAND器件是以8~32KB的塊進行的,執行相同的操作最多只需要4ms。
執行擦除時塊尺寸的不同進一步拉大了NOR和NADN之間的性能差距,統計表明,對于給定的一套寫入操作(尤其是更新小文件時),更多的擦除操作必須在基于NOR的單元中進行。這樣,當選擇存儲解決方案時,設計師必須權衡以下的各項因素。
● NOR的讀速度比NAND稍快一些。
● NAND的寫入速度比NOR快很多。
● NAND的4ms擦除速度遠比NOR的5s快。
● 大多數寫入操作需要先進行擦除操作。
● NAND的擦除單元更小,相應的擦除電路更少。
接口差別
NOR flash帶有SRAM接口,有足夠的地址引腳來尋址,可以很容易地存取其內部的每一個字節。
NAND器件使用復雜的I/O口來串行地存取數據,各個產品或廠商的方法可能各不相同。8個引腳用來傳送控制、地址和數據信息。
NAND讀和寫操作采用512字節的塊,這一點有點像硬盤管理此類操作,很自然地,基于NAND的存儲器就可以取代硬盤或其他塊設備。
容量和成本
NAND flash的單元尺寸幾乎是NOR器件的一半,由于生產過程更為簡單,NAND結構可以在給定的模具尺寸內提供更高的容量,也就相應地降低了價格。
NOR flash占據了容量為1~16MB閃存市場的大部分,而NAND flash只是用在8~128MB的產品當中,這也說明NOR主要應用在代碼存儲介質中,NAND適合于數據存儲,NAND在CompactFlash、Secure Digital、PC Cards和MMC存儲卡市場上所占份額最大。
可靠性和耐用性
采用flahs介質時一個需要重點考慮的問題是可靠性。對于需要擴展MTBF的系統來說,Flash是非常合適的存儲方案。可以從壽命(耐用性)、位交換和壞塊處理三個方面來比較NOR和NAND的可靠性。
壽命(耐用性)
在NAND閃存中每個塊的最大擦寫次數是一百萬次,而NOR的擦寫次數是十萬次。NAND存儲器除了具有10比1的塊擦除周期優勢,典型的NAND塊尺寸要比NOR器件小8倍,每個NAND存儲器塊在給定的時間內的刪除次數要少一些。
位交換
所有flash器件都受位交換現象的困擾。在某些情況下(很少見,NAND發生的次數要比NOR多),一個比特位會發生反轉或被報告反轉了。
一位的變化可能不很明顯,但是如果發生在一個關鍵文件上,這個小小的故障可能導致系統停機。如果只是報告有問題,多讀幾次就可能解決了。
當然,如果這個位真的改變了,就必須采用錯誤探測/錯誤更正(EDC/ECC)算法。位反轉的問題更多見于NAND閃存,NAND的供應商建議使用NAND閃存的時候,同時使用EDC/ECC算法。
這個問題對于用NAND存儲多媒體信息時倒不是致命的。當然,如果用本地存儲設備來存儲操作系統、配置文件或其他敏感信息時,必須使用EDC/ECC系統以確保可靠性。
壞塊處理
NAND器件中的壞塊是隨機分布的。以前也曾有過消除壞塊的努力,但發現成品率太低,代價太高,根本不劃算。
NAND器件需要對介質進行初始化掃描以發現壞塊,并將壞塊標記為不可用。在已制成的器件中,如果通過可靠的方法不能進行這項處理,將導致高故障率。
易于使用
可以非常直接地使用基于NOR的閃存,可以像其他存儲器那樣連接,并可以在上面直接運行代碼。
由于需要I/O接口,NAND要復雜得多。各種NAND器件的存取方法因廠家而異。
在使用NAND器件時,必須先寫入驅動程序,才能繼續執行其他操作。向NAND器件寫入信息需要相當的技巧,因為設計師絕不能向壞塊寫入,這就意味著在NAND器件上自始至終都必須進行虛擬映射。
軟件支持?
當討論軟件支持的時候,應該區別基本的讀/寫/擦操作和高一級的用于磁盤仿真和閃存管理算法的軟件,包括性能優化。
在NOR器件上運行代碼不需要任何的軟件支持,在NAND器件上進行同樣操作時,通常需要驅動程序,也就是內存技術驅動程序(MTD),NAND和NOR器件在進行寫入和擦除操作時都需要MTD。
使用NOR器件時所需要的MTD要相對少一些,許多廠商都提供用于NOR器件的更高級軟件,這其中包括M-System的TrueFFS驅動,該驅動被Wind River System、Microsoft、QNX Software System、Symbian和Intel等廠商所采用。
編輯本段flash memory的工作原理
[原理]
經典物理學認為,物體越過勢壘,有一閾值能量;粒子能量小于此能量則不能越過,大于此能量則可以越過。例如騎自行車過小坡,先用力騎,如果坡很低,不蹬自行車也能靠慣性過去。如果坡很高,不蹬自行車,車到一半就停住,然后退回去。
量子力學則認為,即使粒子能量小于閾值能量,很多粒子沖向勢壘,一部分粒子反彈,還會有一些粒子能過去,好象有一個隧道,稱作“量子隧道(quantum tunneling)”。
可見,宏觀上的確定性在微觀上往往就具有不確定性。雖然在通常的情況下,隧道效應并不影響經典的宏觀效應,因為隧穿幾率極小,但在某些特丁的條件下宏觀的隧道效應也會出現。
[發現者]
1957年,受雇于索尼公司的江崎玲於奈(Leo Esaki,1940~)在改良高頻晶體管2T7的過程中發現,當增加PN結兩端的電壓時電流反而減少,江崎玲於奈將這種反常的負電阻現象解釋為隧道效應。此后,江崎利用這一效應制成了隧道二極管(也稱江崎二極管)。
1960年,美裔挪威籍科學家加埃沃(Ivan Giaever,1929~)通過實驗證明了在超導體隧道結中存在單電子隧道效應。在此之前的1956年出現的“庫珀對”及BCS理論被公認為是對超導現象的完美解釋,單電子隧道效應無疑是對超導理論的一個重要補充。
1962年,年僅20歲的英國劍橋大學實驗物理學研究生約瑟夫森(Brian David Josephson,1940~)預言,當兩個超導體之間設置一個絕緣薄層構成SIS(Superconductor-Insulator-Superconductor)時,電子可以穿過絕緣體從一個超導體到達另一個超導體。約瑟夫森的這一預言不久就為P.W.安德森和J.M.羅厄耳的實驗觀測所證實——電子對通過兩塊超導金屬間的薄絕緣層(厚度約為10埃)時發生了隧道效應,于是稱之為“約瑟夫森效應”。 宏觀量子隧道效應確立了微電子器件進一步微型化的極限,當微電子器件進一步微型化時必須要考慮上述的量子效應。例如,在制造半導體集成電路時,當電路的尺寸接近電子波長時,電子就通過隧道效應而穿透絕緣層,使器件無法正常工作。因此,宏觀量子隧道效應已成為微電子學、光電子學中的重要理論。
[應用]?
閃存
閃存的存儲單元為三端器件,與場效應管有相同的名稱:源極、漏極和柵極。柵極與硅襯底之間有二氧化硅絕緣層,用來保護浮置柵極中的電荷不會泄漏。采用這種結構,使得存儲單元具有了電荷保持能力,就像是裝進瓶子里的水,當你倒入水后,水位就一直保持在那里,直到你再次倒入或倒出,所以閃存具有記憶能力。
與場效應管一樣,閃存也是一種電壓控制型器件。NAND型閃存的擦和寫均是基于隧道效應,電流穿過浮置柵極與硅基層之間的絕緣層,對浮置柵極進行充電(寫數據)或放電(擦除數據)。而NOR型閃存擦除數據仍是基于隧道效應(電流從浮置柵極到硅基層),但在寫入數據時則是采用熱電子注入方式(電流從浮置柵極到源極)。
場效應管工作原理場效應晶體管(Field Effect Transistor縮寫(FET))簡稱場效應管。一般的晶體管是由兩種極性的載流子,即多數載流子和反極性的少數載流子參與導電,因此稱為雙極型晶體管,而FET僅是由多數載流子參與導電,它與雙極型相反,也稱為單極型晶體管。它屬于電壓控制型半導體器件,具有輸入電阻高(108~109Ω)、噪聲小、功耗低、動態范圍大、易于集成、沒有二次擊穿現象、安全工作區域寬等優點,現已成為雙極型晶體管和功率晶體管的強大競爭者。
-------------------------------------------------------------------
我想既然msp430有256bit的Flash空間,而stm32本身是用Flash替代ROM的,那使stm32也是可以對Flash操作的,掉后也是可以保存數據的,不知道我想的對不對,請各位壇友解答?
在價格速度方面,Flash相對于epprom有著很大優勢,但Flash操作起來確實沒有epprom容易,且壽命是個問題,那么問題來了,在工程項目中,是不是如果能不用epprom就不用epprom,能不用外置Flash就可以用內置Flash?
歡迎光臨 (http://www.raoushi.com/bbs/) |
Powered by Discuz! X3.1 |