标题: 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.51hei.com/bbs/) |
Powered by Discuz! X3.1 |