STM32769I_EVAL BSP User Manual
|
stm32f769i_eval_nor.c
Go to the documentation of this file.
00001 /** 00002 ****************************************************************************** 00003 * @file stm32f769i_eval_nor.c 00004 * @author MCD Application Team 00005 * @version V2.0.1 00006 * @date 06-April-2017 00007 * @brief This file includes a standard driver for the PC28F128M29EWLA NOR flash memory 00008 * device mounted on STM32F769I-EVAL evaluation boards. 00009 @verbatim 00010 How To use this driver: 00011 ----------------------- 00012 - This driver is used to drive the PC28F128M29EWLA NOR flash external memory mounted 00013 on STM32F769I-EVAL evaluation board. 00014 - This driver does not need a specific component driver for the NOR device 00015 to be included with. 00016 00017 Driver description: 00018 ------------------ 00019 + Initialization steps: 00020 o Initialize the NOR external memory using the BSP_NOR_Init() function. This 00021 function includes the MSP layer hardware resources initialization and the 00022 FMC controller configuration to interface with the external NOR memory. 00023 00024 + NOR flash operations 00025 o NOR external memory can be accessed with read/write operations once it is 00026 initialized. 00027 Read/write operation can be performed with AHB access using the functions 00028 BSP_NOR_ReadData()/BSP_NOR_WriteData(). The BSP_NOR_WriteData() performs write operation 00029 of an amount of data by unit (halfword). You can also perform a program data 00030 operation of an amount of data using the function BSP_NOR_ProgramData(). 00031 o The function BSP_NOR_Read_ID() returns the chip IDs stored in the structure 00032 "NOR_IDTypeDef". (see the NOR IDs in the memory data sheet) 00033 o Perform erase block operation using the function BSP_NOR_Erase_Block() and by 00034 specifying the block address. You can perform an erase operation of the whole 00035 chip by calling the function BSP_NOR_Erase_Chip(). 00036 o After other operations, the function BSP_NOR_ReturnToReadMode() allows the NOR 00037 flash to return to read mode to perform read operations on it. 00038 @endverbatim 00039 ****************************************************************************** 00040 * @attention 00041 * 00042 * <h2><center>© COPYRIGHT(c) 2017 STMicroelectronics</center></h2> 00043 * 00044 * Redistribution and use in source and binary forms, with or without modification, 00045 * are permitted provided that the following conditions are met: 00046 * 1. Redistributions of source code must retain the above copyright notice, 00047 * this list of conditions and the following disclaimer. 00048 * 2. Redistributions in binary form must reproduce the above copyright notice, 00049 * this list of conditions and the following disclaimer in the documentation 00050 * and/or other materials provided with the distribution. 00051 * 3. Neither the name of STMicroelectronics nor the names of its contributors 00052 * may be used to endorse or promote products derived from this software 00053 * without specific prior written permission. 00054 * 00055 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 00056 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 00057 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 00058 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE 00059 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 00060 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 00061 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER 00062 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 00063 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 00064 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 00065 * 00066 ****************************************************************************** 00067 */ 00068 00069 /* Dependencies 00070 - stm32f7xx_hal_nor.c 00071 - stm32f7xx_ll_fmc.c 00072 - stm32f7xx_hal_gpio.c 00073 - stm32f7xx_hal_rcc_ex.h 00074 EndDependencies */ 00075 00076 /* Includes ------------------------------------------------------------------*/ 00077 #include "stm32f769i_eval_nor.h" 00078 00079 /** @addtogroup BSP 00080 * @{ 00081 */ 00082 00083 /** @addtogroup STM32F769I_EVAL 00084 * @{ 00085 */ 00086 00087 /** @defgroup STM32F769I_EVAL_NOR STM32F769I_EVAL NOR 00088 * @{ 00089 */ 00090 00091 /* Private typedef -----------------------------------------------------------*/ 00092 00093 /** @defgroup STM32F769I_EVAL_NOR_Private_Types_Definitions NOR Private Types Definitions 00094 * @{ 00095 */ 00096 /** 00097 * @} 00098 */ 00099 /* Private define ------------------------------------------------------------*/ 00100 00101 /** @defgroup STM32F769I_EVAL_NOR_Private_Defines NOR Private Defines 00102 * @{ 00103 */ 00104 /** 00105 * @} 00106 */ 00107 /* Private macro -------------------------------------------------------------*/ 00108 00109 /** @defgroup STM32F769I_EVAL_NOR_Private_Macros NOR Private Macros 00110 * @{ 00111 */ 00112 /** 00113 * @} 00114 */ 00115 /* Private variables ---------------------------------------------------------*/ 00116 00117 /** @defgroup STM32F769I_EVAL_NOR_Private_Variables NOR Private Variables 00118 * @{ 00119 */ 00120 NOR_HandleTypeDef norHandle; 00121 static FMC_NORSRAM_TimingTypeDef Timing; 00122 00123 /** 00124 * @} 00125 */ 00126 00127 /* Private function prototypes -----------------------------------------------*/ 00128 00129 /** @defgroup STM32F769I_EVAL_NOR_Private_Functions_Prototypes NOR Private Functions Prototypes 00130 * @{ 00131 */ 00132 /** 00133 * @} 00134 */ 00135 /* Private functions ---------------------------------------------------------*/ 00136 00137 /** @defgroup STM32F769I_EVAL_NOR_Private_Functions NOR Private Functions 00138 * @{ 00139 */ 00140 00141 /** 00142 * @brief Initializes the NOR device. 00143 * @retval NOR memory status 00144 */ 00145 uint8_t BSP_NOR_Init(void) 00146 { 00147 static uint8_t nor_status = NOR_STATUS_ERROR; 00148 norHandle.Instance = FMC_NORSRAM_DEVICE; 00149 norHandle.Extended = FMC_NORSRAM_EXTENDED_DEVICE; 00150 00151 /* NOR device configuration */ 00152 /* Timing configuration derived from system clock (up to 216Mhz) 00153 for 108Mhz as NOR clock frequency */ 00154 Timing.AddressSetupTime = 4; 00155 Timing.AddressHoldTime = 3; 00156 Timing.DataSetupTime = 8; 00157 Timing.BusTurnAroundDuration = 1; 00158 Timing.CLKDivision = 2; 00159 Timing.DataLatency = 2; 00160 Timing.AccessMode = FMC_ACCESS_MODE_A; 00161 00162 norHandle.Init.NSBank = FMC_NORSRAM_BANK1; 00163 norHandle.Init.DataAddressMux = FMC_DATA_ADDRESS_MUX_DISABLE; 00164 norHandle.Init.MemoryType = FMC_MEMORY_TYPE_NOR; 00165 norHandle.Init.MemoryDataWidth = NOR_MEMORY_WIDTH; 00166 norHandle.Init.BurstAccessMode = NOR_BURSTACCESS; 00167 norHandle.Init.WaitSignalPolarity = FMC_WAIT_SIGNAL_POLARITY_LOW; 00168 norHandle.Init.WaitSignalActive = FMC_WAIT_TIMING_BEFORE_WS; 00169 norHandle.Init.WriteOperation = FMC_WRITE_OPERATION_ENABLE; 00170 norHandle.Init.WaitSignal = FMC_WAIT_SIGNAL_ENABLE; 00171 norHandle.Init.ExtendedMode = FMC_EXTENDED_MODE_DISABLE; 00172 norHandle.Init.AsynchronousWait = FMC_ASYNCHRONOUS_WAIT_ENABLE; 00173 norHandle.Init.WriteBurst = NOR_WRITEBURST; 00174 norHandle.Init.ContinuousClock = CONTINUOUSCLOCK_FEATURE; 00175 00176 /* NOR controller initialization */ 00177 BSP_NOR_MspInit(&norHandle, NULL); /* __weak function can be rewritten by the application */ 00178 00179 if(HAL_NOR_Init(&norHandle, &Timing, &Timing) != HAL_OK) 00180 { 00181 nor_status = NOR_STATUS_ERROR; 00182 } 00183 else 00184 { 00185 nor_status = NOR_STATUS_OK; 00186 } 00187 return nor_status; 00188 } 00189 00190 /** 00191 * @brief DeInitializes the NOR device. 00192 * @retval NOR status 00193 */ 00194 uint8_t BSP_NOR_DeInit(void) 00195 { 00196 static uint8_t nor_status = NOR_STATUS_ERROR; 00197 /* NOR device de-initialization */ 00198 norHandle.Instance = FMC_NORSRAM_DEVICE; 00199 norHandle.Extended = FMC_NORSRAM_EXTENDED_DEVICE; 00200 00201 if(HAL_NOR_DeInit(&norHandle) != HAL_OK) 00202 { 00203 nor_status = NOR_STATUS_ERROR; 00204 } 00205 else 00206 { 00207 nor_status = NOR_STATUS_OK; 00208 } 00209 00210 /* NOR controller de-initialization */ 00211 BSP_NOR_MspDeInit(&norHandle, NULL); 00212 00213 return nor_status; 00214 } 00215 00216 /** 00217 * @brief Reads an amount of data from the NOR device. 00218 * @param uwStartAddress: Read start address 00219 * @param pData: Pointer to data to be read 00220 * @param uwDataSize: Size of data to read 00221 * @retval NOR memory status 00222 */ 00223 uint8_t BSP_NOR_ReadData(uint32_t uwStartAddress, uint16_t* pData, uint32_t uwDataSize) 00224 { 00225 if(HAL_NOR_ReadBuffer(&norHandle, NOR_DEVICE_ADDR + uwStartAddress, pData, uwDataSize) != HAL_OK) 00226 { 00227 return NOR_STATUS_ERROR; 00228 } 00229 else 00230 { 00231 return NOR_STATUS_OK; 00232 } 00233 } 00234 00235 /** 00236 * @brief Returns the NOR memory to read mode. 00237 * @retval None 00238 */ 00239 void BSP_NOR_ReturnToReadMode(void) 00240 { 00241 HAL_NOR_ReturnToReadMode(&norHandle); 00242 } 00243 00244 /** 00245 * @brief Writes an amount of data to the NOR device. 00246 * @param uwStartAddress: Write start address 00247 * @param pData: Pointer to data to be written 00248 * @param uwDataSize: Size of data to write 00249 * @retval NOR memory status 00250 */ 00251 uint8_t BSP_NOR_WriteData(uint32_t uwStartAddress, uint16_t* pData, uint32_t uwDataSize) 00252 { 00253 uint32_t index = uwDataSize; 00254 00255 while(index > 0) 00256 { 00257 /* Write data to NOR */ 00258 HAL_NOR_Program(&norHandle, (uint32_t *)(NOR_DEVICE_ADDR + uwStartAddress), pData); 00259 00260 /* Read NOR device status */ 00261 if(HAL_NOR_GetStatus(&norHandle, NOR_DEVICE_ADDR, PROGRAM_TIMEOUT) != HAL_NOR_STATUS_SUCCESS) 00262 { 00263 return NOR_STATUS_ERROR; 00264 } 00265 00266 /* Update the counters */ 00267 index--; 00268 uwStartAddress += 2; 00269 pData++; 00270 } 00271 00272 return NOR_STATUS_OK; 00273 } 00274 00275 /** 00276 * @brief Programs an amount of data to the NOR device. 00277 * @param uwStartAddress: Write start address 00278 * @param pData: Pointer to data to be written 00279 * @param uwDataSize: Size of data to write 00280 * @retval NOR memory status 00281 */ 00282 uint8_t BSP_NOR_ProgramData(uint32_t uwStartAddress, uint16_t* pData, uint32_t uwDataSize) 00283 { 00284 /* Send NOR program buffer operation */ 00285 HAL_NOR_ProgramBuffer(&norHandle, uwStartAddress, pData, uwDataSize); 00286 00287 /* Return the NOR memory status */ 00288 if(HAL_NOR_GetStatus(&norHandle, NOR_DEVICE_ADDR, PROGRAM_TIMEOUT) != HAL_NOR_STATUS_SUCCESS) 00289 { 00290 return NOR_STATUS_ERROR; 00291 } 00292 else 00293 { 00294 return NOR_STATUS_OK; 00295 } 00296 } 00297 00298 /** 00299 * @brief Erases the specified block of the NOR device. 00300 * @param BlockAddress: Block address to erase 00301 * @retval NOR memory status 00302 */ 00303 uint8_t BSP_NOR_Erase_Block(uint32_t BlockAddress) 00304 { 00305 /* Send NOR erase block operation */ 00306 HAL_NOR_Erase_Block(&norHandle, BlockAddress, NOR_DEVICE_ADDR); 00307 00308 /* Return the NOR memory status */ 00309 if(HAL_NOR_GetStatus(&norHandle, NOR_DEVICE_ADDR, BLOCKERASE_TIMEOUT) != HAL_NOR_STATUS_SUCCESS) 00310 { 00311 return NOR_STATUS_ERROR; 00312 } 00313 else 00314 { 00315 return NOR_STATUS_OK; 00316 } 00317 } 00318 00319 /** 00320 * @brief Erases the entire NOR chip. 00321 * @retval NOR memory status 00322 */ 00323 uint8_t BSP_NOR_Erase_Chip(void) 00324 { 00325 /* Send NOR Erase chip operation */ 00326 HAL_NOR_Erase_Chip(&norHandle, NOR_DEVICE_ADDR); 00327 00328 /* Return the NOR memory status */ 00329 if(HAL_NOR_GetStatus(&norHandle, NOR_DEVICE_ADDR, CHIPERASE_TIMEOUT) != HAL_NOR_STATUS_SUCCESS) 00330 { 00331 return NOR_STATUS_ERROR; 00332 } 00333 else 00334 { 00335 return NOR_STATUS_OK; 00336 } 00337 } 00338 00339 /** 00340 * @brief Reads NOR flash IDs. 00341 * @param pNOR_ID : Pointer to NOR ID structure 00342 * @retval NOR memory status 00343 */ 00344 uint8_t BSP_NOR_Read_ID(NOR_IDTypeDef *pNOR_ID) 00345 { 00346 if(HAL_NOR_Read_ID(&norHandle, pNOR_ID) != HAL_OK) 00347 { 00348 return NOR_STATUS_ERROR; 00349 } 00350 else 00351 { 00352 return NOR_STATUS_OK; 00353 } 00354 } 00355 00356 /** 00357 * @brief Initializes the NOR MSP. 00358 * @param norHandle: NOR handle 00359 * @param Params 00360 * @retval None 00361 */ 00362 __weak void BSP_NOR_MspInit(NOR_HandleTypeDef *norHandle, void *Params) 00363 { 00364 GPIO_InitTypeDef gpio_init_structure; 00365 00366 /* Enable FMC clock */ 00367 __HAL_RCC_FMC_CLK_ENABLE(); 00368 00369 /* Enable GPIOs clock */ 00370 __HAL_RCC_GPIOD_CLK_ENABLE(); 00371 __HAL_RCC_GPIOC_CLK_ENABLE(); 00372 __HAL_RCC_GPIOE_CLK_ENABLE(); 00373 __HAL_RCC_GPIOF_CLK_ENABLE(); 00374 __HAL_RCC_GPIOG_CLK_ENABLE(); 00375 00376 /* Common GPIO configuration */ 00377 gpio_init_structure.Mode = GPIO_MODE_AF_PP; 00378 gpio_init_structure.Pull = GPIO_PULLUP; 00379 gpio_init_structure.Speed = GPIO_SPEED_FREQ_VERY_HIGH; 00380 00381 /* GPIOC configuration */ 00382 gpio_init_structure.Alternate = GPIO_AF9_FMC; 00383 gpio_init_structure.Pin = GPIO_PIN_6 | GPIO_PIN_7; 00384 HAL_GPIO_Init(GPIOC, &gpio_init_structure); 00385 00386 /* GPIOD configuration */ 00387 gpio_init_structure.Alternate = GPIO_AF12_FMC; 00388 gpio_init_structure.Pin = GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_4 | GPIO_PIN_5|\ 00389 GPIO_PIN_8 | GPIO_PIN_9 | GPIO_PIN_10 | GPIO_PIN_11 |\ 00390 GPIO_PIN_12 | GPIO_PIN_13 | GPIO_PIN_14 | GPIO_PIN_15; 00391 HAL_GPIO_Init(GPIOD, &gpio_init_structure); 00392 00393 /* GPIOE configuration */ 00394 gpio_init_structure.Pin = GPIO_PIN_2 | GPIO_PIN_3 | GPIO_PIN_4 | GPIO_PIN_5 | GPIO_PIN_6 |\ 00395 GPIO_PIN_7 | GPIO_PIN_8 | GPIO_PIN_9 | GPIO_PIN_10 | GPIO_PIN_11 |\ 00396 GPIO_PIN_12 | GPIO_PIN_13 | GPIO_PIN_14 | GPIO_PIN_15; 00397 HAL_GPIO_Init(GPIOE, &gpio_init_structure); 00398 00399 /* GPIOF configuration */ 00400 gpio_init_structure.Pin = GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2| GPIO_PIN_3 | GPIO_PIN_4 |\ 00401 GPIO_PIN_5 | GPIO_PIN_12 | GPIO_PIN_13 | GPIO_PIN_14 | GPIO_PIN_15; 00402 HAL_GPIO_Init(GPIOF, &gpio_init_structure); 00403 00404 /* GPIOG configuration */ 00405 gpio_init_structure.Pin = GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2| GPIO_PIN_3 | GPIO_PIN_4 |\ 00406 GPIO_PIN_5; 00407 HAL_GPIO_Init(GPIOG, &gpio_init_structure); 00408 } 00409 00410 /** 00411 * @brief DeInitializes NOR MSP. 00412 * @param norHandle: NOR handle 00413 * @param Params 00414 * @retval None 00415 */ 00416 __weak void BSP_NOR_MspDeInit(NOR_HandleTypeDef *norHandle, void *Params) 00417 { 00418 /* GPIO pins clock, FMC clock can be shut down in the application 00419 by surcharging this __weak function */ 00420 } 00421 00422 /** 00423 * @brief NOR BSP Wait for Ready/Busy signal. 00424 * @param norHandle: Pointer to NOR handle 00425 * @param Timeout: Timeout duration 00426 * @retval None 00427 */ 00428 void HAL_NOR_MspWait(NOR_HandleTypeDef *norHandle, uint32_t Timeout) 00429 { 00430 uint32_t timeout = Timeout; 00431 00432 /* Polling on Ready/Busy signal */ 00433 while((HAL_GPIO_ReadPin(NOR_READY_BUSY_GPIO, NOR_READY_BUSY_PIN) != NOR_BUSY_STATE) && (timeout > 0)) 00434 { 00435 timeout--; 00436 } 00437 00438 timeout = Timeout; 00439 00440 /* Polling on Ready/Busy signal */ 00441 while((HAL_GPIO_ReadPin(NOR_READY_BUSY_GPIO, NOR_READY_BUSY_PIN) != NOR_READY_STATE) && (timeout > 0)) 00442 { 00443 timeout--; 00444 } 00445 } 00446 00447 /** 00448 * @} 00449 */ 00450 00451 /** 00452 * @} 00453 */ 00454 00455 /** 00456 * @} 00457 */ 00458 00459 /** 00460 * @} 00461 */ 00462 00463 /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
Generated on Thu May 25 2017 11:03:11 for STM32769I_EVAL BSP User Manual by 1.7.6.1