/** ****************************************************************************** * @file stm324x9i_eval_nor.c * @author MCD Application Team * @version V2.2.1 * @date 07-October-2015 * @brief This file includes a standard driver for the M29W256GL70ZA6E NOR flash memory * device mounted on STM324x9I-EVAL evaluation board. ****************************************************************************** * @attention * *

© COPYRIGHT(c) 2015 STMicroelectronics

* * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: * 1. Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * 3. Neither the name of STMicroelectronics nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * ****************************************************************************** */ /* File Info : ----------------------------------------------------------------- User NOTES 1. How To use this driver: -------------------------- - This driver is used to drive the M29W128GL NOR flash external memory mounted on STM324x9I-EVAL evaluation board. - This driver does not need a specific component driver for the NOR device to be included with. 2. Driver description: --------------------- + Initialization steps: o Initialize the NOR external memory using the BSP_NOR_Init() function. This function includes the MSP layer hardware resources initialization and the FMC controller configuration to interface with the external NOR memory. + NOR flash operations o NOR external memory can be accessed with read/write operations once it is initialized. Read/write operation can be performed with AHB access using the functions BSP_NOR_ReadData()/BSP_NOR_WriteData(). The BSP_NOR_WriteData() performs write operation of an amount of data by unit (halfword). You can also perform a program data operation of an amount of data using the function BSP_NOR_ProgramData(). o The function BSP_NOR_Read_ID() returns the chip IDs stored in the structure "NOR_IDTypeDef". (see the NOR IDs in the memory data sheet) o Perform erase block operation using the function BSP_NOR_Erase_Block() and by specifying the block address. You can perform an erase operation of the whole chip by calling the function BSP_NOR_Erase_Chip(). o After other operations, the function BSP_NOR_ReturnToReadMode() allows the NOR flash to return to read mode to perform read operations on it. ------------------------------------------------------------------------------*/ /* Includes ------------------------------------------------------------------*/ #include "stm324x9i_eval_nor.h" /** @addtogroup BSP * @{ */ /** @addtogroup STM324x9I_EVAL * @{ */ /** @defgroup STM324x9I_EVAL_NOR * @{ */ /* Private typedef -----------------------------------------------------------*/ /** @defgroup STM324x9I_EVAL_NOR_Private_Types_Definitions * @{ */ /* Private define ------------------------------------------------------------*/ /** @defgroup STM324x9I_EVAL_NOR_Private_Defines * @{ */ /* Private macro -------------------------------------------------------------*/ /** @defgroup STM324x9I_EVAL_NOR_Private_Macros * @{ */ /* Private variables ---------------------------------------------------------*/ /** @defgroup STM324x9I_EVAL_NOR_Private_Variables * @{ */ static NOR_HandleTypeDef norHandle; static FMC_NORSRAM_TimingTypeDef Timing; /** * @} */ /* Private function prototypes -----------------------------------------------*/ /** @defgroup STM324x9I_EVAL_NOR_Private_Function_Prototypes * @{ */ /* Private functions ---------------------------------------------------------*/ /** @defgroup STM324x9I_EVAL_NOR_Private_Functions * @{ */ static void NOR_MspInit(void); /** * @} */ /** * @brief Initializes the NOR device. * @param None * @retval NOR memory status */ uint8_t BSP_NOR_Init(void) { norHandle.Instance = FMC_NORSRAM_DEVICE; norHandle.Extended = FMC_NORSRAM_EXTENDED_DEVICE; /* NOR device configuration */ Timing.AddressSetupTime = 4; Timing.AddressHoldTime = 3; Timing.DataSetupTime = 7; Timing.BusTurnAroundDuration = 1; Timing.CLKDivision = 2; Timing.DataLatency = 2; Timing.AccessMode = FMC_ACCESS_MODE_A; norHandle.Init.NSBank = FMC_NORSRAM_BANK1; norHandle.Init.DataAddressMux = FMC_DATA_ADDRESS_MUX_DISABLE; norHandle.Init.MemoryType = FMC_MEMORY_TYPE_NOR; norHandle.Init.MemoryDataWidth = NOR_MEMORY_WIDTH; norHandle.Init.BurstAccessMode = NOR_BURSTACCESS; norHandle.Init.WaitSignalPolarity = FMC_WAIT_SIGNAL_POLARITY_LOW; norHandle.Init.WrapMode = FMC_WRAP_MODE_DISABLE; norHandle.Init.WaitSignalActive = FMC_WAIT_TIMING_BEFORE_WS; norHandle.Init.WriteOperation = FMC_WRITE_OPERATION_ENABLE; norHandle.Init.WaitSignal = FMC_WAIT_SIGNAL_ENABLE; norHandle.Init.ExtendedMode = FMC_EXTENDED_MODE_DISABLE; norHandle.Init.AsynchronousWait = FMC_ASYNCHRONOUS_WAIT_ENABLE; norHandle.Init.WriteBurst = NOR_WRITEBURST; norHandle.Init.ContinuousClock = CONTINUOUSCLOCK_FEATURE; /* NOR controller initialization */ NOR_MspInit(); if(HAL_NOR_Init(&norHandle, &Timing, &Timing) != HAL_OK) { return NOR_STATUS_ERROR; } else { return NOR_STATUS_OK; } } /** * @brief Reads an amount of data from the NOR device. * @param uwStartAddress: Read start address * @param pData: Pointer to data to be read * @param uwDataSize: Size of data to read * @retval NOR memory status */ uint8_t BSP_NOR_ReadData(uint32_t uwStartAddress, uint16_t* pData, uint32_t uwDataSize) { if(HAL_NOR_ReadBuffer(&norHandle, NOR_DEVICE_ADDR + uwStartAddress, pData, uwDataSize) != HAL_OK) { return NOR_STATUS_ERROR; } else { return NOR_STATUS_OK; } } /** * @brief Returns the NOR memory to read mode. * @param None * @retval None */ void BSP_NOR_ReturnToReadMode(void) { HAL_NOR_ReturnToReadMode(&norHandle); } /** * @brief Writes an amount of data to the NOR device. * @param uwStartAddress: Write start address * @param pData: Pointer to data to be written * @param uwDataSize: Size of data to write * @retval NOR memory status */ uint8_t BSP_NOR_WriteData(uint32_t uwStartAddress, uint16_t* pData, uint32_t uwDataSize) { uint32_t index = uwDataSize; while(index > 0) { /* Write data to NOR */ HAL_NOR_Program(&norHandle, (uint32_t *)(NOR_DEVICE_ADDR + uwStartAddress), pData); /* Read NOR device status */ if(HAL_NOR_GetStatus(&norHandle, NOR_DEVICE_ADDR, PROGRAM_TIMEOUT) != NOR_SUCCESS) { return NOR_STATUS_ERROR; } /* Update the counters */ index--; uwStartAddress += 2; pData++; } return NOR_STATUS_OK; } /** * @brief Programs an amount of data to the NOR device. * @param uwStartAddress: Write start address * @param pData: Pointer to data to be written * @param uwDataSize: Size of data to write * @retval NOR memory status */ uint8_t BSP_NOR_ProgramData(uint32_t uwStartAddress, uint16_t* pData, uint32_t uwDataSize) { /* Send NOR program buffer operation */ HAL_NOR_ProgramBuffer(&norHandle, uwStartAddress, pData, uwDataSize); /* Return the NOR memory status */ if(HAL_NOR_GetStatus(&norHandle, NOR_DEVICE_ADDR, PROGRAM_TIMEOUT) != NOR_SUCCESS) { return NOR_STATUS_ERROR; } else { return NOR_STATUS_OK; } } /** * @brief Erases the specified block of the NOR device. * @param BlockAddress: Block address to erase * @retval NOR memory status */ uint8_t BSP_NOR_Erase_Block(uint32_t BlockAddress) { /* Send NOR erase block operation */ HAL_NOR_Erase_Block(&norHandle, BlockAddress, NOR_DEVICE_ADDR); /* Return the NOR memory status */ if(HAL_NOR_GetStatus(&norHandle, NOR_DEVICE_ADDR, BLOCKERASE_TIMEOUT) != NOR_SUCCESS) { return NOR_STATUS_ERROR; } else { return NOR_STATUS_OK; } } /** * @brief Erases the entire NOR chip. * @param None * @retval NOR memory status */ uint8_t BSP_NOR_Erase_Chip(void) { /* Send NOR Erase chip operation */ HAL_NOR_Erase_Chip(&norHandle, NOR_DEVICE_ADDR); /* Return the NOR memory status */ if(HAL_NOR_GetStatus(&norHandle, NOR_DEVICE_ADDR, CHIPERASE_TIMEOUT) != NOR_SUCCESS) { return NOR_STATUS_ERROR; } else { return NOR_STATUS_OK; } } /** * @brief Reads NOR flash IDs. * @param pNOR_ID : Pointer to NOR ID structure * @retval NOR memory status */ uint8_t BSP_NOR_Read_ID(NOR_IDTypeDef *pNOR_ID) { if(HAL_NOR_Read_ID(&norHandle, pNOR_ID) != HAL_OK) { return NOR_STATUS_ERROR; } else { return NOR_STATUS_OK; } } /** * @brief Initializes the NOR MSP. * @param None * @retval None */ static void NOR_MspInit(void) { GPIO_InitTypeDef GPIO_Init_Structure; /* Enable FMC clock */ __FMC_CLK_ENABLE(); /* Enable GPIOs clock */ __GPIOD_CLK_ENABLE(); __GPIOE_CLK_ENABLE(); __GPIOF_CLK_ENABLE(); __GPIOG_CLK_ENABLE(); /* Common GPIO configuration */ GPIO_Init_Structure.Mode = GPIO_MODE_AF_PP; GPIO_Init_Structure.Pull = GPIO_PULLUP; GPIO_Init_Structure.Speed = GPIO_SPEED_HIGH; GPIO_Init_Structure.Alternate = GPIO_AF12_FMC; /* GPIOD configuration */ GPIO_Init_Structure.Pin = GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_4 | GPIO_PIN_5 | GPIO_PIN_6 |\ GPIO_PIN_7 | GPIO_PIN_8 | GPIO_PIN_9 | GPIO_PIN_10 | GPIO_PIN_11 |\ GPIO_PIN_12 | GPIO_PIN_13 | GPIO_PIN_14 | GPIO_PIN_15; HAL_GPIO_Init(GPIOD, &GPIO_Init_Structure); /* GPIOE configuration */ GPIO_Init_Structure.Pin = GPIO_PIN_2 | GPIO_PIN_3 | GPIO_PIN_4 | GPIO_PIN_5 | GPIO_PIN_6 |\ GPIO_PIN_7 | GPIO_PIN_8 | GPIO_PIN_9 | GPIO_PIN_10 | GPIO_PIN_11 |\ GPIO_PIN_12 | GPIO_PIN_13 | GPIO_PIN_14 | GPIO_PIN_15; HAL_GPIO_Init(GPIOE, &GPIO_Init_Structure); /* GPIOF configuration */ GPIO_Init_Structure.Pin = GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2| GPIO_PIN_3 | GPIO_PIN_4 |\ GPIO_PIN_5 | GPIO_PIN_12 | GPIO_PIN_13 | GPIO_PIN_14 | GPIO_PIN_15; HAL_GPIO_Init(GPIOF, &GPIO_Init_Structure); /* GPIOG configuration */ GPIO_Init_Structure.Pin = GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2| GPIO_PIN_3 | GPIO_PIN_4 |\ GPIO_PIN_5; HAL_GPIO_Init(GPIOG, &GPIO_Init_Structure); } /** * @brief NOR BSP Wait for Ready/Busy signal. * @param hnor: Pointer to NOR handle * @param Timeout: Timeout duration * @retval None */ void HAL_NOR_MspWait(NOR_HandleTypeDef *hnor, uint32_t Timeout) { uint32_t timeout = Timeout; /* Polling on Ready/Busy signal */ while((HAL_GPIO_ReadPin(NOR_READY_BUSY_GPIO, NOR_READY_BUSY_PIN) != NOR_BUSY_STATE) && (timeout > 0)) { timeout--; } timeout = Timeout; /* Polling on Ready/Busy signal */ while((HAL_GPIO_ReadPin(NOR_READY_BUSY_GPIO, NOR_READY_BUSY_PIN) != NOR_READY_STATE) && (timeout > 0)) { timeout--; } } /** * @} */ /** * @} */ /** * @} */ /** * @} */ /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/