在线看毛片网站电影-亚洲国产欧美日韩精品一区二区三区,国产欧美乱夫不卡无乱码,国产精品欧美久久久天天影视,精品一区二区三区视频在线观看,亚洲国产精品人成乱码天天看,日韩久久久一区,91精品国产91免费

<menu id="6qfwx"><li id="6qfwx"></li></menu>
    1. <menu id="6qfwx"><dl id="6qfwx"></dl></menu>

      <label id="6qfwx"><ol id="6qfwx"></ol></label><menu id="6qfwx"></menu><object id="6qfwx"><strike id="6qfwx"><noscript id="6qfwx"></noscript></strike></object>
        1. <center id="6qfwx"><dl id="6qfwx"></dl></center>

            新聞中心

            EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > 9G-STM32 EWARM開發(fā)過程簡介之五

            9G-STM32 EWARM開發(fā)過程簡介之五

            作者: 時間:2016-11-29 來源:網(wǎng)絡(luò) 收藏

            /**
            * @brief This routine is for writing one or several 2048 Bytes Page size.
            * @param pBuffer: pointer on the Buffer containing data to be written
            * @param PageAddress: First page address
            * @param NumPageToWrite: Number of page to write
            * @retval : New status of the NAND operation. This parameter can be:
            * - NAND_TIMEOUT_ERROR: when the previous operation generate
            * a Timeout error
            * - NAND_READY: when memory is ready for the next operation
            * And the new status of the increment address operation. It can be:
            * - NAND_VALID_ADDRESS: When the new address is valid address
            * - NAND_INVALID_ADDRESS: When the new address is invalid address
            */

            uint32_t FSMC_NAND_WriteSmallPage(uint8_t *pBuffer, uint32_t PageAddress, uint32_t NumPageToWrite)
            {
            uint32_t index = 0x00, numpagewritten = 0x00,addressstatus = NAND_VALID_ADDRESS;
            uint32_t status = NAND_READY, size = 0x00;
            uint32_t data = 0xff;

            while((NumPageToWrite != 0x00) && (addressstatus == NAND_VALID_ADDRESS) && (status == NAND_READY))
            {
            /* Page write command and address */
            *(__IO uint8_t *)(Bank_NAND_ADDR | CMD_AREA) = NAND_CMD_WRITE0;

            *(__IO uint8_t *)(Bank_NAND_ADDR | ADDR_AREA) = ADDR_1st_CYCLE(PageAddress);
            *(__IO uint8_t *)(Bank_NAND_ADDR | ADDR_AREA) = ADDR_2nd_CYCLE(PageAddress);
            *(__IO uint8_t *)(Bank_NAND_ADDR | ADDR_AREA) = ADDR_3rd_CYCLE(PageAddress);
            *(__IO uint8_t *)(Bank_NAND_ADDR | ADDR_AREA) = ADDR_4th_CYCLE(PageAddress);

            /* Calculate the size */
            size = NAND_PAGE_SIZE + (NAND_PAGE_SIZE * numpagewritten);

            /* Write data */
            for(; index < size; index++)
            {
            *(__IO uint8_t *)(Bank_NAND_ADDR | DATA_AREA) = pBuffer[index];
            }

            *(__IO uint8_t *)(Bank_NAND_ADDR | CMD_AREA) = NAND_CMD_WRITE1;

            while( GPIO_ReadInputDataBit(GPIOG, GPIO_Pin_6) == 0 );

            /* Check status for successful operation */
            status = FSMC_NAND_GetStatus();

            data = *(__IO uint8_t *)(Bank_NAND_ADDR | DATA_AREA);
            if(!(data&0x1)) status = NAND_READY;

            if(status == NAND_READY)
            {
            numpagewritten++; NumPageToWrite--;

            /* Calculate Next small page Address */
            if(PageAddress++ > (NAND_MAX_ZONE*NAND_ZONE_SIZE*NAND_BLOCK_SIZE))
            {addressstatus = NAND_INVALID_ADDRESS;}
            }
            }

            return (status | addressstatus);
            }

            /**
            * @brief This routine is for sequential read from one or several
            * 2048 Bytes Page size.
            * @param pBuffer: pointer on the Buffer to fill
            * @param PageAddress: First page address
            * @param NumPageToRead: Number of page to read
            * @retval : New status of the NAND operation. This parameter can be:
            * - NAND_TIMEOUT_ERROR: when the previous operation generate
            * a Timeout error
            * - NAND_READY: when memory is ready for the next operation
            * And the new status of the increment address operation. It can be:
            * - NAND_VALID_ADDRESS: When the new address is valid address
            * - NAND_INVALID_ADDRESS: When the new address is invalid address
            */


            uint32_t FSMC_NAND_ReadSmallPage(uint8_t *pBuffer, uint32_t PageAddress, uint32_t NumPageToRead)
            {
            uint32_t index = 0x00, numpageread = 0x00, addressstatus = NAND_VALID_ADDRESS;
            uint32_t status = NAND_READY, size = 0x00;

            *(__IO uint8_t *)(Bank_NAND_ADDR | CMD_AREA) = NAND_CMD_READ1;

            while((NumPageToRead != 0x0) && (addressstatus == NAND_VALID_ADDRESS))
            {
            /* Page Read command and page address */

            *(__IO uint8_t *)(Bank_NAND_ADDR | ADDR_AREA) = ADDR_1st_CYCLE(PageAddress);
            *(__IO uint8_t *)(Bank_NAND_ADDR | ADDR_AREA) = ADDR_2nd_CYCLE(PageAddress);
            *(__IO uint8_t *)(Bank_NAND_ADDR | ADDR_AREA) = ADDR_3rd_CYCLE(PageAddress);
            *(__IO uint8_t *)(Bank_NAND_ADDR | ADDR_AREA) = ADDR_4th_CYCLE(PageAddress);

            *(__IO uint8_t *)(Bank_NAND_ADDR | CMD_AREA) = NAND_CMD_READ2;

            while( GPIO_ReadInputDataBit(GPIOG, GPIO_Pin_6) == 0 );

            /* Calculate the size */
            size = NAND_PAGE_SIZE + (NAND_PAGE_SIZE * numpageread);

            /* Get Data into Buffer */
            for(; index < size; index++)
            {
            pBuffer[index]= *(__IO uint8_t *)(Bank_NAND_ADDR | DATA_AREA);
            }

            numpageread++;NumPageToRead--;

            /* Calculate page address */
            if(PageAddress++ > (NAND_MAX_ZONE*NAND_ZONE_SIZE*NAND_BLOCK_SIZE))
            {addressstatus = NAND_INVALID_ADDRESS;}
            }

            status = FSMC_NAND_GetStatus();

            return (status | addressstatus);
            }

            /**
            * @brief This routine erase complete block from NAND FLASH
            * @param PageAddress: Any address into block to be erased
            * @retval :New status of the NAND operation. This parameter can be:
            * - NAND_TIMEOUT_ERROR: when the previous operation generate
            * a Timeout error
            * - NAND_READY: when memory is ready for the next operation
            */

            uint32_t FSMC_NAND_EraseBlock(uint32_t PageAddress)
            {
            uint32_t data = 0xff, status = NAND_ERROR;

            *(__IO uint8_t *)(Bank_NAND_ADDR | CMD_AREA) = NAND_CMD_ERASE0;

            *(__IO uint8_t *)(Bank_NAND_ADDR | ADDR_AREA) = ADDR_3rd_CYCLE(PageAddress);
            *(__IO uint8_t *)(Bank_NAND_ADDR | ADDR_AREA) = ADDR_4th_CYCLE(PageAddress);

            *(__IO uint8_t *)(Bank_NAND_ADDR | CMD_AREA) = NAND_CMD_ERASE1;

            while( GPIO_ReadInputDataBit(GPIOG, GPIO_Pin_6) == 0 );

            /* Read status operation ------------------------------------ */
            FSMC_NAND_GetStatus();

            data = *(__IO uint8_t *)(Bank_NAND_ADDR | DATA_AREA);

            if(!(data&0x1)) status = NAND_READY;

            return (status);
            }

            /**
            * @brief This routine reset the NAND FLASH
            * @param None
            * @retval :NAND_READY
            */

            uint32_t FSMC_NAND_Reset(void)
            {
            *(__IO uint8_t *)(Bank_NAND_ADDR | CMD_AREA) = NAND_CMD_RESET;

            return (NAND_READY);
            }

            /**
            * @brief Get the NAND operation status
            * @param None
            * @retval :New status of the NAND operation. This parameter can be:
            * - NAND_TIMEOUT_ERROR: when the previous operation generate
            * a Timeout error
            * - NAND_READY: when memory is ready for the next operation
            */


            uint32_t FSMC_NAND_GetStatus(void)
            {
            uint32_t timeout = 0x1000000, status = NAND_READY;

            status = FSMC_NAND_ReadStatus();

            /* Wait for a NAND operation to complete or a TIMEOUT to occur */
            while ((status != NAND_READY) &&( timeout != 0x00))
            {
            status = FSMC_NAND_ReadStatus();
            timeout --;
            }

            if(timeout == 0x00)
            {
            status = NAND_TIMEOUT_ERROR;
            }

            /* Return the operation status */
            return (status);
            }

            /**
            * @brief Reads the NAND memory status using the Read status command
            * @param None
            * @retval :The status of the NAND memory. This parameter can be:
            * - NAND_BUSY: when memory is busy
            * - NAND_READY: when memory is ready for the next operation
            * - NAND_ERROR: when the previous operation gererates error
            */

            uint32_t FSMC_NAND_ReadStatus(void)
            {
            uint32_t data = 0x00, status = NAND_BUSY;

            /* Read status operation ------------------------------------ */
            *(__IO uint8_t *)(Bank_NAND_ADDR | CMD_AREA) = NAND_CMD_STATUS;
            data = *(__IO uint8_t *)(Bank_NAND_ADDR);

            if((data & NAND_ERROR) == NAND_ERROR)
            {
            status = NAND_ERROR;
            }
            else if((data & NAND_READY) == NAND_READY)
            {
            status = NAND_READY;
            }
            else
            {
            status = NAND_BUSY;
            }

            return (status);
            }
            2,fsmc_nand.h文件:
            /* Define to prevent recursive inclusion -------------------------------------*/
            #ifndef __FSMC_NAND_H
            #define __FSMC_NAND_H

            /* Includes ------------------------------------------------------------------*/
            #include "stm32f10x.h"

            /* Exported types ------------------------------------------------------------*/
            typedef struct
            {
            uint8_t Maker_ID;
            uint8_t Device_ID;
            uint8_t Third_ID;
            uint8_t Fourth_ID;
            }NAND_IDTypeDef;

            typedef struct
            {
            uint16_t Zone;
            uint16_t Block;
            uint16_t Page;
            } NAND_ADDRESS;

            /* Exported constants --------------------------------------------------------*/
            /* NAND Area definition for STM3210E-EVAL Board RevD */
            #define CMD_AREA (uint32_t)(1<<16) /* A16 = CLE high */
            #define ADDR_AREA (uint32_t)(1<<17) /* A17 = ALE high */
            #define DATA_AREA ((uint32_t)0x00000000)

            /* FSMC NAND memory command */
            #defineNAND_CMD_READ1 ((uint8_t)0x00)
            #define NAND_CMD_READ2 ((uint8_t)0x30)

            #define NAND_CMD_WRITE0 ((uint8_t)0x80)
            #define NAND_CMD_WRITE1 ((uint8_t)0x10)

            #define NAND_CMD_MOVE0 ((uint8_t)0x00)
            #define NAND_CMD_MOVE1 ((uint8_t)0x35)
            #define NAND_CMD_MOVE2 ((uint8_t)0x85)
            #define NAND_CMD_MOVE3 ((uint8_t)0x10)

            #define NAND_CMD_ERASE0 ((uint8_t)0x60)
            #define NAND_CMD_ERASE1 ((uint8_t)0xD0)

            #define NAND_CMD_READID ((uint8_t)0x90)
            #define NAND_CMD_IDADDR ((uint8_t)0x00)

            #define NAND_CMD_STATUS ((uint8_t)0x70)
            #define NAND_CMD_RESET ((uint8_t)0xFF)

            /* NAND memory status */
            #define NAND_VALID_ADDRESS ((uint32_t)0x00000100)
            #define NAND_INVALID_ADDRESS ((uint32_t)0x00000200)
            #define NAND_TIMEOUT_ERROR ((uint32_t)0x00000400)
            #define NAND_BUSY ((uint32_t)0x00000000)
            #define NAND_ERROR ((uint32_t)0x00000001)
            #define NAND_READY ((uint32_t)0x00000040)

            /* FSMC NAND memory parameters */
            //#define NAND_PAGE_SIZE ((uint16_t)0x0200) /* 512 bytes per page w/o Spare Area */
            //#define NAND_BLOCK_SIZE ((uint16_t)0x0020) /* 32x512 bytes pages per block */
            //#define NAND_ZONE_SIZE ((uint16_t)0x0400) /* 1024 Block per zone */
            //#define NAND_SPARE_AREA_SIZE ((uint16_t)0x0010) /* last 16 bytes as spare area */
            //#define NAND_MAX_ZONE ((uint16_t)0x0004) /* 4 zones of 1024 block */

            /* FSMC NAND memory HY27UF081G2A-TPCB parameters */
            #define NAND_PAGE_SIZE ((uint16_t)0x0800) /* 2048 bytes per page w/o Spare Area */
            #define NAND_BLOCK_SIZE ((uint16_t)0x0040) /* 64x2048 bytes pages per block */
            #define NAND_ZONE_SIZE ((uint16_t)0x0200) /* 512 Block per zone */
            #define NAND_SPARE_AREA_SIZE ((uint16_t)0x0040) /* last 64 bytes as spare area */
            #define NAND_MAX_ZONE ((uint16_t)0x0002) /* 2 zones of 1024 block */

            /* FSMC NAND memory data computation */
            #define DATA_1st_CYCLE(DATA) (uint8_t)((DATA)& 0xFF) /* 1st data cycle */
            #define DATA_2nd_CYCLE(DATA) (uint8_t)(((DATA)& 0xFF00) >> 8) /* 2nd data cycle */
            #define DATA_3rd_CYCLE(DATA) (uint8_t)(((DATA)& 0xFF0000) >> 16) /* 3rd data cycle */
            #define DATA_4th_CYCLE(DATA) (uint8_t)(((DATA)& 0xFF000000) >> 24) /* 4th data cycle */

            /* FSMC NAND memory HY27UF081G2A-TPCB address computation */
            #define ADDR_1st_CYCLE(PADDR) (uint8_t)(0x0) /* 1st addressing cycle */
            #define ADDR_2nd_CYCLE(PADDR) (uint8_t)(0x0)/* 2nd addressing cycle */
            #define ADDR_3rd_CYCLE(PADDR) (uint8_t)(PADDR & 0xFF) /* 3rd addressing cycle */
            #define ADDR_4th_CYCLE(PADDR) (uint8_t)((PADDR>>8) & 0xFF)/* 4th addressing cycle */

            /* Exported macro ------------------------------------------------------------*/
            /* Exported functions ------------------------------------------------------- */
            void FSMC_NAND_Init(void);
            void FSMC_NAND_ReadID(NAND_IDTypeDef* NAND_ID);
            uint32_t FSMC_NAND_WriteSmallPage(uint8_t *pBuffer, uint32_t Address, uint32_t NumPageToWrite);
            uint32_t FSMC_NAND_ReadSmallPage (uint8_t *pBuffer, uint32_t Address, uint32_t NumPageToRead);
            uint32_t FSMC_NAND_MoveSmallPage (uint32_t SourcePageAddress, uint32_t TargetPageAddress);
            //uint32_t FSMC_NAND_WriteSpareArea(uint8_t *pBuffer, NAND_ADDRESS Address, uint32_t NumSpareAreaTowrite);
            //uint32_t FSMC_NAND_ReadSpareArea(uint8_t *pBuffer, NAND_ADDRESS Address, uint32_t NumSpareAreaToRead);
            uint32_t FSMC_NAND_EraseBlock(uint32_t Address);
            uint32_t FSMC_NAND_Reset(void);
            uint32_t FSMC_NAND_GetStatus(void);
            uint32_t FSMC_NAND_ReadStatus(void);
            //uint32_t FSMC_NAND_AddressIncrement(NAND_ADDRESS* Address);

            #endif /* __FSMC_NAND_H */
            七,NFTL代碼層
            有關(guān)NFTL代碼,自行處理。

            本文引用地址:http://www.biyoush.com/article/201611/323209.htm

            上一頁 1 2 下一頁

            關(guān)鍵詞: 9G-STM32EWARM開發(fā)過

            評論


            技術(shù)專區(qū)

            關(guān)閉