STM32使用FSMC控制NAND flash 例程_第1頁
STM32使用FSMC控制NAND flash 例程_第2頁
STM32使用FSMC控制NAND flash 例程_第3頁
STM32使用FSMC控制NAND flash 例程_第4頁
STM32使用FSMC控制NAND flash 例程_第5頁
已閱讀5頁,還剩8頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、本文原創(chuàng)于觀海聽濤,原作者版權(quán)所有,轉(zhuǎn)載請注明出處。近幾天開發(fā)項目需要用到STM32驅(qū)動NAND FLASH,但由于開發(fā)板例程以及固件庫是用于小頁(512B,我要用到的FLASH為1G bit的大頁(2K,多走了兩天彎路。以下筆記將說明如何將默認固件庫修改為大頁模式以驅(qū)動大容量NAND,并作驅(qū)動。本文硬件:控制器:STM32F103ZET6,存儲器:HY27UF081G2A首先說一下NOR與NAND存儲器的區(qū)別,此類區(qū)別網(wǎng)上有很多,在此僅大致說明:1、Nor讀取速度比NAND稍快2、Nand寫入速度比Nor快很多3、NAND擦除速度(4ms遠快于Nor(5s4、Nor 帶有SRAM接口,有足夠

2、的地址引腳來尋址,可以很輕松的掛接到CPU地址和數(shù)據(jù)總線上,對CPU要求低5、NAND用八個(或十六個引腳串行讀取數(shù)據(jù),數(shù)據(jù)總線地址總線復(fù)用,通常需要CPU支持驅(qū)動,且較為復(fù)雜6、Nor主要占據(jù)1-16M容量市場,并且可以片內(nèi)執(zhí)行,適合代碼存儲7、NAND占據(jù)8-128M及以上市場,通常用來作數(shù)據(jù)存儲8、NAND便宜一些9、NAND壽命比Nor長10、NAND會產(chǎn)生壞塊,需要做壞塊處理和ECC更詳細區(qū)別請繼續(xù)百度,以上內(nèi)容部分摘自神舟三號開發(fā)板手冊下面是NAND的存儲結(jié)構(gòu):由此圖可看出NAND存儲結(jié)構(gòu)為立體式正如硬盤的盤片被分為磁道,每個磁道又分為若干扇區(qū),一塊nand flash也分為若干b

3、lock,每個block分為如干page。一般而言,block、page之間的關(guān)系隨著芯片的不同而不同。需要注意的是,對于flash的讀寫都是以一個page開始的,但是在讀寫之前必須進行flash 的擦寫,而擦寫則是以一個block為單位的。我們這次使用的HY27UF081G2A其PDF介紹:Memory Cell Array= (2K+64 Bytes x 64 Pages x 1,024 Blocks由此可見,該NAND每頁2K,共64頁,1024塊。其中:每頁中的2K為主容量Data Field, 64bit為額外容量Spare Field。Spare Field用于存貯檢驗碼和其他信息

4、用的,并不能存放實際的數(shù)據(jù)。由此可算出系統(tǒng)總?cè)萘繛?K*64*1024=134217728個byte,即1Gbit。NAND閃存顆粒硬件接口:由此圖可見,此顆粒為八位總線,地址數(shù)據(jù)復(fù)用,芯片為SOP48封裝。軟件驅(qū)動:(此部分寫的是偽碼,僅用于解釋含義,可用代碼參見附件主程序:1. #define BUFFER_SIZE 0x2000 /此部分定義緩沖區(qū)大小,即一次寫入的數(shù)據(jù)2. #define NAND_HY_MakerID 0xAD /NAND廠商號3. #define NAND_HY_DeviceID 0xF1 /NAND器件號4. /*配置與SRAM連接的FSMC BANK2 NAND

5、*/5. NAND_Init(;6. /*讀取Nand Flash ID并打印*/7. NAND_ReadID(&NAND_ID;復(fù)制代碼Tips:NAND器件的ID包含四部分:1st Manufacturer Code2nd Device Identifier3rd Internal chip number, cell Type, Number of Simultaneously Programmedpages.4th Page size, spare size, Block size, Organization1. if(NAND_ID.Maker_ID = NAND_HY_Mak

6、erID && (NAND_ID.Device_ID = NAND_HY_DeviceID /判斷器件符合2. 3. /*設(shè)置NAND FLASH的寫地址*/4. WriteReadAddr.Zone = 0x00;5. WriteReadAddr.Block = 0x00;6. WriteReadAddr.Page = 0x05;7. /*擦除待寫入數(shù)據(jù)的塊*/8. status = NAND_EraseBlock(WriteReadAddr; /寫入前必須擦出9. /*將寫Nand Flash的數(shù)據(jù)BUFFER填充為從0x25開始的連續(xù)遞增的一串數(shù)據(jù)*/10. Fill_B

7、uffer(TxBuffer, BUFFER_SIZE , 0x25; /填充數(shù)據(jù)以測試11. /*將數(shù)據(jù)寫入到Nand Flash中。WriteReadAddr:讀寫的起始地址*/12. status = NAND_WriteSmallPage(TxBuffer, WriteReadAddr, PageNumber; /主要寫入函數(shù),此部分默認為小頁需要修改13. /*從Nand Flash中讀回剛寫入的數(shù)據(jù)。 riteReadAddr:讀寫的起始地址*/14. status = NAND_ReadSmallPage (RxBuffer, WriteReadAddr, PageNumber;

8、 /讀取主要函數(shù),也需要修改15.16. /*判斷讀回的數(shù)據(jù)與寫入的數(shù)據(jù)是否一致*/17. for(j = 0; j < BUFFER_SIZE; j+18. 19. if(TxBufferj != RxBufferj20. 21. WriteReadStatus+;22. 23. 24.25. if (WriteReadStatus = 026. 27. printf("nr Nand Flash讀寫訪問成功"28. GPIO_ResetBits(GPIO_LED, DS2_PIN;29. 30. else31. 32. printf("nr Nand F

9、lash讀寫訪問失敗"33. printf("0x%x",WriteReadStatus;34.35. GPIO_ResetBits(GPIO_LED, DS3_PIN;36.37. 38. 39. else40. 41. printf("nr 沒有檢測到Nand Flash的ID"42. GPIO_ResetBits(GPIO_LED, DS4_PIN;43. 復(fù)制代碼fsmc_nand.c文件:1. void NAND_Init(void2. 3. GPIO_InitTypeDef GPIO_InitStructure;4. FSMC_NA

10、ND_PCCARDTimingInitTypeDef p;5. FSMC_NANDInitTypeDef FSMC_NANDInitStructure;6.7. /*FSMC總線使用的GPIO組時鐘使能*/8. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD | RCC_APB2Periph_GPIOE |9. RCC_APB2Periph_GPIOF | RCC_APB2Periph_GPIOG, ENABLE;10.11. /*FSMC CLE, ALE, D0->D3, NOE, NWE and NCE2初始化,推挽復(fù)用輸出*/12. GPI

11、O_InitStructure.GPIO_Pin = GPIO_Pin_11 | GPIO_Pin_12 | GPIO_Pin_14 | GPIO_Pin_15 |13. GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_4 | GPIO_Pin_5 |14. GPIO_Pin_7;15. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;16. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;17. GPIO_Init(GPIOD, &GPIO_InitStructure

12、;18. /*FSMC數(shù)據(jù)線FSMC_D4:7初始化,推挽復(fù)用輸出*/19. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10;20. GPIO_Init(GPIOE, &GPIO_InitStructure;21. /*FSMC NWAIT初始化,輸入上拉*/22. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;23. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;24. GPIO_In

13、itStructure.GPIO_Mode = GPIO_Mode_IPU;25. GPIO_Init(GPIOD, &GPIO_InitStructure;26. /*FSMC INT2初始化,輸入上拉*/27. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;28. GPIO_Init(GPIOG, &GPIO_InitStructure;29. /*-FSMC 總線存儲器參數(shù)配置-*/30. p.FSMC_SetupTime = 0x1; /建立時間31. p.FSMC_WaitSetupTime = 0x3; /等待時間32. p.FS

14、MC_HoldSetupTime = 0x2; /保持時間33. p.FSMC_HiZSetupTime = 0x1; /高阻建立時間34. FSMC_NANDInitStructure.FSMC_Bank = FSMC_Bank2_NAND; /使用FSMC BANK235. FSMC_NANDInitStructure.FSMC_Waitfeature = FSMC_Waitfeature_Enable; /使能FSMC的等待功能36. FSMC_NANDInitStructure.FSMC_MemoryDataWidth = FSMC_MemoryDataWidth_8b; /NAND

15、Flash的數(shù)據(jù)寬度為8位37. FSMC_NANDInitStructure.FSMC_ECC = FSMC_ECC_Enable; /使能ECC特性38. FSMC_NANDInitStructure.FSMC_ECCPageSize = FSMC_ECCPageSize_2048Bytes; /ECC頁大小204839. FSMC_NANDInitStructure.FSMC_TCLRSetupTime = 0x00;40. FSMC_NANDInitStructure.FSMC_TARSetupTime = 0x00;41. FSMC_NANDInitStructure.FSMC_Co

16、mmonSpaceTimingStruct = &p;42. FSMC_NANDInitStructure.FSMC_AttributeSpaceTimingStruct = &p;43. FSMC_NANDInit(&FSMC_NANDInitStructure;44. /*!使能FSMC BANK2 */45. FSMC_NANDCmd(FSMC_Bank2_NAND, ENABLE;46. 復(fù)制代碼1. void NAND_ReadID(NAND_IDTypeDef* NAND_ID2. 3. uint32_t data = 0;4. /*!< Send C

17、ommand to the command area */5. *(_IO uint8_t *(Bank_NAND_ADDR | CMD_AREA = 0x90;6. *(_IO uint8_t *(Bank_NAND_ADDR | ADDR_AREA = 0x00;7. /*!< Sequence to read ID from NAND flash */8. data = *(_IO uint32_t *(Bank_NAND_ADDR | DATA_AREA;9. NAND_ID->Maker_ID = ADDR_1st_CYCLE (data;/四個周期讀取四個ID10. N

18、AND_ID->Device_ID = ADDR_2nd_CYCLE (data;11. NAND_ID->Third_ID = ADDR_3rd_CYCLE (data;12. NAND_ID->Fourth_ID = ADDR_4th_CYCLE (data;13. 復(fù)制代碼1. uint32_t NAND_WriteSmallPage(uint8_t *pBuffer, NAND_ADDRESS Address, uint32_t NumPageToWrite2. /傳入?yún)?shù):寫入數(shù)據(jù),寫入初始地址,要寫幾頁3. uint32_t index = 0x00, numpa

19、gewritten = 0x00, addressstatus = NAND_VALID_ADDRESS;4. uint32_t status = NAND_READY, size = 0x00;5. while(NumPageToWrite != 0x00 && (addressstatus = NAND_VALID_ADDRESS && (status = NAND_READY6. 7. /*!< Page write command and address */8. *(_IO uint8_t *(Bank_NAND_ADDR | CMD_AREA

20、= NAND_CMD_AREA_A;9. *(_IO uint8_t *(Bank_NAND_ADDR | CMD_AREA = NAND_CMD_WRITE0;10. *(_IO uint8_t *(Bank_NAND_ADDR | ADDR_AREA = 0x00;11. *(_IO uint8_t *(Bank_NAND_ADDR | ADDR_AREA = 0x00;/添加此句12. *(_IO uint8_t *(Bank_NAND_ADDR | ADDR_AREA = ADDR_1st_CYCLE(ROW_ADDRESS;13. *(_IO uint8_t *(Bank_NAND_

21、ADDR | ADDR_AREA = ADDR_2nd_CYCLE(ROW_ADDRESS;14. / *(_IO uint8_t *(Bank_NAND_ADDR | ADDR_AREA = ADDR_3rd_CYCLE(ROW_ADDRESS;/原版有此句15. /*!< Calculate the size */16. size = NAND_PAGE_SIZE + (NAND_PAGE_SIZE * numpagewritten;/統(tǒng)計寫入數(shù)目17. /*!< Write data */18. for(; index < size; index+19. 20. *(_

22、IO uint8_t *(Bank_NAND_ADDR | DATA_AREA = pBufferindex;21. 22.23. *(_IO uint8_t *(Bank_NAND_ADDR | CMD_AREA = NAND_CMD_WRITE_TRUE1;24. /*!< Check status for successful operation */25. status = NAND_GetStatus(;26.27. if(status = NAND_READY28. 29. numpagewritten+;30. NumPageToWrite-;31. /*!< Calculate Next small page Address */32. addressstatus = NAND_AddressIncrement(&Address;33. 34. 35.36. return (status | addressstatus;37. 復(fù)制代碼讀取函數(shù)同理修改1. uint32_t NAND_EraseBlock(NAND_ADDRESS Address2. 3. *(_IO uint8_t *(Bank_NAND_ADDR | CMD_AREA = NAND_CMD_ERASE0;4. *(_IO

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論