Restructure libs source to support multi platform
[fw/stlink] / example / libs_stm / src / stm32l1xx / stm32l1xx_flash_ramfunc.c
diff --git a/example/libs_stm/src/stm32l1xx/stm32l1xx_flash_ramfunc.c b/example/libs_stm/src/stm32l1xx/stm32l1xx_flash_ramfunc.c
new file mode 100644 (file)
index 0000000..aefaf96
--- /dev/null
@@ -0,0 +1,385 @@
+/**\r
+  ******************************************************************************\r
+  * @file    stm32l1xx_flash_ramfunc.c\r
+  * @author  MCD Application Team\r
+  * @version V1.0.0\r
+  * @date    31-December-2010\r
+  * @brief   This file provides all the Flash firmware functions which should be\r
+  *          executed from the internal SRAM. This file should be placed in \r
+  *          internal SRAM. \r
+  *          Other FLASH memory functions that can be used from the FLASH are \r
+  *          defined in the "stm32l1xx_flash.c" file. \r
+  *  @verbatim   \r
+  *    \r
+  *          ARM Compiler\r
+  *          ------------\r
+  *          RAM functions are defined using the toolchain options. \r
+  *          Functions that are be executed in RAM should reside in a separate\r
+  *          source module. Using the 'Options for File' dialog you can simply change\r
+  *          the 'Code / Const' area of a module to a memory space in physical RAM.\r
+  *          Available memory areas are declared in the 'Target' tab of the \r
+  *          'Options for Target' dialog.\r
+  *          \r
+  *          ICCARM Compiler\r
+  *          ---------------\r
+  *          RAM functions are defined using a specific toolchain keyword "__ramfunc".  \r
+  *          \r
+  *          GNU Compiler\r
+  *          ------------\r
+  *          RAM functions are defined using a specific toolchain attribute\r
+  *          "__attribute__((section(".data")))".\r
+  *          \r
+  *          TASKING Compiler\r
+  *          ----------------\r
+  *          RAM functions are defined using a specific toolchain pragma. This \r
+  *          pragma is defined inside this file.  \r
+  *          \r
+  *  @endverbatim     \r
+  *\r
+  ******************************************************************************\r
+  * @attention\r
+  *\r
+  * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS\r
+  * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE\r
+  * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY\r
+  * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING\r
+  * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE\r
+  * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.\r
+  *\r
+  * <h2><center>&copy; COPYRIGHT 2010 STMicroelectronics</center></h2>\r
+  ******************************************************************************  \r
+  */ \r
+\r
+/* Includes ------------------------------------------------------------------*/\r
+#include "stm32l1xx_flash.h"\r
+\r
+/** @addtogroup STM32L1xx_StdPeriph_Driver\r
+  * @{\r
+  */\r
+\r
+/** @defgroup FLASH \r
+  * @brief FLASH driver modules\r
+  * @{\r
+  */ \r
+\r
+/* Private typedef -----------------------------------------------------------*/\r
+/* Private define ------------------------------------------------------------*/\r
+/* Private macro -------------------------------------------------------------*/\r
+/* Private variables ---------------------------------------------------------*/\r
+/* Private function prototypes -----------------------------------------------*/\r
+static __RAM_FUNC GetStatus(void);\r
+static __RAM_FUNC WaitForLastOperation(uint32_t Timeout);\r
+\r
+/* Private functions ---------------------------------------------------------*/\r
\r
+/** @defgroup FLASH_Private_Functions\r
+  * @{\r
+  */ \r
+\r
+/** @addtogroup FLASH_Group1\r
+ *\r
+@verbatim  \r
+@endverbatim\r
+  * @{\r
+  */  \r
+#if defined (  __TASKING__  )\r
+#pragma section_code_init on\r
+#endif\r
+\r
+/**\r
+  * @brief  Enable or disable the power down mode during RUN mode.\r
+  * @note: This function can be used only when the user code is running from Internal SRAM\r
+  * @param  NewState: new state of the power down mode during RUN mode.\r
+  *   This parameter can be: ENABLE or DISABLE.\r
+  * @retval None\r
+  */\r
+__RAM_FUNC FLASH_RUNPowerDownCmd(FunctionalState NewState)\r
+{\r
+  FLASH_Status status = FLASH_COMPLETE;\r
\r
+  if (NewState != DISABLE)\r
+  {\r
+     /* Unlock the RUN_PD bit */\r
+     FLASH->PDKEYR = FLASH_PDKEY1;\r
+     FLASH->PDKEYR = FLASH_PDKEY2;\r
+     \r
+     /* Set the RUN_PD bit in  FLASH_ACR register to put Flash in power down mode */\r
+     FLASH->ACR |= (uint32_t)FLASH_ACR_RUN_PD;\r
+\r
+     if((FLASH->ACR & FLASH_ACR_RUN_PD) != FLASH_ACR_RUN_PD)\r
+     {\r
+       status = FLASH_ERROR_PROGRAM;\r
+     }\r
+  }\r
+  else\r
+  {\r
+    /* Clear the RUN_PD bit in  FLASH_ACR register to put Flash in idle  mode */\r
+    FLASH->ACR &= (uint32_t)(~(uint32_t)FLASH_ACR_RUN_PD);\r
+  }\r
+\r
+  /* Return the Write Status */\r
+  return status;  \r
+}\r
+\r
+/**\r
+  * @}\r
+  */\r
+\r
+/** @addtogroup FLASH_Group2\r
+ *\r
+@verbatim  \r
+@endverbatim\r
+  * @{\r
+  */\r
+\r
+/**\r
+  * @brief  Programs a half page in program memory.\r
+  * @param  Address: specifies the address to be written.\r
+  * @param  pBuffer: pointer to the buffer  containing the data to be  written to \r
+  *         the half page.\r
+  * @note   - To correctly run this function, the FLASH_Unlock() function\r
+  *           must be called before.\r
+  *         - Call the FLASH_Lock() to disable the flash memory access  \r
+  *          (recommended to protect the FLASH memory against possible unwanted operation)\r
+  * @note   Half page write is possible only from SRAM.\r
+  * @note   If there are more than 32 words to write, after 32 words another \r
+  *         Half Page programming operation starts and has to be finished.\r
+  * @note   A half page is written to the program memory only if the first \r
+  *         address to load is the start address of a half page (multiple of 128 \r
+  *         bytes) and the 31 remaining words to load are in the same half page.\r
+  * @note   During the Program memory half page write all read operations are \r
+  *         forbidden (this includes DMA read operations and debugger read \r
+  *         operations such as breakpoints, periodic updates, etc.)\r
+  * @note   If a PGAERR is set during a Program memory half page write, the \r
+  *         complete write operation is aborted. Software should then reset the \r
+  *         FPRG and PROG/DATA bits and restart the write operation from the \r
+  *         beginning.                             \r
+  * @retval FLASH Status: The returned value can be:  \r
+  *   FLASH_ERROR_PROGRAM, FLASH_ERROR_WRP, FLASH_COMPLETE or FLASH_TIMEOUT. \r
+  */\r
+__RAM_FUNC FLASH_ProgramHalfPage(uint32_t Address, uint32_t* pBuffer)\r
+{\r
+  uint32_t count = 0; \r
+   \r
+  FLASH_Status status = FLASH_COMPLETE;\r
+\r
+  /* Wait for last operation to be completed */\r
+  status = WaitForLastOperation(FLASH_ER_PRG_TIMEOUT);\r
+  \r
+  if(status == FLASH_COMPLETE)\r
+  {\r
+    /* if the previous operation is completed, proceed to program the new  \r
+    half page */\r
+    FLASH->PECR |= FLASH_PECR_FPRG;\r
+    FLASH->PECR |= FLASH_PECR_PROG;\r
+    \r
+    /* Write one half page directly with 32 different words */\r
+    while(count < 32)\r
+    {\r
+      *(__IO uint32_t*) (Address + (4 * count)) = *(pBuffer++);\r
+      count ++;  \r
+    }\r
+    /* Wait for last operation to be completed */\r
+    status = WaitForLastOperation(FLASH_ER_PRG_TIMEOUT);\r
\r
+    /* if the write operation is completed, disable the PROG and FPRG bits */\r
+    FLASH->PECR &= (uint32_t)(~FLASH_PECR_PROG);\r
+    FLASH->PECR &= (uint32_t)(~FLASH_PECR_FPRG);\r
+  }\r
+  /* Return the Write Status */\r
+  return status;\r
+}\r
+\r
+/**\r
+  * @}\r
+  */\r
+\r
+/** @addtogroup FLASH_Group3\r
+ *\r
+@verbatim  \r
+@endverbatim\r
+  * @{\r
+  */\r
+\r
+/**\r
+  * @brief  Erase a double word in data memory.\r
+  * @param  Address: specifies the address to be erased\r
+  * @note   - To correctly run this function, the DATA_EEPROM_Unlock() function\r
+  *           must be called before.\r
+  *         - Call the DATA_EEPROM_Lock() to he data EEPROM access\r
+  *           and Flash program erase control register access(recommended to protect \r
+  *           the DATA_EEPROM against possible unwanted operation)   \r
+  * @note   Data memory double word erase is possible only from SRAM.\r
+  * @note   A double word is erased to the data memory only if the first address \r
+  *         to load is the start address of a double word (multiple of 8 bytes)  \r
+  * @note   During the Data memory double word erase, all read operations are \r
+  *         forbidden (this includes DMA read operations and debugger read \r
+  *         operations such as breakpoints, periodic updates, etc.)  \r
+  * @retval FLASH Status: The returned value can be: \r
+  *   FLASH_ERROR_PROGRAM, FLASH_ERROR_WRP, FLASH_COMPLETE or FLASH_TIMEOUT.\r
+  */\r
+\r
+__RAM_FUNC DATA_EEPROM_EraseDoubleWord(uint32_t Address)\r
+{\r
+  FLASH_Status status = FLASH_COMPLETE;\r
+    \r
+  /* Wait for last operation to be completed */\r
+  status = WaitForLastOperation(FLASH_ER_PRG_TIMEOUT);\r
+  \r
+  if(status == FLASH_COMPLETE)\r
+  {\r
+    /* If the previous operation is completed, proceed to erase the next double word */\r
+    /* Set the ERASE bit */\r
+    FLASH->PECR |= FLASH_PECR_ERASE;\r
+\r
+    /* Set DATA bit */\r
+    FLASH->PECR |= FLASH_PECR_DATA;\r
+   \r
+    /* Write 00000000h to the 2 words to erase */\r
+    *(__IO uint64_t *)Address = 0x00000000;\r
\r
+    /* Wait for last operation to be completed */\r
+    status = WaitForLastOperation(FLASH_ER_PRG_TIMEOUT);\r
+    \r
+    /* If the erase operation is completed, disable the ERASE and DATA bits */\r
+    FLASH->PECR &= (uint32_t)(~FLASH_PECR_ERASE);\r
+    FLASH->PECR &= (uint32_t)(~FLASH_PECR_DATA);\r
+  }  \r
+  /* Return the erase status */\r
+  return status;\r
+}\r
+\r
+/**\r
+  * @brief  Write a double word in data memory without erase.\r
+  * @param  Address: specifies the address to be written.\r
+  * @param  Data: specifies the data to be written.\r
+  * @note   - To correctly run this function, the DATA_EEPROM_Unlock() function\r
+  *           must be called before.\r
+  *         - Call the DATA_EEPROM_Lock() to he data EEPROM access\r
+  *           and Flash program erase control register access(recommended to protect \r
+  *           the DATA_EEPROM against possible unwanted operation)   \r
+  * @note   Data memory double word write is possible only from SRAM.\r
+  * @note   A data memory double word is written to the data memory only if the \r
+  *         first address to load is the start address of a double word (multiple \r
+  *         of double word).  \r
+  * @note   During the Data memory double word write, all read operations are \r
+  *         forbidden (this includes DMA read operations and debugger read \r
+  *         operations such as breakpoints, periodic updates, etc.)    \r
+  * @retval FLASH Status: The returned value can be: \r
+  *   FLASH_ERROR_PROGRAM, FLASH_ERROR_WRP, FLASH_COMPLETE or FLASH_TIMEOUT. \r
+  */ \r
+__RAM_FUNC DATA_EEPROM_ProgramDoubleWord(uint32_t Address, uint64_t Data)\r
+{\r
+  FLASH_Status status = FLASH_COMPLETE;\r
+    \r
+  /* Wait for last operation to be completed */\r
+  status = WaitForLastOperation(FLASH_ER_PRG_TIMEOUT);\r
+  \r
+  if(status == FLASH_COMPLETE)\r
+  {\r
+    /* If the previous operation is completed, proceed to program the new data*/\r
+    FLASH->PECR |= FLASH_PECR_FPRG;\r
+    FLASH->PECR |= FLASH_PECR_DATA;\r
+    \r
+    /* Write the 2 words */  \r
+     *(__IO uint32_t *)Address = (uint32_t) Data;\r
+     Address += 4;\r
+     *(__IO uint32_t *)Address = (uint32_t) (Data >> 32);\r
+    \r
+    /* Wait for last operation to be completed */\r
+    status = WaitForLastOperation(FLASH_ER_PRG_TIMEOUT);\r
+    \r
+    /* If the write operation is completed, disable the FPRG and DATA bits */\r
+    FLASH->PECR &= (uint32_t)(~FLASH_PECR_FPRG);\r
+    FLASH->PECR &= (uint32_t)(~FLASH_PECR_DATA);     \r
+  }\r
+  /* Return the Write Status */\r
+  return status;\r
+}\r
+\r
+/**\r
+  * @}\r
+  */\r
+\r
+/**\r
+  * @brief  Returns the FLASH Status.\r
+  * @param  None\r
+  * @retval FLASH Status: The returned value can be: FLASH_BUSY, \r
+  *   FLASH_ERROR_PROGRAM, FLASH_ERROR_WRP or FLASH_COMPLETE\r
+  */\r
+static __RAM_FUNC GetStatus(void)\r
+{\r
+  FLASH_Status FLASHstatus = FLASH_COMPLETE;\r
+  \r
+  if((FLASH->SR & FLASH_FLAG_BSY) == FLASH_FLAG_BSY) \r
+  {\r
+    FLASHstatus = FLASH_BUSY;\r
+  }\r
+  else \r
+  {  \r
+    if((FLASH->SR & (uint32_t)FLASH_FLAG_WRPERR)!= (uint32_t)0x00)\r
+    { \r
+      FLASHstatus = FLASH_ERROR_WRP;\r
+    }\r
+    else \r
+    {\r
+      if((FLASH->SR & (uint32_t)0xFEF0) != (uint32_t)0x00)\r
+      {\r
+        FLASHstatus = FLASH_ERROR_PROGRAM; \r
+      }\r
+      else\r
+      {\r
+        FLASHstatus = FLASH_COMPLETE;\r
+      }\r
+    }\r
+  }\r
+  /* Return the FLASH Status */\r
+  return FLASHstatus;\r
+}\r
+\r
+/**\r
+  * @brief  Waits for a FLASH operation to complete or a TIMEOUT to occur.\r
+  * @param  Timeout: FLASH programming Timeout\r
+  * @retval FLASH Status: The returned value can be: FLASH_BUSY, \r
+  *   FLASH_ERROR_PROGRAM, FLASH_ERROR_WRP, FLASH_COMPLETE or \r
+  *   FLASH_TIMEOUT.\r
+  */\r
+static __RAM_FUNC  WaitForLastOperation(uint32_t Timeout)\r
+{ \r
+  FLASH_Status status = FLASH_COMPLETE;\r
+   \r
+  /* Check for the FLASH Status */\r
+  status = GetStatus();\r
+  \r
+  /* Wait for a FLASH operation to complete or a TIMEOUT to occur */\r
+  while((status == FLASH_BUSY) && (Timeout != 0x00))\r
+  {\r
+    status = GetStatus();\r
+    Timeout--;\r
+  }\r
+  \r
+  if(Timeout == 0x00 )\r
+  {\r
+    status = FLASH_TIMEOUT;\r
+  }\r
+  /* Return the operation status */\r
+  return status;\r
+}\r
+\r
+#if defined (  __TASKING__  )\r
+#pragma section_code_init restore\r
+#endif\r
+\r
+/**\r
+  * @}\r
+  */\r
+   \r
+  /**\r
+  * @}\r
+  */ \r
+\r
+/**\r
+  * @}\r
+  */ \r
+\r
+/******************* (C) COPYRIGHT 2010 STMicroelectronics *****END OF FILE****/\r