日韩欧美国产极速不卡一区,国产手机视频在线观看尤物,国产亚洲欧美日韩蜜芽一区,亚洲精品国产免费,亚洲二区三区无码中文,A大片亚洲AV无码一区二区三区,日韩国语国产无码123

您好,歡迎來(lái)到維�(kù)電子市場(chǎng)�(wǎng) 登錄 | 免費(fèi)注冊(cè)

NOR Flash
閱讀�34430�(shí)間:2011-01-27 10:20:24

  NOR FLASH是INTEL�1988年推出的一款商�(yè)�閃存芯片,它需要很�(zhǎng)的時(shí)間�(jìn)行抹�(xiě),大半生它能夠提供完整的尋址與數(shù)�(jù)總線,并允許隨機(jī)存取存儲(chǔ)�上的任何區(qū)域,而且它可以忍受一�(wàn)次到一百萬(wàn)次抹�(xiě)循環(huán),是早期的可移除式閃存儲(chǔ)媒體的基�(chǔ)�

訪問(wèn)方式

  在NOR FLASH的讀取數(shù)�(jù)的方式來(lái)�,它與RAM的方式是相近的,只要能夠提供�(shù)�(jù)的地址,數(shù)�(jù)總線就能夠正確的揮出�(shù)�(jù)。考慮到以上的種種原因,多�(shù)微處理器將NOR FLASH�(dāng)做原地運(yùn)�(Execute in place,XIP)存儲(chǔ)器使�,這其�(shí)以為著存�(chǔ)在NOR FLASH上的程序不需要復(fù)制到RAM就可以直接運(yùn)�。由于NOR FLASH�(méi)有本地壞區(qū)管理,所以一旦存�(chǔ)區(qū)塊發(fā)生毀損,軟件或驅(qū)�(dòng)程序必須接手這�(gè)�(wèn)�,否則可能會(huì)�(dǎo)致設(shè)備發(fā)生異常� 在解�、抹除或?qū)懭隢OR FLASH區(qū)塊時(shí),特殊的指令�(huì)先寫(xiě)入已繪測(cè)的記憶區(qū)的頁(yè)(Page)。接著快閃記憶芯片會(huì)提供可用的指令清單給�(shí)體驅(qū)�(dòng)程序,而這些指令是由一般性閃存接�(CommON FLASH memory Interface� CFI)所界定�� 與用于隨�(jī)存取的ROM不同,NOR FLASH也可以用在存�(chǔ)�(shè)備上;不過(guò)與NAND FLASH相比,NOR FLASH的寫(xiě)入速度一般來(lái)�(shuō)�(huì)慢很多�

燒寫(xiě)方式

  相對(duì)于硬件工程師和嵌入式軟件工程師一般在完成�(shè)�(jì)之后常常需要驗(yàn)證FLASH是否在工�。在�(yīng)用當(dāng)�,也有很多時(shí)候需要對(duì)FLASH�(jìn)行寫(xiě)操作。該文章�(jiǎn)單介紹了基于ARM芯片的NOR FLASH燒寫(xiě),并提供�2�(gè)具體的實(shí)例和源代碼,希望�(duì)有需要的朋友有點(diǎn)幫助。在�(kāi)始之前,先聲明一�,這篇文章只是介紹了如何寫(xiě) NOR FLASH 的燒�(xiě)�(qū)�(dòng),和H-JTAG/H-FLASHER�(méi)有直接的�(lián)系�

  在后面的介紹�,如�(wú)特別�(shuō)�,處理器指的� ARM 處理器,F(xiàn)LASH 指的都是 NOR FLASH。另外,BYTE 指的�8-BIT的數(shù)�(jù)單元,HALF-WORD代表的是16-BIT的數(shù)�(jù)單元,而WORD 則代表了32-BIT的數(shù)�(jù)單元�

  1� NOR FLASH 的簡(jiǎn)單介�

  NOR FLASH 是很常見(jiàn)的一種存�(chǔ)芯片,數(shù)�(jù)掉電不會(huì)丟失。NOR FLASH支持Execute ON Chip,即程序可以直接在FLASH片內(nèi)�(zhí)�。這點(diǎn)和NAND FLASH不一�。因此,在嵌入是系統(tǒng)�,NOR FLASH很適合作為啟�(dòng)程序的存�(chǔ)介質(zhì)�

  NOR FLASH的讀取和RAM很類�,但不可以直接�(jìn)行寫(xiě)操作。對(duì)NOR FLASH的寫(xiě)操作需要遵循特定的命令序列,最終由芯片�(nèi)部的控制單元完成�(xiě)操作。從支持的最小訪�(wèn)單元�(lái)看,NOR FLASH一般分� 8 位的�16位的(�(dāng)�,也有很多NOR FLASH芯片同時(shí)支持8位模式和�16 位模�,具體的工作模式通過(guò)特定的管腳�(jìn)行選�) � �(duì)8位的 NOR FLASH芯片,或是工作在8-BIT模式的芯片來(lái)�(shuō),一�(gè)地址�(duì)�(yīng)一�(gè)BYTE(8-BIT)的數(shù)�(jù)。例如一�8-BIT的NOR FLASH,假�(shè)容量�4�(gè) BYTE。那芯片�(yīng)該有8�(gè)�(shù)�(jù)信號(hào)D7-D0 �2�(gè)地址信號(hào),A1-A0。地址0x0�(duì)�(yīng)�0�(gè) BYTE,地址0x1�(duì)�(yīng)于第1BYTE,地址0x2�(duì)�(yīng)于第2�(gè) BYTE,而地址0x3則對(duì)�(yīng)于第3 �(gè)BYTE�(duì)16位的 NOR FLASH芯片,或是工作在16-BIT模式的芯片來(lái)�(shuō),一�(gè)地址�(duì)�(yīng)于一�(gè)HALF-WORD(16-BIT)的數(shù)�(jù)。例�,一�16-BIT� NOR FLASH,假�(shè)其容量為4�(gè)BYTE。那芯片�(yīng)該有16 �(gè)�(shù)�(jù)信號(hào)線D15-D0 �1�(gè)地址信號(hào)A0。地址 0x0�(duì)�(yīng)于芯片內(nèi)部的�0�(gè) HALF-WORD,地址0x1�(duì)�(yīng)于芯片內(nèi)部的�1�(gè) HALF-WORD� FLASH一般都分為很多�(gè)SECTOR,每�(gè)SECTOR包括一定數(shù)量的存儲(chǔ)單元。對(duì)有些大容量的FLASH,還分為不同的BANK,每�(gè)BANK包括一定數(shù)目的SECTOR。FLASH的擦除操作一般都是以SECTOR,BANK或是整片F(xiàn)LASH為單位的�

  在對(duì)FLASH�(jìn)行寫(xiě)操作的時(shí)候,每�(gè)BIT可以通過(guò)編程�1�?yōu)?,但不可以有0修改�1。為了保證寫(xiě)操作的正確�,在�(zhí)行寫(xiě)操作前,都要�(zhí)行擦除操�。擦除操作會(huì)把FLASH的一�(gè)SECTOR,一�(gè)BANK或是整片F(xiàn)LASH 的值全修改�0xFF。這樣,寫(xiě)操作就可以正確完成了�

  2� ARM 處理器的尋址

  ARM 可以�(shuō)是目前的32位嵌入式處理器。在這里只提一� ARM 處理器的尋址,為后面做�(gè)鋪墊。從處理器的角度�(lái)�,系�(tǒng)中每�(gè)地址�(duì)�(yīng)的是一�(gè)BYTE的數(shù)�(jù)單元。這和很多別的處理器都是一樣的�

  3�  處理器和 NOR FLASH 的硬件連接

  從前面的介紹,我們知道從處理器的角度�(lái)看,每�(gè)地址�(duì)�(yīng)的是一�(gè) BYTE 的數(shù)�(jù)單元。�,NOR FLASH 的每�(gè)地址有可能對(duì)�(yīng)的是一�(gè)BYTE的數(shù)�(jù)單元,也有可能對(duì)�(yīng)的是一�(gè)HALF-WORD的數(shù)�(jù)單元。所以在硬件�(shè)�(jì)中,連接ARM處理器和 NOR FLASH�(shí),必須根�(jù)�(shí)際情況對(duì)地址信號(hào)做特別的處理�

  如果ARM處理器外部擴(kuò)展的�8-BIT的NOR FLASH� �(shù)�(jù)線和地址線的連接�(yīng)該如�1所�� 從圖中我們可以看�,處理器的數(shù)�(jù)信號(hào)D0-D7� FLASH的數(shù)�(jù)信號(hào)D0-D7是一一�(duì)�(yīng)連接�,處理器的地址信號(hào)A0-An和NOR FLASH的地址信號(hào)A0-An 也是一一�(duì)�(yīng)連接��

數(shù)據(jù)線和地址線的連接圖

  如果ARM處理器外部擴(kuò)展的�16-BIT的NOR FLASH� �(shù)�(jù)線必須要�(cuò)位連接� �2給了一�(gè)ARM處理器和16-BITNOR  FLASH 的連接示意圖。如�2所�,ARM處理器的�(shù)�(jù)信號(hào)D0-D15和FLASH 的數(shù)�(jù)信號(hào)D0-D15是一一�(duì)�(yīng)�。而ARM處理器的地址信號(hào)和NOR FLASH 的地址信號(hào)是錯(cuò)位連接�,ARM� A0懸空,ARM 的A1 連接FLASH 的A0,ARM 的A2連接FLASH 的A1,依次類�。需要錯(cuò)位連接的原因是:ARM處理器的每�(gè)地址�(duì)�(yīng)的是一�(gè)BYTE 的數(shù)�(jù)單元,� 16-BIT � FLASH 的每�(gè)地址�(duì)�(yīng)的是一�(gè) HALF-WORD(16-BIT)的數(shù)�(jù)單元。為了保持匹�,所以必須錯(cuò)位連接。這樣,從ARM處理器發(fā)送出�(lái)的地址信號(hào)的位A0�(duì)16-BIT FLASH�(lái)�(shuō)就被屏蔽掉了�

一個(gè)ARM處理器和16-BITNOR  FLASH 的連接示意圖

  �(bǔ)充說(shuō)�:

  1�  一般來(lái)�(shuō),ARM處理器內(nèi)部要�(shè)置相�(yīng)的寄存器,告訴處理器外部�(kuò)展的FLASH的位�(8-BIT/16-BIT/32-BIT) 。這樣,處理器才知道在訪問(wèn)的時(shí)候如何從FLASH正確的讀取數(shù)�(jù)�

  2�  有些ARM處理器內(nèi)部可以設(shè)置地址的錯(cuò)�。對(duì)于支持軟件選擇地址�(cuò)位的處理�,在連接16-BIT FLASH的時(shí)�,硬件上可以不需要把地址線錯(cuò)位。讀者設(shè)�(jì)的時(shí)�,請(qǐng)參考MCU的數(shù)�(jù)手冊(cè),以手冊(cè)為準(zhǔn),以免造成不必要的麻煩�

  3�  如果處理器支持內(nèi)部設(shè)置地址�(cuò)位,在實(shí)際訪�(wèn)的時(shí)�,送出的地址�(shí)際上是在MCU�(nèi)部做了錯(cuò)位處�,其作用是等效于硬件連接上的�(cuò)位的�

  上面的描述可能比較抽象,下面讓我們來(lái)�2�(gè) ARM處理器訪�(wèn)16-BIT FLASH的例�:

  例子 1:ARM處理器需要從地址 0x0 讀取一�(gè) BYTE

  1 - ARM處理器在地址線An-A0上送出信號(hào)0x0;

  2 � 16-BIT FLASH在自己的地址信號(hào)An-A0上看到的地址�0x0,然后將地址0x0�(duì)�(yīng)�16-BIT�(shù)�(jù)單元輸出到D15-D0�;

  3 � ARM處理器知道訪�(wèn)的是16-BIT的FLASH,從D7-D0上讀取所需要的一�(gè)BYTE的數(shù)�(jù);

  例子 2:ARM處理器需要從地址 0x1 讀取一�(gè) BYTE

  1 - ARM處理器在地址線An-A0上送出信號(hào)0x1;

  2 � 16-BIT FLASH在自己的地址信號(hào)An-A0上看到的地址依然�0x0� 然后將地址0x0�(duì)�(yīng)�16-BIT�(shù)�(jù)單元輸出到D15-D0�;

  3 –ARM處理器知道訪�(wèn)的是16-BIT的FLASH,從D15-D8 上讀取所需要的一�(gè)BYTE 的數(shù)�(jù);

  4�  從軟件角度來(lái)� ARM 處理器和 NOR FLASH 的連接

  在上一�(gè)小節(jié)�,我們簡(jiǎn)單了解了 ARM 處理器和 FLASH 的硬件連接。在這�(gè)小節(jié)里面,我們從軟件的角度來(lái)理解ARM處理器和 FLASH的連接。對(duì)�8-BIT的FLASH的連接,很好理�,因?yàn)锳RM處理器和8-BIT FLASH的每�(gè)地址�(duì)�(yīng)的都是一�(gè) BYTE 的數(shù)�(jù)單元。所以地址連接毫無(wú)疑問(wèn)是一一�(duì)�(yīng)�。如� ARM 處理器連接的是 16-BIT 的處理器,因?yàn)?ARM 處理器的每�(gè)地址�(duì)�(yīng)的是一�(gè) BYTE 的數(shù)�(jù)單元,� 16-BIT FLASH 的每�(gè)地址�(duì)�(yīng)的是一�(gè) HALF-WORD �16-BIT的數(shù)�(jù)單元。所以,也毫�(wú)疑問(wèn),ARM處理器訪�(wèn)16-BIT處理器的�(shí)�,地址肯定是要�(cuò)�(kāi)一位的。在�(xiě)FLASH�(qū)�(dòng)的時(shí)候,我們不需要知道地址�(cuò)位是由硬件實(shí)�(xiàn)�,還是是通過(guò)�(shè)置ARM處理器內(nèi)部的寄存器來(lái)�(shí)�(xiàn)�,只需要記�2�(diǎn):

  1 � ARM處理器訪�(wèn)8-BIT FLASH的時(shí)�,地址是一一�(duì)�(yīng)�;

  2 � ARM處理器訪�(wèn)16-BIT FLASH的時(shí)�,地址肯定是錯(cuò)位的。這一�(diǎn)�(duì)理解后面的例子會(huì)很有幫助�

  5� 8-BIT FLASH 燒寫(xiě)�(qū)�(dòng)�(shí)� - HY29F040

  HY29F040是現(xiàn)代公司的一�8-BIT的NOR FLASH。在這�(gè)小節(jié)�,我們以這�(gè)芯片為例�,介紹如何對(duì)8-BIT NOR FLASH�(jìn)行操��

  HY29F040的容量為512K-BYTE,總共包�8 �(gè)SECTOR,每�(gè)SECTOR 的容量是64K-BYTE。該芯片支持SECTOR擦除,整片擦除和以BYTE 為基本單位的�(xiě)操作。HY29F040的命令定義如�-1所示�

HY29F040的命令定義表

  下面,我們來(lái)看看如何�(shí)�(xiàn)基本的擦除和編程操作。在本節(jié)后面的描述中,我們使用了下面�2 �(gè)定義:

  U32 sysbase;              //該變量用�(lái)表示 FLASH 的起始地址

  #define SysADDR8(sysbase� offset)    ((volatile U8*)(sysbase)+(offset))   //用來(lái)方便�(duì)指定� FALSH 地址�(jìn)行操�

  先解釋一� SysAddr8 的定�。這�(gè)宏定義了一�(gè) BYTE(8-BIT)指針,其地址�(sysbase + offset)。假�(shè) FLASH 的起始地址�0x10000000,如果要�0xAB�(xiě)到FLASH的�(gè)BYTE中去,可以用下面的代�:

  *SysAddr8(0x10000000� 0x1) = 0xAB;

  注意:

  在本節(jié)后面的描述中,SYSBASE代表的是 FLASH的起始地址,而SysAddr8中的OFFSET則代表了相對(duì)于FLASH起始地址的BYTE偏移�。OFFSET也是8-BIT FLASH在自己的地址信號(hào)An-A0上看到的地址�

  整片擦除操作

  整片擦除操作共需�6�(gè)周期的總線寫(xiě)操作

  1 � � 0xAA�(xiě)� FLASH 地址 0x5555

  2 � � 0x55 �(xiě)� FLASH 地址 0x2AAA

  3 � � 0x80 �(xiě)� FLASH 地址 0x5555

  4 � � 0xAA�(xiě)� FLASH 地址 0x5555

  5 � � 0x55 �(xiě)� FLASH 地址 0x2AAA

  6 � � 0x10 �(xiě)� FLASH 地址 0x5555

  �(duì)�(yīng)的代�:

  *SysAddr8(sysbase� 0x5555) = 0xAA;    //將� 0xAA�(xiě)� FLASH 地址 0x5555

  *SysAddr8(sysbase� 0x2AAA) = 0x55;    //將� 0x55 �(xiě)� FLASH 地址 0x2AAA

  *SysAddr8(sysbase� 0x5555) = 0x80;    //將� 0x80 �(xiě)� FLASH 地址 0x5555

  *SysAddr8(sysbase� 0x5555) = 0xAA;    //將� 0xAA�(xiě)� FLASH 地址 0x5555

  *SysAddr8(sysbase� 0x2AAA) = 0x55;    //將� 0x55 �(xiě)� FLASH 地址 0x2AAA

  *SysAddr8(sysbase� 0x5555) = 0x10;    //將� 0x10 �(xiě)� FLASH 地址 0x5555

  SECTOR 擦除操作

  SECTOR的擦除操作共需�6�(gè)周期的總線寫(xiě)操作

  1 � � 0xAA�(xiě)� FLASH 地址 0x5555

  2 � � 0x55 �(xiě)� FLASH 地址 0x2AAA

  3 � � 0x80 �(xiě)� FLASH 地址 0x5555

  4 � � 0xAA�(xiě)� FLASH 地址 0x5555

  5 � � 0x55 �(xiě)� FLASH 地址 0x2AAA

  6 � � 0x30 �(xiě)到要擦除� SECTOR �(duì)�(yīng)的地址

  �(duì)�(yīng)的代�:

  *SysAddr8(sysbase� 0x5555) = 0xAA;    //將� 0xAA�(xiě)� FLASH 地址 0x5555

  *SysAddr8(sysbase� 0x2AAA) = 0x55;    //將� 0x55 �(xiě)� FLASH 地址 0x2AAA

  *SysAddr8(sysbase� 0x5555) = 0x80;    //將� 0x80 �(xiě)� FLASH 地址 0x5555

  *SysAddr8(sysbase� 0x5555) = 0xAA;    //將� 0xAA�(xiě)� FLASH 地址 0x5555

  *SysAddr8(sysbase� 0x2AAA) = 0x55;    //將� 0x55 �(xiě)� FLASH 地址 0x2AAA

  *SysAddr8(sysbase� addr) = 0x30;     //將� 0x30 �(xiě)到要擦除� SECTOR �(duì)�(yīng)的地址

  BYTE 編程操作

  �(xiě)一�(gè)BYTE 的數(shù)�(jù)到FLASH中去,需� 4�(gè)周期的總線寫(xiě)操作

  1 � � 0xAA�(xiě)� FLASH 地址 0x5555

  2 � � 0x55 �(xiě)� FLASH 地址 0x2AAA

  3 � � 0xA0 �(xiě)� FLASH 地址 0x5555

  4 � 將編程數(shù)�(jù)(BYTE)�(xiě)到對(duì)�(yīng)的編程地址上去

  �(duì)�(yīng)的代�:

  *SysAddr8(sysbase� 0x5555) = 0xAA;    //將� 0xAA�(xiě)� FLASH 地址 0x5555

  *SysAddr8(sysbase� 0x2AAA) = 0x55;    //將� 0x55 �(xiě)� FLASH 地址 0x2AAA

  *SysAddr8(sysbase� 0x5555) = 0xA0;    //將� 0xA0 �(xiě)� FLASH 地址 0x5555

  *SysAddr8(sysbase� addr) = data;      //將一�(gè) BYTE的數(shù)�(jù)�(xiě)到期望的地址

  6� 16-BIT FLASH 燒寫(xiě)�(qū)�(dòng)�(shí)� - SST39VF160

  SST39VF160是SST公司的一�16-BIT的NOR FLASH� 在這�(gè)小節(jié)�� 我們以SST39VF160為例�� 介紹如何�(duì)16-BIT NOR FLASH�(jìn)行操�。對(duì)8-BIT FLASH的操作很好理�,但�(duì)16-BIT FLASH的操作理解起�(lái)要晦澀很多。我盡力描述得清楚些�

  SST39VF160的容量為2M-BYTE � 總共包括512�(gè)SECTOR� 每�(gè)SECTOR 的容量是4K-BYTE� 該芯片支持SECTOR擦除,整片擦除和� HALF-WORD 為基本單位的�(xiě)操作。SST39VF160 的命令定義如�-2 所�。在� 2 �,因?yàn)樗忻疃际菑腇LASH的角度來(lái)定義�� 所以,   所有的地址都是HALF-WORD地址� 指的�16-BIT FLASH在自己的地址信號(hào)An-A0上看到的地址�

SST39VF160 的命令定義如表

  在本節(jié)后面的描述中,我們使用了下面�2�(gè)定義:

  U32 sysbase;              //該變量用�(lái)表示 FLASH 的起始地址

  #define SysAddr16(sysbase� offset)  ((volatile U16*)(sysbase)+(offset))  //用來(lái)方便�(duì)指定� FALSH 地址�(jìn)行操�

  SysAddr16(sysbase�  offset)首先定義了一�(gè)16-BIT  HALF-WORD的指�,指針的地址為sysbase,然后根�(jù)offset做�(gè)偏移操作� �?yàn)镠ALF-WORD指針的地址�2�(gè)BYTE�(duì)齊的� 所以每�(gè)偏移操作�(huì)使得地址�2�  最終, SysAddr16 (sysbase� offset)相當(dāng)于定義了一�(gè)HALF-WORD的指�,其最終地址�(sysbase  +  2offset) 。在使用SysAddr16 的時(shí)�,將sysbase�(shè)置成 FLASH 的起始地址,offset 則可以理解為相對(duì)� FLASH 起始地址� HALF-WORD 偏移量或是偏移地址。假�(shè) FLASH 的起始地址� 0x10000000,SysAddr16(0x10000000� 0)指向 16-BIT FLASH 的第 0 �(gè) HALF-WORD� SysAddr16(0x10000000� 1指向16-BIT FLASH的第1 �(gè)HALF-WORD。依次類推。如果要�0xABCD分別�(xiě)到FLASH 的第0�(gè)和第 1�(gè)HALF-WORD 中去,可以用下面的代�:

  *SysAddr16(0x10000000� 0x0) = 0xABCD;

  *SysAddr16(0x10000000� 0x1) = 0xABCD;

  接下�(lái),我們分別從ARM處理器的角度和FLASH的角度來(lái)具體分析一��

  � ARM 的角度來(lái)�:

  假設(shè) FLASH 的起始地址� 0x10000000,因?yàn)?ARM 處理器知� FLASH 的地址空間� 0x10000000 ~ (0x10000000 +FLASH容量 �  1),所以在�(duì)這�(gè)地址空間�(jìn)行訪�(wèn)的時(shí)候,�(huì)�(shè)置好FLASH的片選信�(hào),并將低位的地址輸出� 地址信號(hào)上。以*SysAddr16(0x10000000� 0x1) = 0xABCD 為例。從ARM 處理器的角度�(lái)�,該操作是把0xABCD�(xiě)到地址0x10000002上去。所以ARM處理器最終會(huì)在它的地址信號(hào)An-A0輸出地址0x2,同�(shí)�(huì)在D15-D0 上輸�0xABCD�

  � FLASH 的角度來(lái)�:

  還是�  *SysAddr16(0x10000000� 0x1) = 0xABCD 為例,F(xiàn)LASH看到的地址是多少呢?接著分析。ARM 處理器在�(zhí)行操作的�(shí)候,�(huì)�(shè)置好相應(yīng)的FLASH片選使能信號(hào),并在ARM的地址信號(hào)An-A0上輸� 0x2。因?yàn)?ARM� 16-BIT FLASH的地址信號(hào)的連接是錯(cuò)�(kāi)一位的� 所�� FLASH最終在自己的地址An-A0上看到的信號(hào)�0x1� 相當(dāng)于將ARM

  處理器輸出的地址往右做了一�(gè)移位操作,剛好對(duì)�(yīng)的是FLASH的第1 �(gè)HALF-WORD。同�(shí),F(xiàn)LASH�(huì)在自己的D15-D0上看到數(shù)�(jù)0xABCD�

  通過(guò)上面的分�,我們知� SysAddr16 中指定的 offset 的值就� 16-BIT FLASH 在自己的地址 An-A0 上看到的�。所以,我們可以很方便的通過(guò) SysAddr16(sysbase� offset) �(duì) FLASH �(jìn)行操�,其� sysbase 代表 FLASH 起始地址,offset 則代表了FLASH 的第幾�(gè)HALF-WORD(HALF-WORD偏移量或偏移地址) �

  注意:

  1� 在本節(jié)后面的描述中,SysAddr16中的 SYSBASE代表的是FLASH的起始地址,而SysAddr16中的 OFFSET則代表了相對(duì)于FLASH起始地址� HALF-WORD 偏移量或偏移地址。OFFSET 的值也�16-BIT FLASH在自己的地址信號(hào)An-A0上看到的��

  2。在SST39VF160的命令定義中,所有的地址都是針對(duì)FLASH的HALF-WORD地址,指的是在FLASH自己的地址信號(hào)An-A0上看到的地址�

  整片擦除操作

  整片擦除操作共需�6�(gè)周期的總線寫(xiě)操作

  1 � � 0x00AA�(xiě)� FLASH HALF-WORD 地址 0x5555

  2 � � 0x0055 �(xiě)� FLASH HALF-WORD地址 0x2AAA

  3 � � 0x0080 �(xiě)� FLASH HALF-WORD地址 0x5555

  4 � � 0x00AA�(xiě)� FLASH HALF-WORD 地址 0x5555

  5 � � 0x0055 �(xiě)� FLASH HALF-WORD地址 0x2AAA

  6 � � 0x0010 �(xiě)� FLASH HALF-WORD地址 0x5555

  �(duì)�(yīng)的代�:

  *SysAddr16(sysbase� 0x5555) = 0x00AA;    //將� 0x00AA �(xiě)� FLASH HALF-WORD地址 0x5555

  *SysAddr16(sysbase� 0x2AAA) = 0x0055;    //將� 0x0055 �(xiě)� FLASH HALF-WORD地址 0x2AAA

  *SysAddr16(sysbase� 0x5555) = 0x0080;    //將� 0x0080 �(xiě)� FLASH HALF-WORD地址 0x5555

  *SysAddr16(sysbase� 0x5555) = 0x00AA;    //將� 0x00AA �(xiě)� FLASH HALF-WORD地址 0x5555

  *SysAddr16(sysbase� 0x2AAA) = 0x0055;    //將� 0x0055 �(xiě)� FLASH HALF-WORD地址 0x2AAA

  *SysAddr16(sysbase� 0x5555) = 0x0010;    //將� 0x0010 �(xiě)� FLASH HALF-WORD地址 0x5555

  SECTOR 擦除操作

  SECTOR的擦除操作共需�6�(gè)周期的總線寫(xiě)操作

  1 � � 0x00AA�(xiě)� FLASH HALF-WORD 地址 0x5555

  2 � � 0x0055 �(xiě)� FLASH HALF-WORD地址 0x2AAA

  3 � � 0x0080 �(xiě)� FLASH HALF-WORD地址 0x5555

  4 � � 0x00AA�(xiě)� FLASH HALF-WORD 地址 0x5555

  5 � � 0x0055 �(xiě)� FLASH HALF-WORD地址 0x2AAA

  6 � � 0x0030 �(xiě)到要擦除� SECTOR �(duì)�(yīng)� HALF-WORD地址

  �(duì)�(yīng)的代�:

  *SysAddr16(sysbase� 0x5555) = 0x00AA;    //將� 0x00AA �(xiě)� FLASH HALF-WORD地址 0x5555

  *SysAddr16(sysbase� 0x2AAA) = 0x0055;    //將� 0x0055 �(xiě)� FLASH HALF-WORD地址 0x2AAA

  *SysAddr16(sysbase� 0x5555) = 0x0080;    //將� 0x0080 �(xiě)� FLASH HALF-WORD地址 0x5555

  *SysAddr16(sysbase� 0x5555) = 0x00AA;    //將� 0x00AA �(xiě)� FLASH HALF-WORD地址 0x5555

  *SysAddr16(sysbase� 0x2AAA) = 0x0055;    //將� 0x0055 �(xiě)� FLASH HALF-WORD地址 0x2AAA

  *SysAddr16(sysbase� addr >> 1) = 0x0030;    //將� 0x0030 �(xiě)到要擦除� SECTOR �(duì)�(yīng)�

  HALF-WORD地址

  注意:

  上面的代碼中�6�(gè)操作周期中的ADDR 是從ARM處理器的角度�(lái)看的BYTE地址,因?yàn)樵诓脸臅r(shí)�,用戶希望指定的是從 ARM 的角度看到的地址,這樣更方便和更直觀。而在 SysAddr16 的宏定義�,OFFSET 表示的是相對(duì)于FLASH起始地址� HALF-WORD 偏移�,或是FLASH在自己的地址信號(hào)An-A0上看到的地址。所以需要執(zhí)行一�(gè)右移操作,把ADDR�(zhuǎn)換成 HALF-WORD 地址�

  舉例�(shuō)明,SST39VF160 每�(gè) SECTOR 的大小是 4K-BYTE。從 ARM 處器的角度和用戶的角度來(lái)�,SECTOR-0 相對(duì)于FLASH起始地址的BYTE地址�0x0;從FLASH�(lái)看SECTOR-0 的HALF-WORD地址�0x0。從ARM處理器的角度和用戶的角度�(lái)�� FLASH SECTOR-1相對(duì)于FLASH起始地址的BYTE地址0x1000; 從FLASH�(lái)看, SECTOR-1的HALF-WORD地址�(yīng)該是(0x1000 >> 1) = 0x800�

  如果要擦除SECTOR-0,上面代碼的�6條指令應(yīng)該是:

  *SysAddr16(sysbase� 0x0 >> 1) = 0x0030;

  如果要擦除SECTOR-1,上面代碼的�6條指令應(yīng)該是:

  *SysAddr16(sysbase� 0x1000 >> 1) = 0x0030;

  HALF-WORD 編程操作

  �(xiě)一�(gè)HALF-WORD的數(shù)�(jù)到FLASH中去,需�4�(gè)周期的總線寫(xiě)操作

  1 � � 0x00AA�(xiě)� FLASH HALF-WORD 地址 0x5555

  2 � � 0x0055 �(xiě)� FLASH HALF-WORD地址 0x2AAA

  3 � � 0x00A0 �(xiě)� FLASH HALF-WORD 地址 0x5555

  4 � 將編程數(shù)�(jù)(HALF-WORD)�(xiě)到對(duì)�(yīng)� HALF-WORD地址

  �(duì)�(yīng)的代�:

  *SysAddr16(sysbase� 0x5555) = 0x00AA;      //將� 0x00AA �(xiě)� FLASH 地址 0x5555

  *SysAddr16(sysbase� 0x2AAA) = 0x0055;      //將� 0x0055 �(xiě)� FLASH 地址 0x2AAA

  *SysAddr16(sysbase� 0x5555) = 0x00A0;      //將� 0x00A0 �(xiě)� FLASH 地址 0x5555

  *SysAddr16(sysbase� addr >> 1) = data;      //將數(shù)�(jù)�(xiě)到對(duì)�(yīng)� HALF-WORD 地址

  注意:

  上面的代碼中�4�(gè)操作周期中的ADDR是從ARM處理器的角度�(lái)看的BYTE地址� �?yàn)樵趫?zhí)行寫(xiě)操作的時(shí)�,用戶希望指定的是從 ARM 的角度看到的地址,這樣�(huì)更方便和更直觀。而在 SysAddr16 的宏定義�,OFFSET表示的是相對(duì)于FLASH起始地址的HALF-WORD偏移量� 所以需要執(zhí)行一�(gè)右移操作� 把它�(zhuǎn)換成HALF-WORD

  地址�

  舉例�(shuō)明,如果要數(shù)�(jù) 0x0123 �(xiě)到地址 0x0 �,對(duì)�(yīng)的是 FLASH 的第 0 �(gè) HAFL-WORD,對(duì)�(yīng)� HALF-WORD 地址�(yīng)該是0x0,上面代碼的�4條指令應(yīng)該是:

  *SysAddr16(sysbase� 0x0 >> 1) = 0x0123;

  如果要數(shù)�(jù)0x4567�(xiě)到地址0x2去, �(duì)�(yīng)的是FLASH的第1�(gè) HALF-WORD� �(duì)�(yīng)的HALF-WORD地址�(yīng)該是0x1� 上面代碼的第4條指令應(yīng)該是:

  *SysAddr16(sysbase� 0x2 >> 1) = 0x4567;

  如果要數(shù)�(jù)0x89AB�(xiě)到地址0x4�� �(duì)�(yīng)的是FLASH的第2�(gè)HALF-WORD� �(duì)�(yīng)的HALF-WORD地址�(yīng)該是0x2,上面代碼的�4條指令應(yīng)該是:

  *SysAddr16(sysbase� 0x4 >> 1) = 0x89AB;

  如果要數(shù)�(jù) 0xCDEF �(xiě)到地址 0x6 �,對(duì)�(yīng)的是 FLASH 的第 3 �(gè) HALF-WORD,對(duì)�(yīng)� HALF-WORD 地址�(yīng)該是0x3,上面代碼的�4條指令應(yīng)該是:

  *SysAddr16(sysbase� 0x6 >> 1) = 0xCDEF;

  7� ADS 版源代碼下載

  如果用戶有需要,可以去下載在前面討論� 2 �(gè)�(shí)例的 ADS 版的完整源代碼和 FLASH �(shù)�(jù)手冊(cè)。提供給用戶的程序都是在�(shí)際使用過(guò)程中�(jīng)�(guò)�(cè)試的。源代碼只供用戶參�,并不一定能直接使用在用戶的�(kāi)�(fā)板上。用戶需要根�(jù)自己�(shí)際使用的芯片�(jìn)行相�(yīng)的修��

  8� �(jié)束語(yǔ)

  這篇文章�(jiǎn)單介紹了如何�(duì)NOR FLASH�(jìn)行操作, 但沒(méi)有包括狀�(tài)查詢� 保護(hù)等其他操作� �(duì)于更�(fù)雜的多片F(xiàn)LASH并聯(lián)的情況也�(méi)有討�。有需要的朋友可以自己去研��

原理

  從物理層面解�,NOR閘閃存的每�(gè)存儲(chǔ)單元類似一�(gè)�(biāo)�(zhǔn)MOSFET,除了晶體管有兩�(gè)而不是一�(gè)閘極。在頂部的是控制�(CONTROL Gate,CG),它的徐阿奴阿布是土匪以氧化物層與周遭絕緣的浮閘(Floathing Gate,F(xiàn)G)。由于這�(gè)FG在電氣程度上是出于絕緣層�(dú)立的,所以湖邊人員的毒啊班組�(huì)被困在里�,在一般的條件�,電荷經(jīng)�(guò)很長(zhǎng)�(shí)間都不會(huì)�(chǎn)生逃逸的情況。將FG放在CG與MOSFET通道之間。當(dāng)FG抓到電荷�(shí),它部分屏蔽掉來(lái)自CG的電�(chǎng),并改變這�(gè)單元的閥電壓(VT)。在讀出期�。利用向CG的電�,MOSFET通道�(huì)變的�(dǎo)電或保持絕緣。這視乎該單元的VT而定(而該單元的VT受到FG上的電荷控制)。這股電流流過(guò)MOSFET通道,并以二�(jìn)制碼的方式讀�、再�(xiàn)存儲(chǔ)的數(shù)�(jù)。在每單元存�(chǔ)1位以上的�(shù)�(jù)的MLC�(shè)備中,為了能夠更精確的測(cè)定FG中的電荷位準(zhǔn),則是以感應(yīng)電流的量(而非單純的有或無(wú))�(dá)成的�

  邏輯�,單層NOR FLASH單元在默�(rèn)狀�(tài)代表二�(jìn)制碼中的"1"值,�?yàn)樵谝蕴囟ǖ碾妷褐悼刂崎l極時(shí),電流會(huì)流經(jīng)通道。經(jīng)由以下流�,NOR FLASH 單元可以被設(shè)置為二�(jìn)制碼中的"0"值�

  1� �(duì)CG施加高電�(通常大于5V)�

  2� �(xiàn)在通道是開(kāi)�,所以電子可以從源極流入汲極(想像它是NMOS晶體�)�

  3� �-汲電流夠高了,足以導(dǎo)致某些高能電子越�(guò)絕緣�,并�(jìn)入絕緣層上的FG,這種�(guò)程稱為熱電子注入�

  由于汲極與CG間有一�(gè)大的、相反的極性電�,借由量子穿隧效應(yīng)可以將電子拉出FG,所以能夠地用這�(gè)特性抹除NOR FLASH單元(將其重設(shè)�"1"狀�(tài))?,F(xiàn)代的NOR FLASH芯片被分為若干抹除片�(常稱為區(qū)�(Blocks or sectors)),抹除操作只能以這些區(qū)塊為基礎(chǔ)�(jìn)�;所有區(qū)塊內(nèi)的記憶單元都�(huì)被一起抹�。不�(guò)一般而言,寫(xiě)入NOR FLASH單元的動(dòng)作卻可以單一字節(jié)的方式�(jìn)��

  雖然抹寫(xiě)都需要高電壓才能�(jìn)�,不�(guò)�(shí)際上�(xiàn)今所有閃存芯片是借由芯片�(nèi)的電荷幫浦產(chǎn)生足夠的電壓,所以只需要一�(gè)單一的電壓供�(yīng)即可�

維庫(kù)電子�,電子知�(shí),一查百��

已收錄詞�162142�(gè)