国产在线中文字幕亚洲,一区视频国产精品观看,欧美日韩国产高清片,久久久久久AV无码免费网站,亚洲无码一二三四五区,日韩无码www.,sese444

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

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

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

訪問方式

  在NOR FLASH的讀取數(shù)�(jù)的方式來�,它與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沒有本地壞區(qū)管理,所以一旦存�(chǔ)區(qū)塊發(fā)生毀�,軟件或�(qū)�(dòng)程序必須接手這�(gè)問題,否則可能會(huì)�(dǎo)致設(shè)備發(fā)生異�� 在解�、抹除或?qū)懭隢OR FLASH區(qū)塊時(shí),特殊的指令�(huì)先寫入已繪測(cè)的記憶區(qū)的頁(Page)。接著快閃記憶芯片會(huì)提供可用的指令清單給�(shí)體驅(qū)�(dòng)程序,而這些指令是由一般性閃存接�(CommON FLASH memory Interface� CFI)所界定�� 與用于隨�(jī)存取的ROM不同,NOR FLASH也可以用在存�(chǔ)�(shè)備上;不過與NAND FLASH相比,NOR FLASH的寫入速度一般來說會(huì)慢很��

燒寫方式

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

  在后面的介紹里,如無特別說明,處理器指的� 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 是很常見的一種存�(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)行寫操作。對(duì)NOR FLASH的寫操作需要遵循特定的命令序列,最終由芯片�(nèi)部的控制單元完成寫操�。從支持的最小訪問單元來�,NOR FLASH一般分� 8 位的�16位的(�(dāng)然,也有很多NOR FLASH芯片同時(shí)支持8位模式和�16 位模�,具體的工作模式通過特定的管腳�(jìn)行選�) � �(duì)8位的 NOR FLASH芯片,或是工作在8-BIT模式的芯片來�,一�(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模式的芯片來�,一�(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)行寫操作的時(shí)候,每�(gè)BIT可以通過編程�1�?yōu)?,但不可以有0修改�1。為了保證寫操作的正確�,在�(zhí)行寫操作�,都要執(zhí)行擦除操作。擦除操作會(huì)把FLASH的一�(gè)SECTOR,一�(gè)BANK或是整片F(xiàn)LASH 的值全修改�0xFF。這樣,寫操作就可以正確完成了�

  2� ARM 處理器的尋址

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

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

  從前面的介紹,我們知道從處理器的角度來看,每�(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ā)送出來的地址信號(hào)的位A0�(duì)16-BIT FLASH來說就被屏蔽掉了�

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

  �(bǔ)充說�:

  1�  一般來�,ARM處理器內(nèi)部要�(shè)置相�(yīng)的寄存器,告訴處理器外部�(kuò)展的FLASH的位�(8-BIT/16-BIT/32-BIT) 。這樣,處理器才知道在訪問的時(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í)際訪問的�(shí)�,送出的地址�(shí)際上是在MCU�(nèi)部做了錯(cuò)位處�,其作用是等效于硬件連接上的�(cuò)位的�

  上面的描述可能比較抽象,下面讓我們來�2�(gè) ARM處理器訪�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處理器知道訪問的�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處理器知道訪問的�16-BIT的FLASH,從D15-D8 上讀取所需要的一�(gè)BYTE 的數(shù)�(jù);

  4�  從軟件角度來� ARM 處理器和 NOR FLASH 的連接

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

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

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

  5� 8-BIT FLASH 燒寫�(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 為基本單位的寫操�。HY29F040的命令定義如�-1所��

HY29F040的命令定義表

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

  U32 sysbase;              //該變量用來表� FLASH 的起始地址

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

  先解釋一� SysAddr8 的定義。這�(gè)宏定義了一�(gè) BYTE(8-BIT)指針,其地址�(sysbase + offset)。假�(shè) FLASH 的起始地址�0x10000000,如果要�0xAB寫到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è)周期的總線寫操作

  1 � � 0xAA寫到 FLASH 地址 0x5555

  2 � � 0x55 寫到 FLASH 地址 0x2AAA

  3 � � 0x80 寫到 FLASH 地址 0x5555

  4 � � 0xAA寫到 FLASH 地址 0x5555

  5 � � 0x55 寫到 FLASH 地址 0x2AAA

  6 � � 0x10 寫到 FLASH 地址 0x5555

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

  *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 地址 0x5555

  SECTOR 擦除操作

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

  1 � � 0xAA寫到 FLASH 地址 0x5555

  2 � � 0x55 寫到 FLASH 地址 0x2AAA

  3 � � 0x80 寫到 FLASH 地址 0x5555

  4 � � 0xAA寫到 FLASH 地址 0x5555

  5 � � 0x55 寫到 FLASH 地址 0x2AAA

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

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

  *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 �(duì)�(yīng)的地址

  BYTE 編程操作

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

  1 � � 0xAA寫到 FLASH 地址 0x5555

  2 � � 0x55 寫到 FLASH 地址 0x2AAA

  3 � � 0xA0 寫到 FLASH 地址 0x5555

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

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

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

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

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

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

  6� 16-BIT FLASH 燒寫�(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的操作理解起來要晦澀很多。我盡力描述得清楚些�

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

SST39VF160 的命令定義如表

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

  U32 sysbase;              //該變量用來表� FLASH 的起始地址

  #define SysAddr16(sysbase� offset)  ((volatile U16*)(sysbase)+(offset))  //用來方便�(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分別寫到FLASH 的第0�(gè)和第 1�(gè)HALF-WORD 中去,可以用下面的代�:

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

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

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

  � ARM 的角度來�:

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

  � FLASH 的角度來�:

  還是�  *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ò)開一位的� 所�� 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�

  通過上面的分�,我們知� SysAddr16 中指定的 offset 的值就� 16-BIT FLASH 在自己的地址 An-A0 上看到的值。所�,我們可以很方便的通過 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è)周期的總線寫操作

  1 � � 0x00AA寫到 FLASH HALF-WORD 地址 0x5555

  2 � � 0x0055 寫到 FLASH HALF-WORD地址 0x2AAA

  3 � � 0x0080 寫到 FLASH HALF-WORD地址 0x5555

  4 � � 0x00AA寫到 FLASH HALF-WORD 地址 0x5555

  5 � � 0x0055 寫到 FLASH HALF-WORD地址 0x2AAA

  6 � � 0x0010 寫到 FLASH HALF-WORD地址 0x5555

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

  *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地址 0x5555

  SECTOR 擦除操作

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

  1 � � 0x00AA寫到 FLASH HALF-WORD 地址 0x5555

  2 � � 0x0055 寫到 FLASH HALF-WORD地址 0x2AAA

  3 � � 0x0080 寫到 FLASH HALF-WORD地址 0x5555

  4 � � 0x00AA寫到 FLASH HALF-WORD 地址 0x5555

  5 � � 0x0055 寫到 FLASH HALF-WORD地址 0x2AAA

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

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

  *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 �(duì)�(yīng)�

  HALF-WORD地址

  注意:

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

  舉例說明,SST39VF160 每�(gè) SECTOR 的大小是 4K-BYTE。從 ARM 處器的角度和用戶的角度來�,SECTOR-0 相對(duì)于FLASH起始地址的BYTE地址�0x0;從FLASH來看SECTOR-0 的HALF-WORD地址�0x0。從ARM處理器的角度和用戶的角度來看� FLASH SECTOR-1相對(duì)于FLASH起始地址的BYTE地址0x1000; 從FLASH來看� 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 編程操作

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

  1 � � 0x00AA寫到 FLASH HALF-WORD 地址 0x5555

  2 � � 0x0055 寫到 FLASH HALF-WORD地址 0x2AAA

  3 � � 0x00A0 寫到 FLASH HALF-WORD 地址 0x5555

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

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

  *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) = data;      //將數(shù)�(jù)寫到�(duì)�(yīng)� HALF-WORD 地址

  注意:

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

  地址�

  舉例說明,如果要�(shù)�(jù) 0x0123 寫到地址 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寫到地址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寫到地址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 寫到地址 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í)際使用過程中�(jīng)過測(cè)試的。源代碼只供用戶參考,并不一定能直接使用在用戶的開發(fā)板上。用戶需要根�(jù)自己�(shí)際使用的芯片�(jìn)行相�(yīng)的修改�

  8� �(jié)束語

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

原理

  從物理層面解�,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)過很長時(shí)間都不會(huì)�(chǎn)生逃逸的情況。將FG放在CG與MOSFET通道之間。當(dāng)FG抓到電荷�(shí),它部分屏蔽掉來自CG的電�(chǎng),并改變這�(gè)單元的閥電壓(VT)。在讀出期間。利用向CG的電�,MOSFET通道�(huì)變的�(dǎo)電或保持絕緣。這視乎該單元的VT而定(而該單元的VT受到FG上的電荷控制)。這股電流流過MOSFET通道,并以二�(jìn)制碼的方式讀出、再�(xiàn)存儲(chǔ)的數(shù)�(jù)。在每單元存�(chǔ)1位以上的�(shù)�(jù)的MLC�(shè)備中,為了能夠更精確的測(cè)定FG中的電荷位準(zhǔn),則是以感應(yīng)電流的量(而非單純的有或無)�(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)在通道是開�,所以電子可以從源極流入汲極(想像它是NMOS晶體�)�

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

  由于汲極與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ì)被一起抹�。不過一般而言,寫入NOR FLASH單元的動(dòng)作卻可以單一字節(jié)的方式�(jìn)��

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

維庫電子�,電子知�(shí),一查百通!

已收錄詞�162542�(gè)