flash的讀寫擦除

2021-06-20 08:43:17 字數 3257 閱讀 9329

flash快閃儲存器是非易失儲存器,可以對稱為塊的儲存器單元塊進行擦寫和再程式設計。任何

flash

器件的寫入操作只能在空或已擦除的單元內進行,所以大多數情況下,在進行寫入操作之前必須先執行擦除。nand

器件執行擦除

操作是十分簡單的,而

nor則要求在進行擦除前

先要將目標塊內所有的位都寫為1。

由於擦除

nor器件時是以64~

128kb

的塊進行的,執行乙個寫入/擦除操作的時間為5s ,與此相反,擦除nand器件是以8~32kb的塊進 行的,執行相同的操作最多隻需要4ms。執行擦除時塊尺寸的不同進一步拉大了nor和nand之間的效能差距。

nor flash帶有sram介面,有足夠的位址引腳來定址,可以很容易地訪問其內部的每

乙個位元組。

nand器件使用複雜的i/o口來序列地訪問資料,各個產品或廠商的方法可能各不相同 。8個引腳用來傳送控制、位址和資料資訊。

nand

讀和寫操作採用

512位元組的塊,這一點有點像硬碟管理此類操作,很自然地,基於

nand

的儲存器就可以取代硬碟或其他塊裝置。

nand flash 的資料是以bit的方式儲存在memory cell,一般來說,乙個cell 中只能儲存乙個bit。這些cell 以8個或者16個為單位,連成bitline,形成所謂的byte(x8)/word(x16),這就是nand device的位寬。這些line會再組成page,(nand flash 有多種結構,以三星的k9f1208u0m),每頁528bytes(512byte(mainarea)+16byte(spare area)為例),每32個page形成乙個block(32*528b)。具體一片flash上有多少個block視需要所定,例項的nand flash 4096個block,故總容量為4096*(32*528b)=66mb,但是其中的2mb是用來儲存ecc校驗碼等額外資料的,故實際中可使用的為64mb。

nand flash

對於nand flash來講,位址和命令只能在i/o[7:0]上傳遞,資料寬度是8位。

所有flash器件都受位交換現象的困擾。在某些情況下,乙個位元位會發生反轉或被報告反轉了。一位的變化可能不很明顯,但是如果發生在乙個關鍵檔案上,這個小小的故障可能導致系統停機。如果只是報告有問題,多讀幾次就可能解決了。

當然,如果這個位真的改變了,就必須採用錯誤探測

/錯誤更正

(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。

非常容易出現壞區,所以需要有校驗的演算法。

mtdmtd(memorytechnology device記憶體技術裝置)是用於訪問memory裝置(rom、flash)的linux的子系統。mtd的主要目的是為了使新的memory裝置的驅動更加簡單,為此它在硬體和上層之間提供了乙個抽象的介面。mtd的所有源**在/drivers/mtd子目錄下。cfi介面的mtd裝置分為四層(從裝置節點直到底層硬體驅動),這四層從上到下依次是:裝置節點、mtd裝置層、mtd原始裝置層和硬體驅動層。

1)flash硬體驅動層:硬體驅動層負責在驅動載入時初始化flash硬體,linux mtd裝置的nor flash晶元驅動遵循cfi介面標準,其驅動程式位於drivers/mtd/chips子目錄下。nand型flash的驅動程式則位於/drivers/mtd/nand子目錄下

2)mtd原始裝置:原始裝置層有兩部分組成,一部分是mtd原始裝置的通用**,另一部分是各個特定的flash的資料,例如分割槽。

用於描述mtd原始裝置的資料結構是mtd_info,這其中定義了大量的關於mtd的資料和操作函式。mtd_table(mtdcore.c)則是所有mtd原始裝置的列表,mtd_part(mtd_part.c)是用於表示mtd原始裝置分割槽的結構,其中包含了mtd_info,因為每乙個分割槽都是被看成乙個mtd原始裝置加在mtd_table中的,mtd_part.mtd_info中的大部分資料都從該分割槽的主分割槽mtd_part->master中獲得。

在drivers/mtd/maps/子目錄下存放的是特定的flash的資料,每乙個檔案都描述了一塊板子上的flash。其中呼叫add_mtd_device()、del_mtd_device()建立/刪除mtd_info結構並將其加入/刪除mtd_table(或者呼叫add_mtd_partition()、del_mtd_partition()(mtdpart.c)建立/刪除mtd_part結構並將mtd_part.mtd_info加入/刪除mtd_table中)。

3)mtd裝置層:基於mtd原始裝置,linux系統可以定義出mtd的塊裝置(主裝置號31)和字元裝置(裝置號90)。mtd字元裝置的定義在mtdchar.c中實現,通過註冊一系列file operation函式(lseek、open、close、read、write)。mtd塊裝置則是定義了乙個描述mtd塊裝置的結構 mtdblk_dev,並宣告了乙個名為mtdblks的指標陣列,這陣列中的每乙個mtdblk_dev和mtd_table中的每乙個 mtd_info一一對應。

4)裝置節點:通過mknod在/dev子目錄下建立mtd字元裝置節點(主裝置號為90)和mtd塊裝置節點(主裝置號為31),通過訪問此裝置節點即可訪問mtd字元裝置和塊裝置。

STM32 Flash 擦除 讀寫 成功

參考 要點 將資料寫入flash之前,每次都要擦除,否則會寫入不成功,出現的錯誤狀態為 flash status flash error pg 寫入資料成功後可以在memory 中檢視剛剛寫入的資料,具體在memory 視窗中輸入 0x08010000,既可以看到此處的資料為 data 0x1504...

flash as打造FLASH向量線條擦除

flash向量線條擦除 向量線條的擦除在塗鴉板也許用處不是很大 寫的不到位,還望高手指點 原理很簡單,用橡皮來檢測與陣列中的點相碰 刪除碰撞點 重新繪製線條 放在第一幀就可以執行 var startx number 起始點 var starty number var path movieclip t...

linux下擦除 寫入flash的簡單程式設計參考

linux下對dataflash裝置操作 擦除 寫入檔案 的應用程式,注意,所有的操作必須要使用mtdx的字元裝置。mtdchar的字元裝置驅動程式設計參考!來自 include include include include include include include include incl...