ADS 如何将数据写入串口flash

21ic官方微信-->
后使用快捷导航没有帐号?
请完成以下验证码
查看: 4980|回复: 26
菜鸟请教片外flash数据如何写入
&&已结帖(0)
主题帖子积分
高级技术员, 积分 870, 距离下一级还需 130 积分
高级技术员, 积分 870, 距离下一级还需 130 积分
主题帖子积分
专家等级:结帖率:0%
主题帖子积分
高级技术员, 积分 870, 距离下一级还需 130 积分
高级技术员, 积分 870, 距离下一级还需 130 积分
本人菜鸟,刚学ARM不久,想做个图象识别东东,即将某图象的几个特征数据先存入flash,第二次便拿它来和新提取的图象数据比对....问:我开发板上只有片外flash,则么实现既将代码烧入,又可存入少量数据啊?要分扇区吗?扇区则么分?           谢谢高人指教,蛮急的!!!万分感激!!!
主题帖子积分
高级技术员, 积分 870, 距离下一级还需 130 积分
高级技术员, 积分 870, 距离下一级还需 130 积分
主题帖子积分
专家等级:结帖率:0%
主题帖子积分
高级技术员, 积分 870, 距离下一级还需 130 积分
高级技术员, 积分 870, 距离下一级还需 130 积分
本人谢绝广告&&&期望真心赐教者!!!
主题帖子积分
技术达人, 积分 8493, 距离下一级还需 1507 积分
技术达人, 积分 8493, 距离下一级还需 1507 积分
主题帖子积分
专家等级:结帖率:100%
主题帖子积分
技术达人, 积分 8493, 距离下一级还需 1507 积分
技术达人, 积分 8493, 距离下一级还需 1507 积分
找常用芯片的datasheet,找例子程序
比如SST39VF160
主题帖子积分
主题帖子积分
专家等级:结帖率:10%打赏:0.00受赏:33.00
主题帖子积分
正常来讲是程序不能即在flash运行又对Flash操作的
楼主需要将代码写入到Flash,然后程序能够将Flash的代码复制到RAM里去运行,再在空佘的Flash里保存图象
主题帖子积分
高级技术员, 积分 870, 距离下一级还需 130 积分
高级技术员, 积分 870, 距离下一级还需 130 积分
主题帖子积分
专家等级:结帖率:0%
主题帖子积分
高级技术员, 积分 870, 距离下一级还需 130 积分
高级技术员, 积分 870, 距离下一级还需 130 积分
哈哈,终于引出了板主
谢楼上两位,确定下:也就是说我将代码写入到Flash,跑起来后,如果不复制到RAM里运行,就不能存数据进flash了是吗?(开发板上没片内flash,是片外的SST39VF160)新手刚学,若要复制到RAM里运行是不是只能通过ADS里分散加载文件实现?
主题帖子积分
技术达人, 积分 8493, 距离下一级还需 1507 积分
技术达人, 积分 8493, 距离下一级还需 1507 积分
主题帖子积分
专家等级:结帖率:100%
主题帖子积分
技术达人, 积分 8493, 距离下一级还需 1507 积分
技术达人, 积分 8493, 距离下一级还需 1507 积分
如果希望整个程序在RAM上运行,一般只需要在linker设置中把RO和RW定位在RAM就可以了。如果仅仅是想把访问flash的代码放在RAM中,那么要用分散加载文件。对于没有片内FLASH的arm,一般都是通过boot程序将可执行代码整个从FLASH拷贝到RAM,然后去执行的。怀疑你的开发板是44B0的。随开发板应该有资料吧。
主题帖子积分
高级技术员, 积分 870, 距离下一级还需 130 积分
高级技术员, 积分 870, 距离下一级还需 130 积分
主题帖子积分
专家等级:结帖率:0%
主题帖子积分
高级技术员, 积分 870, 距离下一级还需 130 积分
高级技术员, 积分 870, 距离下一级还需 130 积分
谢楼上指点
我是easyARM2200开发板,刚学,它是LPC2210芯片.不过高手你只回答了我后半个问题,前半个问题呢?"也就是说我将代码写入到Flash,跑起来后,如果不复制到RAM里运行,就不能存数据进flash了是吗?"顺带也给我讲解下啊,新手,望细讲!~~!!先扣谢各位高人!!!
主题帖子积分
技术达人, 积分 8493, 距离下一级还需 1507 积分
技术达人, 积分 8493, 距离下一级还需 1507 积分
主题帖子积分
专家等级:结帖率:100%
主题帖子积分
技术达人, 积分 8493, 距离下一级还需 1507 积分
技术达人, 积分 8493, 距离下一级还需 1507 积分
4楼不是回答了?
主题帖子积分
高级技术员, 积分 870, 距离下一级还需 130 积分
高级技术员, 积分 870, 距离下一级还需 130 积分
主题帖子积分
专家等级:结帖率:0%
主题帖子积分
高级技术员, 积分 870, 距离下一级还需 130 积分
高级技术员, 积分 870, 距离下一级还需 130 积分
我只是确定下
谢了  好象片内flash就可以即在flash里运行程序又对Flash操作的(比如存些数据)吧?
主题帖子积分
技术达人, 积分 8493, 距离下一级还需 1507 积分
技术达人, 积分 8493, 距离下一级还需 1507 积分
主题帖子积分
专家等级:结帖率:100%
主题帖子积分
技术达人, 积分 8493, 距离下一级还需 1507 积分
技术达人, 积分 8493, 距离下一级还需 1507 积分
那些程序在片内FLASH执行,并支持IAP的,在向FLASH写数据时,已经跑到别的地方(比如ROM或RAM)去执行了。一般是在ROM固化访问片内FLASH的代码。
主题帖子积分
高级技术员, 积分 870, 距离下一级还需 130 积分
高级技术员, 积分 870, 距离下一级还需 130 积分
主题帖子积分
专家等级:结帖率:0%
主题帖子积分
高级技术员, 积分 870, 距离下一级还需 130 积分
高级技术员, 积分 870, 距离下一级还需 130 积分
ROM不就是FLASH吗???
首先,ROM不就是FLASH吗???其次,也就是若有片内FLASH的芯片,在出厂时IAP指令已固化在FLASH里某个位置,并在芯片手册上注明IAP其操作函数,而片外没的,只能自几想办法编程FLASH,对不?
主题帖子积分
高级技术员, 积分 870, 距离下一级还需 130 积分
高级技术员, 积分 870, 距离下一级还需 130 积分
主题帖子积分
专家等级:结帖率:0%
主题帖子积分
高级技术员, 积分 870, 距离下一级还需 130 积分
高级技术员, 积分 870, 距离下一级还需 130 积分
自几先顶下!~
主题帖子积分
主题帖子积分
专家等级:结帖率:95%打赏:0.00受赏:3.00
主题帖子积分
仔细读DataSheet,搞清楚数据块写时会不会影响程序块得正常
主题帖子积分
高级技术员, 积分 870, 距离下一级还需 130 积分
高级技术员, 积分 870, 距离下一级还需 130 积分
主题帖子积分
专家等级:结帖率:0%
主题帖子积分
高级技术员, 积分 870, 距离下一级还需 130 积分
高级技术员, 积分 870, 距离下一级还需 130 积分
楼上貌似答非所问..
13楼您好!我的问题在11楼,本人新手,很服浅的,看书自不会少,但总想找个高手确定下我的理解...我想这也是南哥开此板块的目的吧!另外,至于13楼你所说的,我手头的一些SST39VF160芯片资料还真没说"数据块写时会不会影响程序块得正常读",这应该算是经验或常识问题吧?重审,本人新手,万分感谢真心点拨我的贵人!!!
主题帖子积分
技术达人, 积分 8493, 距离下一级还需 1507 积分
技术达人, 积分 8493, 距离下一级还需 1507 积分
主题帖子积分
专家等级:结帖率:100%
主题帖子积分
技术达人, 积分 8493, 距离下一级还需 1507 积分
技术达人, 积分 8493, 距离下一级还需 1507 积分
引用LPC213X手册上的一句话
“Flash存储器在写或擦除操作过程中不可被访问”。下面是我的理解:如果是两片FLASH,则可以在一个FLASH上执行代码来“写和擦除”另一个FLASH。LPC2000的IAP适用于这种情况。
主题帖子积分
高级技术员, 积分 870, 距离下一级还需 130 积分
高级技术员, 积分 870, 距离下一级还需 130 积分
主题帖子积分
专家等级:结帖率:0%
主题帖子积分
高级技术员, 积分 870, 距离下一级还需 130 积分
高级技术员, 积分 870, 距离下一级还需 130 积分
感触...
其实,任何一个来这里提问的新手,其中绝大部分都是很好学很专的,肯定在拼命的啃书本,实在搞不明白才来坛子里找高手解惑的,真正的高手确实会给我们很耐心的解答,但那些来摆摆高手架子,叫嚷着让我们回去看书的就不必发言了,当然不是指13楼,别误会!!~~~~~纯萃一个新手的感悟,说的不妥请大家见谅!!!谢谢大家!!
主题帖子积分
高级技术员, 积分 870, 距离下一级还需 130 积分
高级技术员, 积分 870, 距离下一级还需 130 积分
主题帖子积分
专家等级:结帖率:0%
主题帖子积分
高级技术员, 积分 870, 距离下一级还需 130 积分
高级技术员, 积分 870, 距离下一级还需 130 积分
难实现啊..
谢楼上,那干脆一片FLASH上执行用户代码,另一片FLASH存我的图象数据,乞不是更方便,不过这种事也只能在开发板上玩玩,理想化了...15楼意思我没明白,我开发板上LPC2210没片内FLASH,片外FLASH也就没IAP了啊??
主题帖子积分
中级工程师, 积分 4950, 距离下一级还需 50 积分
中级工程师, 积分 4950, 距离下一级还需 50 积分
主题帖子积分
专家等级:结帖率:100%
主题帖子积分
中级工程师, 积分 4950, 距离下一级还需 50 积分
中级工程师, 积分 4950, 距离下一级还需 50 积分
EASYARM上有现成的免费redboot测试代码,
&&&&你用JTAG烧写到片外flash里就可以了。redboot可以自动管理内核、数据,你在同一片flash上就可以同时烧录程序和数据。redboot负责自动分配存储空间,并组织成文件目录格式。一试便知。&&&&免费下载中心。“RedBoot&for&EASYARM2200”
主题帖子积分
高级技术员, 积分 870, 距离下一级还需 130 积分
高级技术员, 积分 870, 距离下一级还需 130 积分
主题帖子积分
专家等级:结帖率:0%
主题帖子积分
高级技术员, 积分 870, 距离下一级还需 130 积分
高级技术员, 积分 870, 距离下一级还需 130 积分
新手迷惑..
刚知道“Flash存储器在写或擦除操作过程中不可被访问”...马上又有人来告诉我这种违背"真理"的事啊??  慌!~
主题帖子积分
高级工程师, 积分 7919, 距离下一级还需 81 积分
高级工程师, 积分 7919, 距离下一级还需 81 积分
主题帖子积分
专家等级:结帖率:33%
主题帖子积分
高级工程师, 积分 7919, 距离下一级还需 81 积分
高级工程师, 积分 7919, 距离下一级还需 81 积分
1、支持4楼;2、写Flash需要时间,这段时间内,不能读取里面的数据;3、用操作系统,都有现成的bootloader,不需要你自己去实现;
时间类勋章
精英会员奖章
等级类勋章
奔腾之江水
发帖类勋章
技术高手奖章
人才类勋章
核心会员奖章
等级类勋章
坚毅之洋流
发帖类勋章
时间类勋章
技术导师奖章
人才类勋章
终身成就奖章
等级类勋章
技术领袖奖章
人才类勋章
时间类勋章
无冕之王奖章
等级类勋章
沉静之湖泊
发帖类勋章
热门推荐 /32010年9月 硬件/嵌入开发大版内专家分月排行榜第二2010年8月 硬件/嵌入开发大版内专家分月排行榜第二2010年3月 硬件/嵌入开发大版内专家分月排行榜第二2010年2月 硬件/嵌入开发大版内专家分月排行榜第二2010年1月 硬件/嵌入开发大版内专家分月排行榜第二2009年11月 硬件/嵌入开发大版内专家分月排行榜第二
2010年5月 硬件/嵌入开发大版内专家分月排行榜第三2010年4月 硬件/嵌入开发大版内专家分月排行榜第三2009年12月 硬件/嵌入开发大版内专家分月排行榜第三2009年10月 硬件/嵌入开发大版内专家分月排行榜第三
2010年9月 硬件/嵌入开发大版内专家分月排行榜第二2010年8月 硬件/嵌入开发大版内专家分月排行榜第二2010年3月 硬件/嵌入开发大版内专家分月排行榜第二2010年2月 硬件/嵌入开发大版内专家分月排行榜第二2010年1月 硬件/嵌入开发大版内专家分月排行榜第二2009年11月 硬件/嵌入开发大版内专家分月排行榜第二
2010年5月 硬件/嵌入开发大版内专家分月排行榜第三2010年4月 硬件/嵌入开发大版内专家分月排行榜第三2009年12月 硬件/嵌入开发大版内专家分月排行榜第三2009年10月 硬件/嵌入开发大版内专家分月排行榜第三
本帖子已过去太久远了,不再提供回复功能。本词条由华强电子网用户提供,如果涉嫌侵权,请与我们客服联系,我们核实后将及时处理。
NOR FLASH是INTEL在1988年推出的一款商业性闪存芯片,它需要很长的时间进行抹写,大半生它能够提供完整的寻址与数据总线,并允许随机存取存储器上的任何区域,而且它可以忍受一万次到一百万次抹写循环,是早期的可移除式闪存储媒体的基础。
NOR Flash的访问方式
在NOR FLASH的读取数据的方式来看,它与RAM的方式是相近的,只要能够提供数据的地址,数据总线就能够正确的挥出数据。考虑到以上的种种原因,多数微处理器将NOR FLASH当做原地运行(Execute in place,XIP)存储器使用,这其实以为着存储在NOR FLASH上的程序不需要复制到RAM就可以直接运行。由于NOR FLASH没有本地坏区管理,所以一旦存储区块发生毁损,软件或驱动程序必须接手这个问题,否则可能会导致设备发生异常。 在解锁、抹除或写入NOR FLASH区块时,特殊的指令会先写入已绘测的记忆区的第一页(Page)。接着快闪记忆芯片会提供可用的指令清单给实体驱动程序,而这些指令是由一般性闪存接口(Commmemory Interface, CFI)所界定的。 与用于随机存取的ROM不同,NOR FLASH也可以用在存储设备上;不过与NAND FLASH相比,NOR FLASH的写入速度一般来说会慢很多。
NOR Flash的烧写方式
相对于硬件工程师和嵌入式软件工程师一般在完成设计之后常常需要验证FLASH是否在工作。在应用当中,也有很多时候需要对FLASH进行写操作。该文章简单介绍了基于ARM芯片的NOR FLASH烧写,并提供了2个具体的实例和源代码,希望对有需要的朋友有点帮助。在开始之前,先声明一下,这篇文章只是介绍了如何写 NOR FLASH 的烧写驱动,和H-JTAG/H-FLASHER没有直接的联系。在后面的介绍里,如无特别说明,处理器指的是 ARM 处理器,FLASH 指的都是 NOR FLASH。另外,BYTE 指的是8-BIT的数据单元,HALF-WORD代表的是16-BIT的数据单元,而WORD 则代表了32-BIT的数据单元。1。 NOR FLASH 的简单介绍NOR FLASH 是很常见的一种存储芯片,数据掉电不会丢失。NOR FLASH支持Execute ON Chip,即程序可以直接在FLASH片内执行。这点和NAND FLASH不一样。因此,在嵌入是系统中,NOR FLASH很适合作为启动程序的存储介质。NOR FLASH的读取和RAM很类似,但不可以直接进行写操作。对NOR FLASH的写操作需要遵循特定的命令序列,最终由芯片内部的控制单元完成写操作。从支持的最小访问单元来看,NOR FLASH一般分为 8 位的和16位的(当然,也有很多NOR FLASH芯片同时支持8位模式和是16 位模式,具体的工作模式通过特定的管脚进行选择) 。 对8位的 NOR FLASH芯片,或是工作在8-BIT模式的芯片来说,一个地址对应一个BYTE(8-BIT)的数据。例如一块8-BIT的NOR FLASH,假设容量为4个 BYTE。那芯片应该有8个数据信号D7-D0 和2个地址信号,A1-A0。地址0x0对应第0个 BYTE,地址0x1对应于第1BYTE,地址0x2对应于第2个 BYTE,而地址0x3则对应于第3 个BYTE对16位的 NOR FLASH芯片,或是工作在16-BIT模式的芯片来说,一个地址对应于一个HALF-WORD(16-BIT)的数据。例如,一块16-BIT的 NOR FLASH,假设其容量为4个BYTE。那芯片应该有16 个数据信号线D15-D0 和1个地址信号A0。地址 0x0对应于芯片内部的第0个 HALF-WORD,地址0x1对应于芯片内部的第1个 HALF-WORD。 FLASH一般都分为很多个SECTOR,每个SECTOR包括一定数量的存储单元。对有些大容量的FLASH,还分为不同的BANK,每个BANK包括一定数目的SECTOR。FLASH的擦除操作一般都是以SECTOR,BANK或是整片FLASH为单位的。在对FLASH进行写操作的时候,每个BIT可以通过编程由1变为0,但不可以有0修改为1。为了保证写操作的正确性,在执行写操作前,都要执行擦除操作。擦除操作会把FLASH的一个SECTOR,一个BANK或是整片FLASH 的值全修改为0xFF。这样,写操作就可以正确完成了。2。 ARM 处理器的寻址ARM 可以说是目前最流行的32位嵌入式处理器。在这里只提一下 ARM 处理器的寻址,为后面做个铺垫。从处理器的角度来看,系统中每个地址对应的是一个BYTE的数据单元。这和很多别的处理器都是一样的。3。& 处理器和 NOR FLASH 的硬件连接从前面的介绍,我们知道从处理器的角度来看,每个地址对应的是一个 BYTE 的数据单元。而,NOR FLASH 的每个地址有可能对应的是一个BYTE的数据单元,也有可能对应的是一个HALF-WORD的数据单元。所以在硬件设计中,连接ARM处理器和 NOR FLASH时,必须根据实际情况对地址信号做特别的处理。如果ARM处理器外部扩展的是8-BIT的NOR FLASH, 数据线和地址线的连接应该如图1所示。 从图中我们可以看到,处理器的数据信号D0-D7和 FLASH的数据信号D0-D7是一一对应连接的,处理器的地址信号A0-An和NOR FLASH的地址信号A0-An 也是一一对应连接的。如果ARM处理器外部扩展的是16-BIT的NOR FLASH, 数据线必须要错位连接。 图2给了一个ARM处理器和16-BITNOR& FLASH 的连接示意图。如图2所示,ARM处理器的数据信号D0-D15和FLASH 的数据信号D0-D15是一一对应的。而ARM处理器的地址信号和NOR FLASH 的地址信号是错位连接的,ARM的 A0悬空,ARM 的A1 连接FLASH 的A0,ARM 的A2连接FLASH 的A1,依次类推。需要错位连接的原因是:ARM处理器的每个地址对应的是一个BYTE 的数据单元,而 16-BIT 的 FLASH 的每个地址对应的是一个 HALF-WORD(16-BIT)的数据单元。为了保持匹配,所以必须错位连接。这样,从ARM处理器发送出来的地址信号的最低位A0对16-BIT FLASH来说就被屏蔽掉了。补充说明:1。& 一般来说,ARM处理器内部要设置相应的寄存器,告诉处理器外部扩展的FLASH的位宽(8-BIT/16-BIT/32-BIT) 。这样,处理器才知道在访问的时候如何从FLASH正确的读取数据。2。& 有些ARM处理器内部可以设置地址的错位。对于支持软件选择地址错位的处理器,在连接16-BIT FLASH的时候,硬件上可以不需要把地址线错位。读者设计的时候,请参考MCU的数据手册,以手册为准,以免造成不必要的麻烦。3。& 如果处理器支持内部设置地址错位,在实际访问的时候,送出的地址实际上是在MCU内部做了错位处理,其作用是等效于硬件连接上的错位的。上面的描述可能比较抽象,下面让我们来看2个 ARM处理器访问16-BIT FLASH的例子:例子 1:ARM处理器需要从地址 0x0 读取一个 BYTE1 - ARM处理器在地址线An-A0上送出信号0x0;2 – 16-BIT FLASH在自己的地址信号An-A0上看到的地址是0x0,然后将地址0x0对应的16-BIT数据单元输出到D15-D0上;3 – ARM处理器知道访问的是16-BIT的FLASH,从D7-D0上读取所需要的一个BYTE的数据;例子 2:ARM处理器需要从地址 0x1 读取一个 BYTE1 - ARM处理器在地址线An-A0上送出信号0x1;2 – 16-BIT FLASH在自己的地址信号An-A0上看到的地址依然是0x0, 然后将地址0x0对应的16-BIT数据单元输出到D15-D0上;3 –ARM处理器知道访问的是16-BIT的FLASH,从D15-D8 上读取所需要的一个BYTE 的数据;4。& 从软件角度来看 ARM 处理器和 NOR FLASH 的连接在上一个小节里,我们简单了解了 ARM 处理器和 FLASH 的硬件连接。在这个小节里面,我们从软件的角度来理解ARM处理器和 FLASH的连接。对于8-BIT的FLASH的连接,很好理解,因为ARM处理器和8-BIT FLASH的每个地址对应的都是一个 BYTE 的数据单元。所以地址连接毫无疑问是一一对应的。如果 ARM 处理器连接的是 16-BIT 的处理器,因为 ARM 处理器的每个地址对应的是一个 BYTE 的数据单元,而 16-BIT FLASH 的每个地址对应的是一个 HALF-WORD 的16-BIT的数据单元。所以,也毫无疑问,ARM处理器访问16-BIT处理器的时候,地址肯定是要错开一位的。在写FLASH驱动的时候,我们不需要知道地址错位是由硬件实现的,还是是通过设置ARM处理器内部的寄存器来实现的,只需要记住2点:1 – ARM处理器访问8-BIT FLASH的时候,地址是一一对应的;2 – ARM处理器访问16-BIT FLASH的时候,地址肯定是错位的。这一点对理解后面的例子会很有帮助。5。 8-BIT FLASH 烧写驱动实例 - HY29F040HY29F040是现代公司的一款8-BIT的NOR FLASH。在这个小节里,我们以这个芯片为例子,介绍如何对8-BIT NOR FLASH进行操作。HY29F040的容量为512K-BYTE,总共包括8 个SECTOR,每个SECTOR 的容量是64K-BYTE。该芯片支持SECTOR擦除,整片擦除和以BYTE 为基本单位的写操作。HY29F040的命令定义如表-1所示。下面,我们来看看如何实现基本的擦除和编程操作。在本节后面的描述中,我们使用了下面的2 个定义:U32&&&&&&&&&&&&& //该变量用来表示 FLASH 的起始地址#define SysADDR8(sysbase, offset)&&& ((volatile U8*)(sysbase)+(offset))&& //用来方便对指定的 FALSH 地址进行操作先解释一下 SysAddr8 的定义。这个宏定义了一个 BYTE(8-BIT)指针,其地址为(sysbase + offset)。假设 FLASH 的起始地址为0x,如果要将0xAB写到FLASH的第一个BYTE中去,可以用下面的代码:*SysAddr8(0x, 0x1) = 0xAB;注意:在本节后面的描述中,SYSBASE代表的是 FLASH的起始地址,而SysAddr8中的OFFSET则代表了相对于FLASH起始地址的BYTE偏移量。OFFSET也是8-BIT FLASH在自己的地址信号An-A0上看到的地址。整片擦除操作整片擦除操作共需要6个周期的总线写操作1 – 将 0xAA写到 FLASH 地址 0x55552 – 将 0x55 写到 FLASH 地址 0x2AAA3 – 将 0x80 写到 FLASH 地址 0x55554 – 将 0xAA写到 FLASH 地址 0x55555 – 将 0x55 写到 FLASH 地址 0x2AAA6 – 将 0x10 写到 FLASH 地址 0x5555对应的代码:*SysAddr8(sysbase, 0x5555) = 0xAA;&&& //将值 0xAA写到 FLASH 地址 0x5555*SysAddr8(sysbase, 0x2AAA) = 0x55;&&& //将值 0x55 写到 FLASH 地址 0x2AAA*SysAddr8(sysbase, 0x5555) = 0x80;&&& //将值 0x80 写到 FLASH 地址 0x5555*SysAddr8(sysbase, 0x5555) = 0xAA;&&& //将值 0xAA写到 FLASH 地址 0x5555*SysAddr8(sysbase, 0x2AAA) = 0x55;&&& //将值 0x55 写到 FLASH 地址 0x2AAA*SysAddr8(sysbase, 0x5555) = 0x10;&&& //将值 0x10 写到 FLASH 地址 0x5555SECTOR 擦除操作SECTOR的擦除操作共需要6个周期的总线写操作1 – 将 0xAA写到 FLASH 地址 0x55552 – 将 0x55 写到 FLASH 地址 0x2AAA3 – 将 0x80 写到 FLASH 地址 0x55554 – 将 0xAA写到 FLASH 地址 0x55555 – 将 0x55 写到 FLASH 地址 0x2AAA6 – 将 0x30 写到要擦除的 SECTOR 对应的地址对应的代码:*SysAddr8(sysbase, 0x5555) = 0xAA;&&& //将值 0xAA写到 FLASH 地址 0x5555*SysAddr8(sysbase, 0x2AAA) = 0x55;&&& //将值 0x55 写到 FLASH 地址 0x2AAA*SysAddr8(sysbase, 0x5555) = 0x80;&&& //将值 0x80 写到 FLASH 地址 0x5555*SysAddr8(sysbase, 0x5555) = 0xAA;&&& //将值 0xAA写到 FLASH 地址 0x5555*SysAddr8(sysbase, 0x2AAA) = 0x55;&&& //将值 0x55 写到 FLASH 地址 0x2AAA*SysAddr8(sysbase, addr) = 0x30;&&&& //将值 0x30 写到要擦除的 SECTOR 对应的地址BYTE 编程操作写一个BYTE 的数据到FLASH中去,需要 4个周期的总线写操作1 – 将 0xAA写到 FLASH 地址 0x55552 – 将 0x55 写到 FLASH 地址 0x2AAA3 – 将 0xA0 写到 FLASH 地址 0x55554 – 将编程数据(BYTE)写到对应的编程地址上去对应的代码:*SysAddr8(sysbase, 0x5555) = 0xAA;&&& //将值 0xAA写到 FLASH 地址 0x5555*SysAddr8(sysbase, 0x2AAA) = 0x55;&&& //将值 0x55 写到 FLASH 地址 0x2AAA*SysAddr8(sysbase, 0x5555) = 0xA0;&&& //将值 0xA0 写到 FLASH 地址 0x5555*SysAddr8(sysbase, addr) =&&&&& //将一个 BYTE的数据写到期望的地址6。 16-BIT FLASH 烧写驱动实例 - SST39VF160SST39VF160是SST公司的一款16-BIT的NOR FLASH。 在这个小节里, 我们以SST39VF160为例子, 介绍如何对16-BIT NOR FLASH进行操作。对8-BIT FLASH的操作很好理解,但对16-BIT FLASH的操作理解起来要晦涩很多。我尽力描述得清楚些。SST39VF160的容量为2M-BYTE , 总共包括512个SECTOR, 每个SECTOR 的容量是4K-BYTE。 该芯片支持SECTOR擦除,整片擦除和以 HALF-WORD 为基本单位的写操作。SST39VF160 的命令定义如表-2 所示。在表 2 中,因为所有命令都是从FLASH的角度来定义的。 所以,&& 所有的地址都是HALF-WORD地址, 指的是16-BIT FLASH在自己的地址信号An-A0上看到的地址。在本节后面的描述中,我们使用了下面的2个定义:U32&&&&&&&&&&&&& //该变量用来表示 FLASH 的起始地址#define SysAddr16(sysbase, offset)& ((volatile U16*)(sysbase)+(offset))& //用来方便对指定的 FALSH 地址进行操作SysAddr16(sysbase,& offset)首先定义了一个16-BIT& HALF-WORD的指针,指针的地址为sysbase,然后根据offset做个偏移操作。 因为HALF-WORD指针的地址是2个BYTE对齐的, 所以每个偏移操作会使得地址加2。& 最终, SysAddr16 (sysbase, offset)相当于定义了一个HALF-WORD的指针,其最终地址为(sysbase& +& 2offset) 。在使用SysAddr16 的时候,将sysbase设置成 FLASH 的起始地址,offset 则可以理解为相对于 FLASH 起始地址的 HALF-WORD 偏移量或是偏移地址。假设 FLASH 的起始地址为 0x,SysAddr16(0x, 0)指向 16-BIT FLASH 的第 0 个 HALF-WORD, SysAddr16(0x, 1指向16-BIT FLASH的第1 个HALF-WORD。依次类推。如果要将0xABCD分别写到FLASH 的第0个和第 1个HALF-WORD 中去,可以用下面的代码:*SysAddr16(0x, 0x0) = 0xABCD;*SysAddr16(0x, 0x1) = 0xABCD;接下来,我们分别从ARM处理器的角度和FLASH的角度来具体分析一下。从 ARM 的角度来看:假设 FLASH 的起始地址为 0x,因为 ARM 处理器知道 FLASH 的地址空间为 0x ~ (0x +FLASH容量 –& 1),所以在对这个地址空间进行访问的时候,会设置好FLASH的片选信号,并将低位的地址输出到 地址信号上。以*SysAddr16(0x, 0x1) = 0xABCD 为例。从ARM 处理器的角度来看,该操作是把0xABCD写到地址0x上去。所以ARM处理器最终会在它的地址信号An-A0输出地址0x2,同时会在D15-D0 上输出0xABCD。从 FLASH 的角度来看:还是以& *SysAddr16(0x, 0x1) = 0xABCD 为例,FLASH看到的地址是多少呢?接着分析。ARM 处理器在执行操作的时候,会设置好相应的FLASH片选使能信号,并在ARM的地址信号An-A0上输出 0x2。因为 ARM和 16-BIT FLASH的地址信号的连接是错开一位的, 所以, FLASH最终在自己的地址An-A0上看到的信号是0x1, 相当于将ARM处理器输出的地址往右做了一个移位操作,刚好对应的是FLASH的第1 个HALF-WORD。同时,FLASH会在自己的D15-D0上看到数据0xABCD。通过上面的分析,我们知道 SysAddr16 中指定的 offset 的值就是 16-BIT FLASH 在自己的地址 An-A0 上看到的值。所以,我们可以很方便的通过 SysAddr16(sysbase, offset) 对 FLASH 进行操作,其中 sysbase 代表 FLASH 起始地址,offset 则代表了FLASH 的第几个HALF-WORD(HALF-WORD偏移量或偏移地址) 。注意:1。 在本节后面的描述中,SysAddr16中的 SYSBASE代表的是FLASH的起始地址,而SysAddr16中的 OFFSET则代表了相对于FLASH起始地址的 HALF-WORD 偏移量或偏移地址。OFFSET 的值也是16-BIT FLASH在自己的地址信号An-A0上看到的值。2。在SST39VF160的命令定义中,所有的地址都是针对FLASH的HALF-WORD地址,指的是在FLASH自己的地址信号An-A0上看到的地址。整片擦除操作整片擦除操作共需要6个周期的总线写操作1 – 将 0x00AA写到 FLASH HALF-WORD 地址 0x55552 – 将 0x0055 写到 FLASH HALF-WORD地址 0x2AAA3 – 将 0x0080 写到 FLASH HALF-WORD地址 0x55554 – 将 0x00AA写到 FLASH HALF-WORD 地址 0x55555 – 将 0x0055 写到 FLASH HALF-WORD地址 0x2AAA6 – 将 0x0010 写到 FLASH HALF-WORD地址 0x5555对应的代码:*SysAddr16(sysbase, 0x5555) = 0x00AA;&&& //将值 0x00AA 写到 FLASH HALF-WORD地址 0x5555*SysAddr16(sysbase, 0x2AAA) = 0x0055;&&& //将值 0x0055 写到 FLASH HALF-WORD地址 0x2AAA*SysAddr16(sysbase, 0x5555) = 0x0080;&&& //将值 0x0080 写到 FLASH HALF-WORD地址 0x5555*SysAddr16(sysbase, 0x5555) = 0x00AA;&&& //将值 0x00AA 写到 FLASH HALF-WORD地址 0x5555*SysAddr16(sysbase, 0x2AAA) = 0x0055;&&& //将值 0x0055 写到 FLASH HALF-WORD地址 0x2AAA*SysAddr16(sysbase, 0x5555) = 0x0010;&&& //将值 0x0010 写到 FLASH HALF-WORD地址 0x5555SECTOR 擦除操作SECTOR的擦除操作共需要6个周期的总线写操作1 – 将 0x00AA写到 FLASH HALF-WORD 地址 0x55552 – 将 0x0055 写到 FLASH HALF-WORD地址 0x2AAA3 – 将 0x0080 写到 FLASH HALF-WORD地址 0x55554 – 将 0x00AA写到 FLASH HALF-WORD 地址 0x55555 – 将 0x0055 写到 FLASH HALF-WORD地址 0x2AAA6 – 将 0x0030 写到要擦除的 SECTOR 对应的 HALF-WORD地址对应的代码:*SysAddr16(sysbase, 0x5555) = 0x00AA;&&& //将值 0x00AA 写到 FLASH HALF-WORD地址 0x5555*SysAddr16(sysbase, 0x2AAA) = 0x0055;&&& //将值 0x0055 写到 FLASH HALF-WORD地址 0x2AAA*SysAddr16(sysbase, 0x5555) = 0x0080;&&& //将值 0x0080 写到 FLASH HALF-WORD地址 0x5555*SysAddr16(sysbase, 0x5555) = 0x00AA;&&& //将值 0x00AA 写到 FLASH HALF-WORD地址 0x5555*SysAddr16(sysbase, 0x2AAA) = 0x0055;&&& //将值 0x0055 写到 FLASH HALF-WORD地址 0x2AAA*SysAddr16(sysbase, addr && 1) = 0x0030;&&& //将值 0x0030 写到要擦除的 SECTOR 对应的HALF-WORD地址注意:上面的代码中第6个操作周期中的ADDR 是从ARM处理器的角度来看的BYTE地址,因为在擦除的时候,用户希望指定的是从 ARM 的角度看到的地址,这样更方便和更直观。而在 SysAddr16 的宏定义中,OFFSET 表示的是相对于FLASH起始地址的 HALF-WORD 偏移量,或是FLASH在自己的地址信号An-A0上看到的地址。所以需要执行一个右移操作,把ADDR转换成 HALF-WORD 地址。举例说明,SST39VF160 每个 SECTOR 的大小是 4K-BYTE。从 ARM 处器的角度和用户的角度来看,SECTOR-0 相对于FLASH起始地址的BYTE地址是0x0;从FLASH来看SECTOR-0 的HALF-WORD地址是0x0。从ARM处理器的角度和用户的角度来看, FLASH SECTOR-1相对于FLASH起始地址的BYTE地址0x1000; 从FLASH来看, SECTOR-1的HALF-WORD地址应该是(0x1000 && 1) = 0x800。如果要擦除SECTOR-0,上面代码的第6条指令应该是:*SysAddr16(sysbase, 0x0 && 1) = 0x0030;如果要擦除SECTOR-1,上面代码的第6条指令应该是:*SysAddr16(sysbase, 0x1000 && 1) = 0x0030;HALF-WORD 编程操作写一个HALF-WORD的数据到FLASH中去,需要4个周期的总线写操作1 – 将 0x00AA写到 FLASH HALF-WORD 地址 0x55552 – 将 0x0055 写到 FLASH HALF-WORD地址 0x2AAA3 – 将 0x00A0 写到 FLASH HALF-WORD 地址 0x55554 – 将编程数据(HALF-WORD)写到对应的 HALF-WORD地址对应的代码:*SysAddr16(sysbase, 0x5555) = 0x00AA;&&&&& //将值 0x00AA 写到 FLASH 地址 0x5555*SysAddr16(sysbase, 0x2AAA) = 0x0055;&&&&& //将值 0x0055 写到 FLASH 地址 0x2AAA*SysAddr16(sysbase, 0x5555) = 0x00A0;&&&&& //将值 0x00A0 写到 FLASH 地址 0x5555*SysAddr16(sysbase, addr && 1) =&&&&& //将数据写到对应的 HALF-WORD 地址注意:上面的代码中第4个操作周期中的ADDR是从ARM处理器的角度来看的BYTE地址, 因为在执行写操作的时候,用户希望指定的是从 ARM 的角度看到的地址,这样会更方便和更直观。而在 SysAddr16 的宏定义中,OFFSET表示的是相对于FLASH起始地址的HALF-WORD偏移量。 所以需要执行一个右移操作, 把它转换成HALF-WORD地址。举例说明,如果要数据 0x0123 写到地址 0x0 去,对应的是 FLASH 的第 0 个 HAFL-WORD,对应的 HALF-WORD 地址应该是0x0,上面代码的第4条指令应该是:*SysAddr16(sysbase, 0x0 && 1) = 0x0123;如果要数据0x4567写到地址0x2去, 对应的是FLASH的第1个 HALF-WORD, 对应的HALF-WORD地址应该是0x1, 上面代码的第4条指令应该是:*SysAddr16(sysbase, 0x2 && 1) = 0x4567;如果要数据0x89AB写到地址0x4去, 对应的是FLASH的第2个HALF-WORD, 对应的HALF-WORD地址应该是0x2,上面代码的第4条指令应该是:*SysAddr16(sysbase, 0x4 && 1) = 0x89AB;如果要数据 0xCDEF 写到地址 0x6 去,对应的是 FLASH 的第 3 个 HALF-WORD,对应的 HALF-WORD 地址应该是0x3,上面代码的第4条指令应该是:*SysAddr16(sysbase, 0x6 && 1) = 0xCDEF;7。 ADS 版源代码下载如果用户有需要,可以去下载在前面讨论的 2 个实例的 ADS 版的完整源代码和 FLASH 数据手册。提供给用户的程序都是在实际使用过程中经过测试的。源代码只供用户参考,并不一定能直接使用在用户的开发板上。用户需要根据自己实际使用的芯片进行相应的修改。8。 结束语这篇文章简单介绍了如何对NOR FLASH进行操作, 但没有包括状态查询, 保护等其他操作。 对于更复杂的多片FLASH并联的情况也没有讨论。有需要的朋友可以自己去研究。
NOR Flash的原理
从物理层面解释,NOR闸闪存的每个存储单元类似一个标准,除了晶体管有两个而不是一个闸极。在顶部的是控制闸(CONTROL Gate,CG),它的徐阿奴阿布是土匪以氧化物层与周遭绝缘的浮闸(Floathing Gate,FG)。由于这个FG在电气程度上是出于绝缘层独立的,所以湖边人员的毒啊班组会被困在里面,在一般的条件下,电荷经过很长时间都不会产生逃逸的情况。将FG放在CG与MOSFET通道之间。当FG抓到电荷时,它部分屏蔽掉来自CG的电场,并改变这个单元的阀电压(VT)。在读出期间。利用向CG的电压,MOSFET通道会变的导电或保持绝缘。这视乎该单元的VT而定(而该单元的VT受到FG上的电荷控制)。这股电流流过MOSFET通道,并以二进制码的方式读出、再现存储的数据。在每单元存储1位以上的数据的MLC设备中,为了能够更精确的测定FG中的电荷位准,则是以感应电流的量(而非单纯的有或无)达成的。逻辑上,单层NOR FLASH单元在默认状态代表二进制码中的"1"值,因为在以特定的电压值控制闸极时,电流会流经通道。经由以下流程,NOR FLASH 单元可以被设置为二进制码中的"0"值。1。 对CG施加高电压(通常大于5V)。2。 现在通道是开的,所以电子可以从源极流入汲极(想像它是NMOS晶体管)。3。 源-汲电流够高了,足以导致某些高能电子越过绝缘层,并进入绝缘层上的FG,这种过程称为热电子注入。由于汲极与CG间有一个大的、相反的极性电压,借由量子穿隧效应可以将电子拉出FG,所以能够地用这个特性抹除NOR FLASH单元(将其重设为"1"状态)。现代的NOR FLASH芯片被分为若干抹除片段(常称为区扇(Blocks or sectors)),抹除操作只能以这些区块为基础进行;所有区块内的记忆单元都会被一起抹除。不过一般而言,写入NOR FLASH单元的动作却可以单一字节的方式进行。虽然抹写都需要高电压才能进行,不过实际上现今所有闪存芯片是借由芯片内的电荷帮浦产生足够的电压,所以只需要一个单一的电压供应即可。
浏览次数:8550次
深圳市灿新电子经营部
深圳市祺鑫华特电子商行
深圳市祺鑫华特电子商行
深圳市祺鑫华特电子商行
深圳市祺鑫华特电子商行

我要回帖

更多关于 将数据写入串口 的文章

 

随机推荐