1. 程式人生 > >STM32增強型微控制器訪問NAND Flash學習筆記

STM32增強型微控制器訪問NAND Flash學習筆記

一、瞭解NAND Flash Flash即是儲存晶片的一種,其結合了ROM和RAM的特點,既具備電可擦除程式設計的效能,又可以快速讀取資料,資料不會因斷電丟失。目前市面上Flash主要有NOR Flash和NAND Flash。 簡單的理解就是,NOR Flash具有隨機存取和隨位元組執行寫操作的能力,即可以訪問到儲存器內部的任意一個位元組,且具有讀取速度快等特點,它佔據1MB—16MB快閃記憶體的大部分市場,根據其讀取資料速度快的特點主要應用在程式碼儲存;而NAND Flash以“頁”為單位進行對資料的讀寫操作,且具有寫入和擦除速度快等特點,它應用在8MB—256MB的產品中,根據其特點主要應用在
資料儲存
上。 以型號HY27UF081G2A的NAND Flash晶片為例,其匯流排寬度為8bit,總記憶體大小為1Gbit(即128MB),共分為1024塊(Block),每塊又分為64頁(Page),每頁共2KB(main )+64B(spare memory),main memory用來存放資料,spare memory用來標記已壞的塊區和儲存對main memory的ECC校驗碼等(正常情況下不用)。更多的HY27UF081G2A資料參照相關Datasheet。 二、瞭解HY27UF081G2A晶片引腳功能和NAND Flash介面時序及控制命令 1、引腳說明
圖1  引腳圖
圖2  引腳名稱
      2、地址週期
圖3  地址週期
其中A10—A0表示頁內地址偏移(表示0—2047位元組,1頁大小即為2K)       A11表示上半頁或者下半頁(這位程式設計師無需關心,決定A10—A0時也間接決定了A11)       A17—A12表示頁地址(表示0—63頁)       A27—A18表示塊地址(表示0—1023塊) 由於NAND Flash訪問的單位是“頁”,設定訪問地址時只需要確定A27—A12的值即可確定到某一頁,如果要從頁內的某一位置開始訪問,則根據需要設定A10—A0位來確定從頁內第幾個位元組開始訪問,如:要訪問儲存空間為第3塊的第5頁,且從第100位元組開始進行訪問,則對應的4個Cycle週期的地址訊號為:1st :0x64, 2 nd :0x00,  3 
rd :0xC5,  4th :0x00 3、瞭解控制命令,如下所示
圖4  控制命令
4、瞭解介面時序,對該儲存器進行訪問操作有讀取晶片ID、讀頁資料、寫頁資料,塊擦除等共有13種,每種不同的操作對應不用的介面時序,此處只例舉其中的4種操作:讀取晶片ID、讀頁資料、寫頁資料、塊擦除相應的介面時序圖,更多操作參閱其Datasheet。
圖5  讀取晶片ID時序
圖6  讀取一頁資料
圖7  寫一頁資料(頁程式設計
圖8  塊擦除
同時應注意一些時序引數,如在上幾幅時序圖中出現的tAR(ALE至~RE的延時),tCLR(CLE至~RE的延時)等等,這些時間引數都有不同的取值範圍(ns級別),時序圖中出現的Col Add1、Col Add2為列地址表示頁內地址偏移,對應4個Cycle地址中的第1、第2個,Row Add1、Row Add2為行地址標識某塊某頁地址,對應4個Cycle地址中的第3、第4個。更多詳細資料參見相關Datasheet。 三、STM32F10x增強型控制器的FSMC模組       FSMC(可變靜態儲存控制器)是STM32系列微控制器採用的一種新型的儲存器擴充套件技術,可根據系統的需要方便的進行不用型別大容量靜態儲存器的擴充套件;簡單的理解FSMC模組可對多種外接儲存器進行控制,其主要包括NOR Flash、NAND Flash、PC卡,下面對訪問NANDFlash介紹。 1、STM32F10x控制器與HY27UF081G2A的對接 先看STM32F10x控制器提供的NAND Flash介面(這裡為8位的NAND快閃記憶體)
圖9STM32F10x控制器的NAND Flash介面
介面各訊號對應的GPIO口為: A[17] : PD12 A[16] : PD11 D[0:7] : PD14,PD15,PD0,PD1,PE7,PE8,PE9,PE10 NCE[x] : 這裡使用NCE[2],對應GPIO口為PD7 NOE(=NER) : PD4 NWE : PD5 NWAIT/INT[3:2] : PD6(根據情況使用該引腳訊號,這裡不使用) 結合HY27UF081G2A的引腳功能說明,STM32與HY27UF081G2A的連線方式選擇如下:             STM32F10x的NAND介面HY27UF081G2A引腳                   D[0:7]------------------------------------------IO0~IO7                   A[17]-------------------------------------------ALE                   A[16]-------------------------------------------CLE這裡使用PG6接到R/~B,在檢測NAND Flash                   NEC[2]------------------------------------------~CE                   NOE---------------------------------------------~RE                   NWE--------------------------------------------~WE PG6---------------------------------------------R/~B(是否忙時直接讀取PG6引腳上的電平來判斷) 2、NAND地址映像及功能介紹
圖10  儲存器映像和時序暫存器(這裡只用塊2來控制訪問NAND Flash)
通用和屬性空間又可以在低256K位元組部分畫分為三個區
圖11儲存塊選擇
應用軟體使用這三個區訪問NAND Flash儲存器: 傳送命令至NAND Flash:對命令區任意地區寫入命令即可。 指定NAND Flash的地址:對地址區任意地址寫入地址命令即可,一個NAND地址有4或5個位元組(這裡使用的HY27UF081G2A晶片為4個位元組),需要連續地執行對地址區的寫才能輸出完整的操作地址。     讀寫資料:軟體只需對資料區任意一個地址寫入或讀出資料即可。 注:因為NAND Flash儲存器自動累加其內部的操作地址,讀寫資料時沒有必要變換資料區的地址,即不必對連續的地址區操作;應用軟體使用這三個區進行訪問NAND Flash之前要先完成對相應的管理暫存器的初始化配置,下面介紹相應的管理配置暫存器。 3、STM32的NAND Flash儲存器塊通過以下一組暫存器來管理配置 控制暫存器:FSMC_PCRx 中斷狀態暫存器:FSMC_SRx ECC暫存器:FSMC_ECCRx 通用儲存器空間的時序暫存器:FSMC_MEMx 屬性儲存器空間的時序暫存器:FSMC_PATTx I/O空間的時序暫存器:FSMC_PIOx 注:這裡用的是塊2部分,因此上面暫存器中的x=2。 對於要只控制NAND Flash儲存器,上面的三個時序暫存器中只用到FSMC_MEMx,配置該暫存器來控制NAND通用儲存空間的訪問時序,該暫存器中儲存著訪問時序的4個時間引數(MEMsSET+1、MEMxHIZ+1、MEMxWAIT+1、MEMxHOLD+1),每個時間引數的具體說明可參閱STM32相應Datasheet。訪問時序圖如下:
圖12STM32的NAND通用儲存空間的訪問時序
對NAND Flash的簡單控制訪問(讀、寫、擦除等)這裡只需要配置FSMC_PCRx和FSMC_MEMx這兩個暫存器就夠了,對NAND Flash複雜的控制訪問(檢測壞塊、ECC校驗等)此處不做研究。FSMC_PCRx和FSMC_MEMx暫存器功能參閱STM32相關Datasheet。 四、STM32F10x控制器訪問HY27UF081G2A過程 針對於簡單的讀、寫、擦除等訪問,則過程為: 1、管理暫存器FSMC_PCRx和FSMC_MEMx初始化       2、通過訪問通用空間的命令區、資料區、地址區完成對NAND Flash的讀、寫、擦除等操作。 軟體實現過程:(在此之前要完成系統時鐘配置、相應的匯流排時鐘使能、相應GPIO口的初始化工作,這裡不再進行說明) 1、管理暫存器FSMC_PCRx和FSMC_MEMx初始化 FSMC_PCRx = 0x00060048; (設定ECC頁面大小2048位元組、ALE至~RE的延時為1個HCLK,CLE至~RE的延時為1個HCLK,使能ECC電路,設定匯流排寬度為8位,設定儲存器型別為NAND Flash,關閉模組功能,關閉模組等待功能) FSMC_MEMx = 0x01020301;//設定MEMsSET+1 = 4個HCLK、MEMxHIZ+1 = 3個HCLK、 //MEMxWAIT+1 = 4個HCLK、MEMxHOLD+1 = 4個HCLK FSMC_PCRx |= 0x00000002;//使能模組功能 { } { } { } { }