來源:韋東山嵌入式專欄_ARM裸機加強版維基教程
作者:韋東山
(本文字數:2682,閱讀時長:4分鐘)
Nor Flash的連接線有地址線,數據線,片選信號讀寫信號等,Nor Flash的接口屬于內存類接口,Nor Flash可以像內存一樣讀,但是不能像內存一樣寫,需要做一些特殊的操作才能進行寫操作,讀只需像內存一樣讀很簡單。
Nor Flash原理圖如圖:
常用的Flash類型有Nor Flash和NAND Flash兩種。
Nor Flash由Intel公司在1988年發明,以替代當時在市場上占據主要地位的EPROM和E2PROM。NAND Flash由Toshiba公司在1989年發明。兩者的主要差別如下表:
Nor Flash支持XIP,即代碼可以直接在Nor Flash上執行,無需復制到內存中。這是由于NorF lash的接口與RAM完全相同,可以隨機訪問任意地址的數據。Nor Flash進行讀操作的效率非常高,但是擦除和寫操作的效率很低,另外,Nor Flash的容量一般比較小。NAND Flash進行擦除和寫操作的效率更高,并且容量更大。一般而言,Nor Flash用于存儲程序,NAND Flash用于存儲數據。基于NAND Flash的設備通常也要搭配Nor Flash以存儲程字。
Flash存儲器件由擦除單元(也稱為塊)組成,當要寫某個塊時,需要確保這個塊已經被擦除。Nor Flash的塊大小范圍為64kB、128kB:NAND Flash的塊大小范圍為8kB,64kB,擦/寫一個Nor Flash塊需4s,而擦/寫一個NAND Flash塊僅需2ms。Nor Flash的塊太大,不僅增加了擦寫時間,對于給定的寫操作,Nor Flash也需要更多的擦除操作——特別是小文件,比如一個文件只有IkB,但是為了保存它卻需要擦除大小為64kB—128kB的Nor Flash塊。
Nor Flash的接口與RAM完全相同,可以隨意訪問任意地址的數據。而NAND Flash的接口僅僅包含幾個I/O引腳,需要串行地訪問。NAND Flash一般以512字節為單位進行讀寫。這使得Nor Flash適合于運行程序,而NAND Flash更適合于存儲數據。
容量相同的情況下,NAND Flash的體積更小,對于空間有嚴格要求的系統,NAND Flash可以節省更多空間。市場上Nor Flash的容量通常為IMB~4MB(也有32MB的Nor Flash),NAND Flash的容量為8MB~512MB。容量的差別也使得Nor Flash多用于存儲程序,NAND Flash多用于存儲數據。
對于Flash存儲器件的可靠性需要考慮3點:位反轉、壞塊和可擦除次數。所有Flash器件都遭遇位反轉的問題:由于Flash固有的電器特性,在讀寫數據過程中,偶然會產生一位或幾位數據錯誤(這種概率很低),而NAND Flash出現的概率遠大于Nor Flash,當位反轉發生在關鍵的代碼、數據上時,有可能導致系統崩潰。當僅僅是報告位反轉,重新讀取即可:如果確實發生了位反轉,則必須有相應的錯誤檢測/恢復措施。在NAND Flash上發生位反轉的概率史高,推薦使用EDC/ECC進行錯誤檢測和恢復。NAND Flash上面會有壞塊隨機分布在使用前需要將壞塊掃描出來,確保不再使用它們,否則會使產品含有嚴重的故障。NAND Flash每塊的可擦除次數通常在100000次左右,是Nor Flash的10倍。另外,因為NAND Flash的塊大小通常是NorF lash的1/8,所以NAND Flash的壽命遠遠超過Nor Flash。
嵌入式Linux對Nor、NAND Flash的軟件支持都很成熟。在Nor Flash上常用jffs2文件系統,而在NAND Flash常用yaffs文件系統。在更底層,有MTD驅動程序實現對它們的讀、寫、擦除操縱,它也實現了EDC/ECC校驗。
下面我們使用u-boot來體驗Nor Flash的操作(開發板設置Nor啟動,進入u-boot)。
1).使用OpenJTAG燒寫UBOOT到Nor Flash
那么我們怎么用u-boot來操作呢?
Nor Flash手冊里會有一個命令的表格,如圖:
下面簡單的舉一些例子:
復位(reset):往任何一個地址寫入F0。
讀ID(ReadSiliconID):很多的Nor Flash可以配置成位寬16bit(Word),位寬8bit(Byte)。對于我們使用的jz2440開發板使用是位寬16bit,怎樣讀ID呢?
根據前面的圖可知,往Nor Flash的555地址寫AA,再往2AA的地址寫入55,再往555的地址寫入90,然后就可以讀ADI地址,就可以讀到DDI數據了。
實例1
讀數據:
在u-boot上執行:md.b 0
結果(和我們燒進去的數據完全一樣):
00000000:170000ea14f09fe514f09fe514f09fe5................
00000010:14f09fe514f09fe514f09fe514f09fe5................
00000020:6001f833c001f8332002f8337002f833`..3...3..3...3
00000030:e002f8330004f8332004f833efbeadde...3...3..3....
可以得出結論:u-boot可以像讀內存一樣來讀nor flash
實例2
讀ID(參考Nor手冊)
下圖為2440和Nor Flash的簡易連接圖:
2440的A1接到Nor的A0所以2440發出的地址是,Nor Flash收到的地址左移一位。比如:2440發出(555H<<1)地址,Nor Flash才能收到555H這個地址。
下面對在Nor Flash的操作,2440的操作,U-BOOT上的操作進行比較,如下表:
1).當執行過
md.w 0 1
結果(輸出廠家ID):
00000000:00c2…(00c2就是廠家ID)
2).當執行過
md.w 2 1
結果(輸出設備ID):
00000002:2249I"(2249就是設備ID)
3).當執行
mw.w 0 f0
就退出讀ID的狀態,
4).執行:
md.b 0
結果:00000000:17.(讀到的就是Nor Flash地址·0的數據)
在前面的視頻里,我們涉及四個接口,兩個開關。
四個接口:電源接口、USB串口、USB下載口、JTAG下載口;
兩個開關:電源開關、啟動選擇開關;
分別對應下圖中的1、8、6、7、1、11;
我們買開發板的目的就是把電腦上編寫編譯好的程序燒寫到板子上驗證學習。因此開發板上一定有個燒寫口,例如JTAG燒寫口。但電腦上是不會有這個JTAG口的,因此需要一個USB燒寫器將兩者連接,例如Jlink、OP/EOP。Jlink本來用的人很多,但隨著版權意識的提高以及Jlink公司對盜版的打擊,Jlink現在用得越來越少了。EesyOpenJtag是OpenJtag的便宜版本,他和我們的開發板是絕配,他可以直接燒寫Nand Flash和Nor Flash,操作簡單,價格便宜。
對于程序員來說,我們程序都是三分寫,七分調,調試非常重要。對于我們電腦,我們可以在屏幕上顯示,對于我們開發板,我們可能連顯示屏都沒有,并且屏幕的操作比較復雜,不太適合用于調試。那我們這里就需要一個比較簡單的設備提供調試信息——串口。通過串口,可以把PC上的數據傳到開發板,開發板也可返回數據。開發板的串口,不能直接與電腦的USB相連,中間需要一個串口轉USB的芯片,這個芯片集成到了開發板上,因此可以直接使用USB線將電腦與開發板連接進行通信。
現在再說一下燒寫,我們之前說可以通過Jtag進行燒寫,它非常的可靠,當我們板子變成了磚頭的時候,可以使用Jtag進行燒寫,但他的速度很慢。當我們燒寫很大程序的時候,會崩潰的。因此我們可以借助USB口進行燒寫,前提是板子上已經運行有一個程序,這個程序用來支持USB下載
對開發板上電啟動,出廠的時候默認燒寫一個Linux系統。我們上電后可以看到Linux的企鵝圖標,然后自動啟動Qt。
再將開發板的串口與電腦相連,自動/手動安裝好串口驅動后,使用MobaXterm軟件的Serial功能,即可通過串口輸入Linux命令。
連接示意圖如下:
燒寫裸板程序,需要用到的軟件是oflash.exe,使用到的硬件是op/eop(easy open Jtag),以及相應的驅動程序。操作步驟如下:
在前面,使用eop燒寫一個200多k的uboot時,耗費了幾分鐘,這速度實在太慢了,在后續的開發過程中,我們的程序可能有許多錯誤,需要反復修改燒寫,如果繼續用eop將會浪費很多時間。那么有沒有更快的燒寫方式呢?有的,我們用uboot進行燒寫。
在2440上面,有兩種flash:Nand Flash和Nor Flash。我們可以首先把uboot燒到Nor Flash,然后Nor啟動運行uboot,使用uboot的USB下載功能接收PC傳來的文件,然后uboot將收到的文件燒寫到Nand Flash,最后Nand啟動,啟動我們燒寫的程序。
操作步驟如下:
開發板買來就是學習的,就是用來“破壞的”,不要擔心上面的東西被破壞,因為我們有辦法恢復出廠系統。我們先對比PC看看出廠系統有哪些東西:
可以看到我們的東西都放在Flash上面,對于我們的JZ2440,有256M的Nand Flash和2M的Nor Flash,所以我們內核、根文件系統那么多的文件,應該是放在Nand Falsh。Nand Falsh內部數據分布如下:
其中bootloader既可以在Nand Flash也可以在Nor Flash,params的變量存儲有uboot的參數信息。
恢復出廠系統的具體步驟如下:
「新品首發」STM32MP157開發板火爆預售!首批僅300套