Committer:
Sergunb
Date:
Mon Sep 04 12:04:13 2017 +0000
Revision:
0:8f0d870509fe
Initial commit

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Sergunb 0:8f0d870509fe 1 /**
Sergunb 0:8f0d870509fe 2 ******************************************************************************
Sergunb 0:8f0d870509fe 3 * @file stm32f10x_flash.c
Sergunb 0:8f0d870509fe 4 * @author MCD Application Team
Sergunb 0:8f0d870509fe 5 * @version V3.5.0
Sergunb 0:8f0d870509fe 6 * @date 11-March-2011
Sergunb 0:8f0d870509fe 7 * @brief This file provides all the FLASH firmware functions.
Sergunb 0:8f0d870509fe 8 ******************************************************************************
Sergunb 0:8f0d870509fe 9 * @attention
Sergunb 0:8f0d870509fe 10 *
Sergunb 0:8f0d870509fe 11 * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
Sergunb 0:8f0d870509fe 12 * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE
Sergunb 0:8f0d870509fe 13 * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY
Sergunb 0:8f0d870509fe 14 * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING
Sergunb 0:8f0d870509fe 15 * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE
Sergunb 0:8f0d870509fe 16 * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
Sergunb 0:8f0d870509fe 17 *
Sergunb 0:8f0d870509fe 18 * <h2><center>&copy; COPYRIGHT 2011 STMicroelectronics</center></h2>
Sergunb 0:8f0d870509fe 19 ******************************************************************************
Sergunb 0:8f0d870509fe 20 */
Sergunb 0:8f0d870509fe 21
Sergunb 0:8f0d870509fe 22 /* Includes ------------------------------------------------------------------*/
Sergunb 0:8f0d870509fe 23 #include "stm32f10x_flash.h"
Sergunb 0:8f0d870509fe 24
Sergunb 0:8f0d870509fe 25 /** @addtogroup STM32F10x_StdPeriph_Driver
Sergunb 0:8f0d870509fe 26 * @{
Sergunb 0:8f0d870509fe 27 */
Sergunb 0:8f0d870509fe 28
Sergunb 0:8f0d870509fe 29 /** @defgroup FLASH
Sergunb 0:8f0d870509fe 30 * @brief FLASH driver modules
Sergunb 0:8f0d870509fe 31 * @{
Sergunb 0:8f0d870509fe 32 */
Sergunb 0:8f0d870509fe 33
Sergunb 0:8f0d870509fe 34 /** @defgroup FLASH_Private_TypesDefinitions
Sergunb 0:8f0d870509fe 35 * @{
Sergunb 0:8f0d870509fe 36 */
Sergunb 0:8f0d870509fe 37
Sergunb 0:8f0d870509fe 38 /**
Sergunb 0:8f0d870509fe 39 * @}
Sergunb 0:8f0d870509fe 40 */
Sergunb 0:8f0d870509fe 41
Sergunb 0:8f0d870509fe 42 /** @defgroup FLASH_Private_Defines
Sergunb 0:8f0d870509fe 43 * @{
Sergunb 0:8f0d870509fe 44 */
Sergunb 0:8f0d870509fe 45
Sergunb 0:8f0d870509fe 46 /* Flash Access Control Register bits */
Sergunb 0:8f0d870509fe 47 #define ACR_LATENCY_Mask ((uint32_t)0x00000038)
Sergunb 0:8f0d870509fe 48 #define ACR_HLFCYA_Mask ((uint32_t)0xFFFFFFF7)
Sergunb 0:8f0d870509fe 49 #define ACR_PRFTBE_Mask ((uint32_t)0xFFFFFFEF)
Sergunb 0:8f0d870509fe 50
Sergunb 0:8f0d870509fe 51 /* Flash Access Control Register bits */
Sergunb 0:8f0d870509fe 52 #define ACR_PRFTBS_Mask ((uint32_t)0x00000020)
Sergunb 0:8f0d870509fe 53
Sergunb 0:8f0d870509fe 54 /* Flash Control Register bits */
Sergunb 0:8f0d870509fe 55 #define CR_PG_Set ((uint32_t)0x00000001)
Sergunb 0:8f0d870509fe 56 #define CR_PG_Reset ((uint32_t)0x00001FFE)
Sergunb 0:8f0d870509fe 57 #define CR_PER_Set ((uint32_t)0x00000002)
Sergunb 0:8f0d870509fe 58 #define CR_PER_Reset ((uint32_t)0x00001FFD)
Sergunb 0:8f0d870509fe 59 #define CR_MER_Set ((uint32_t)0x00000004)
Sergunb 0:8f0d870509fe 60 #define CR_MER_Reset ((uint32_t)0x00001FFB)
Sergunb 0:8f0d870509fe 61 #define CR_OPTPG_Set ((uint32_t)0x00000010)
Sergunb 0:8f0d870509fe 62 #define CR_OPTPG_Reset ((uint32_t)0x00001FEF)
Sergunb 0:8f0d870509fe 63 #define CR_OPTER_Set ((uint32_t)0x00000020)
Sergunb 0:8f0d870509fe 64 #define CR_OPTER_Reset ((uint32_t)0x00001FDF)
Sergunb 0:8f0d870509fe 65 #define CR_STRT_Set ((uint32_t)0x00000040)
Sergunb 0:8f0d870509fe 66 #define CR_LOCK_Set ((uint32_t)0x00000080)
Sergunb 0:8f0d870509fe 67
Sergunb 0:8f0d870509fe 68 /* FLASH Mask */
Sergunb 0:8f0d870509fe 69 #define RDPRT_Mask ((uint32_t)0x00000002)
Sergunb 0:8f0d870509fe 70 #define WRP0_Mask ((uint32_t)0x000000FF)
Sergunb 0:8f0d870509fe 71 #define WRP1_Mask ((uint32_t)0x0000FF00)
Sergunb 0:8f0d870509fe 72 #define WRP2_Mask ((uint32_t)0x00FF0000)
Sergunb 0:8f0d870509fe 73 #define WRP3_Mask ((uint32_t)0xFF000000)
Sergunb 0:8f0d870509fe 74 #define OB_USER_BFB2 ((uint16_t)0x0008)
Sergunb 0:8f0d870509fe 75
Sergunb 0:8f0d870509fe 76 /* FLASH Keys */
Sergunb 0:8f0d870509fe 77 #define RDP_Key ((uint16_t)0x00A5)
Sergunb 0:8f0d870509fe 78 #define FLASH_KEY1 ((uint32_t)0x45670123)
Sergunb 0:8f0d870509fe 79 #define FLASH_KEY2 ((uint32_t)0xCDEF89AB)
Sergunb 0:8f0d870509fe 80
Sergunb 0:8f0d870509fe 81 /* FLASH BANK address */
Sergunb 0:8f0d870509fe 82 #define FLASH_BANK1_END_ADDRESS ((uint32_t)0x807FFFF)
Sergunb 0:8f0d870509fe 83
Sergunb 0:8f0d870509fe 84 /* Delay definition */
Sergunb 0:8f0d870509fe 85 #define EraseTimeout ((uint32_t)0x000B0000)
Sergunb 0:8f0d870509fe 86 #define ProgramTimeout ((uint32_t)0x00002000)
Sergunb 0:8f0d870509fe 87 /**
Sergunb 0:8f0d870509fe 88 * @}
Sergunb 0:8f0d870509fe 89 */
Sergunb 0:8f0d870509fe 90
Sergunb 0:8f0d870509fe 91 /** @defgroup FLASH_Private_Macros
Sergunb 0:8f0d870509fe 92 * @{
Sergunb 0:8f0d870509fe 93 */
Sergunb 0:8f0d870509fe 94
Sergunb 0:8f0d870509fe 95 /**
Sergunb 0:8f0d870509fe 96 * @}
Sergunb 0:8f0d870509fe 97 */
Sergunb 0:8f0d870509fe 98
Sergunb 0:8f0d870509fe 99 /** @defgroup FLASH_Private_Variables
Sergunb 0:8f0d870509fe 100 * @{
Sergunb 0:8f0d870509fe 101 */
Sergunb 0:8f0d870509fe 102
Sergunb 0:8f0d870509fe 103 /**
Sergunb 0:8f0d870509fe 104 * @}
Sergunb 0:8f0d870509fe 105 */
Sergunb 0:8f0d870509fe 106
Sergunb 0:8f0d870509fe 107 /** @defgroup FLASH_Private_FunctionPrototypes
Sergunb 0:8f0d870509fe 108 * @{
Sergunb 0:8f0d870509fe 109 */
Sergunb 0:8f0d870509fe 110
Sergunb 0:8f0d870509fe 111 /**
Sergunb 0:8f0d870509fe 112 * @}
Sergunb 0:8f0d870509fe 113 */
Sergunb 0:8f0d870509fe 114
Sergunb 0:8f0d870509fe 115 /** @defgroup FLASH_Private_Functions
Sergunb 0:8f0d870509fe 116 * @{
Sergunb 0:8f0d870509fe 117 */
Sergunb 0:8f0d870509fe 118
Sergunb 0:8f0d870509fe 119 /**
Sergunb 0:8f0d870509fe 120 @code
Sergunb 0:8f0d870509fe 121
Sergunb 0:8f0d870509fe 122 This driver provides functions to configure and program the Flash memory of all STM32F10x devices,
Sergunb 0:8f0d870509fe 123 including the latest STM32F10x_XL density devices.
Sergunb 0:8f0d870509fe 124
Sergunb 0:8f0d870509fe 125 STM32F10x_XL devices feature up to 1 Mbyte with dual bank architecture for read-while-write (RWW) capability:
Sergunb 0:8f0d870509fe 126 - bank1: fixed size of 512 Kbytes (256 pages of 2Kbytes each)
Sergunb 0:8f0d870509fe 127 - bank2: up to 512 Kbytes (up to 256 pages of 2Kbytes each)
Sergunb 0:8f0d870509fe 128 While other STM32F10x devices features only one bank with memory up to 512 Kbytes.
Sergunb 0:8f0d870509fe 129
Sergunb 0:8f0d870509fe 130 In version V3.3.0, some functions were updated and new ones were added to support
Sergunb 0:8f0d870509fe 131 STM32F10x_XL devices. Thus some functions manages all devices, while other are
Sergunb 0:8f0d870509fe 132 dedicated for XL devices only.
Sergunb 0:8f0d870509fe 133
Sergunb 0:8f0d870509fe 134 The table below presents the list of available functions depending on the used STM32F10x devices.
Sergunb 0:8f0d870509fe 135
Sergunb 0:8f0d870509fe 136 ***************************************************
Sergunb 0:8f0d870509fe 137 * Legacy functions used for all STM32F10x devices *
Sergunb 0:8f0d870509fe 138 ***************************************************
Sergunb 0:8f0d870509fe 139 +----------------------------------------------------------------------------------------------------------------------------------+
Sergunb 0:8f0d870509fe 140 | Functions prototypes |STM32F10x_XL|Other STM32F10x| Comments |
Sergunb 0:8f0d870509fe 141 | | devices | devices | |
Sergunb 0:8f0d870509fe 142 |----------------------------------------------------------------------------------------------------------------------------------|
Sergunb 0:8f0d870509fe 143 |FLASH_SetLatency | Yes | Yes | No change |
Sergunb 0:8f0d870509fe 144 |----------------------------------------------------------------------------------------------------------------------------------|
Sergunb 0:8f0d870509fe 145 |FLASH_HalfCycleAccessCmd | Yes | Yes | No change |
Sergunb 0:8f0d870509fe 146 |----------------------------------------------------------------------------------------------------------------------------------|
Sergunb 0:8f0d870509fe 147 |FLASH_PrefetchBufferCmd | Yes | Yes | No change |
Sergunb 0:8f0d870509fe 148 |----------------------------------------------------------------------------------------------------------------------------------|
Sergunb 0:8f0d870509fe 149 |FLASH_Unlock | Yes | Yes | - For STM32F10X_XL devices: unlock Bank1 and Bank2. |
Sergunb 0:8f0d870509fe 150 | | | | - For other devices: unlock Bank1 and it is equivalent |
Sergunb 0:8f0d870509fe 151 | | | | to FLASH_UnlockBank1 function. |
Sergunb 0:8f0d870509fe 152 |----------------------------------------------------------------------------------------------------------------------------------|
Sergunb 0:8f0d870509fe 153 |FLASH_Lock | Yes | Yes | - For STM32F10X_XL devices: lock Bank1 and Bank2. |
Sergunb 0:8f0d870509fe 154 | | | | - For other devices: lock Bank1 and it is equivalent |
Sergunb 0:8f0d870509fe 155 | | | | to FLASH_LockBank1 function. |
Sergunb 0:8f0d870509fe 156 |----------------------------------------------------------------------------------------------------------------------------------|
Sergunb 0:8f0d870509fe 157 |FLASH_ErasePage | Yes | Yes | - For STM32F10x_XL devices: erase a page in Bank1 and Bank2 |
Sergunb 0:8f0d870509fe 158 | | | | - For other devices: erase a page in Bank1 |
Sergunb 0:8f0d870509fe 159 |----------------------------------------------------------------------------------------------------------------------------------|
Sergunb 0:8f0d870509fe 160 |FLASH_EraseAllPages | Yes | Yes | - For STM32F10x_XL devices: erase all pages in Bank1 and Bank2 |
Sergunb 0:8f0d870509fe 161 | | | | - For other devices: erase all pages in Bank1 |
Sergunb 0:8f0d870509fe 162 |----------------------------------------------------------------------------------------------------------------------------------|
Sergunb 0:8f0d870509fe 163 |FLASH_EraseOptionBytes | Yes | Yes | No change |
Sergunb 0:8f0d870509fe 164 |----------------------------------------------------------------------------------------------------------------------------------|
Sergunb 0:8f0d870509fe 165 |FLASH_ProgramWord | Yes | Yes | Updated to program up to 1MByte (depending on the used device) |
Sergunb 0:8f0d870509fe 166 |----------------------------------------------------------------------------------------------------------------------------------|
Sergunb 0:8f0d870509fe 167 |FLASH_ProgramHalfWord | Yes | Yes | Updated to program up to 1MByte (depending on the used device) |
Sergunb 0:8f0d870509fe 168 |----------------------------------------------------------------------------------------------------------------------------------|
Sergunb 0:8f0d870509fe 169 |FLASH_ProgramOptionByteData | Yes | Yes | No change |
Sergunb 0:8f0d870509fe 170 |----------------------------------------------------------------------------------------------------------------------------------|
Sergunb 0:8f0d870509fe 171 |FLASH_EnableWriteProtection | Yes | Yes | No change |
Sergunb 0:8f0d870509fe 172 |----------------------------------------------------------------------------------------------------------------------------------|
Sergunb 0:8f0d870509fe 173 |FLASH_ReadOutProtection | Yes | Yes | No change |
Sergunb 0:8f0d870509fe 174 |----------------------------------------------------------------------------------------------------------------------------------|
Sergunb 0:8f0d870509fe 175 |FLASH_UserOptionByteConfig | Yes | Yes | No change |
Sergunb 0:8f0d870509fe 176 |----------------------------------------------------------------------------------------------------------------------------------|
Sergunb 0:8f0d870509fe 177 |FLASH_GetUserOptionByte | Yes | Yes | No change |
Sergunb 0:8f0d870509fe 178 |----------------------------------------------------------------------------------------------------------------------------------|
Sergunb 0:8f0d870509fe 179 |FLASH_GetWriteProtectionOptionByte | Yes | Yes | No change |
Sergunb 0:8f0d870509fe 180 |----------------------------------------------------------------------------------------------------------------------------------|
Sergunb 0:8f0d870509fe 181 |FLASH_GetReadOutProtectionStatus | Yes | Yes | No change |
Sergunb 0:8f0d870509fe 182 |----------------------------------------------------------------------------------------------------------------------------------|
Sergunb 0:8f0d870509fe 183 |FLASH_GetPrefetchBufferStatus | Yes | Yes | No change |
Sergunb 0:8f0d870509fe 184 |----------------------------------------------------------------------------------------------------------------------------------|
Sergunb 0:8f0d870509fe 185 |FLASH_ITConfig | Yes | Yes | - For STM32F10x_XL devices: enable Bank1 and Bank2's interrupts|
Sergunb 0:8f0d870509fe 186 | | | | - For other devices: enable Bank1's interrupts |
Sergunb 0:8f0d870509fe 187 |----------------------------------------------------------------------------------------------------------------------------------|
Sergunb 0:8f0d870509fe 188 |FLASH_GetFlagStatus | Yes | Yes | - For STM32F10x_XL devices: return Bank1 and Bank2's flag status|
Sergunb 0:8f0d870509fe 189 | | | | - For other devices: return Bank1's flag status |
Sergunb 0:8f0d870509fe 190 |----------------------------------------------------------------------------------------------------------------------------------|
Sergunb 0:8f0d870509fe 191 |FLASH_ClearFlag | Yes | Yes | - For STM32F10x_XL devices: clear Bank1 and Bank2's flag |
Sergunb 0:8f0d870509fe 192 | | | | - For other devices: clear Bank1's flag |
Sergunb 0:8f0d870509fe 193 |----------------------------------------------------------------------------------------------------------------------------------|
Sergunb 0:8f0d870509fe 194 |FLASH_GetStatus | Yes | Yes | - Return the status of Bank1 (for all devices) |
Sergunb 0:8f0d870509fe 195 | | | | equivalent to FLASH_GetBank1Status function |
Sergunb 0:8f0d870509fe 196 |----------------------------------------------------------------------------------------------------------------------------------|
Sergunb 0:8f0d870509fe 197 |FLASH_WaitForLastOperation | Yes | Yes | - Wait for Bank1 last operation (for all devices) |
Sergunb 0:8f0d870509fe 198 | | | | equivalent to: FLASH_WaitForLastBank1Operation function |
Sergunb 0:8f0d870509fe 199 +----------------------------------------------------------------------------------------------------------------------------------+
Sergunb 0:8f0d870509fe 200
Sergunb 0:8f0d870509fe 201 ************************************************************************************************************************
Sergunb 0:8f0d870509fe 202 * New functions used for all STM32F10x devices to manage Bank1: *
Sergunb 0:8f0d870509fe 203 * - These functions are mainly useful for STM32F10x_XL density devices, to have separate control for Bank1 and bank2 *
Sergunb 0:8f0d870509fe 204 * - For other devices, these functions are optional (covered by functions listed above) *
Sergunb 0:8f0d870509fe 205 ************************************************************************************************************************
Sergunb 0:8f0d870509fe 206 +----------------------------------------------------------------------------------------------------------------------------------+
Sergunb 0:8f0d870509fe 207 | Functions prototypes |STM32F10x_XL|Other STM32F10x| Comments |
Sergunb 0:8f0d870509fe 208 | | devices | devices | |
Sergunb 0:8f0d870509fe 209 |----------------------------------------------------------------------------------------------------------------------------------|
Sergunb 0:8f0d870509fe 210 | FLASH_UnlockBank1 | Yes | Yes | - Unlock Bank1 |
Sergunb 0:8f0d870509fe 211 |----------------------------------------------------------------------------------------------------------------------------------|
Sergunb 0:8f0d870509fe 212 |FLASH_LockBank1 | Yes | Yes | - Lock Bank1 |
Sergunb 0:8f0d870509fe 213 |----------------------------------------------------------------------------------------------------------------------------------|
Sergunb 0:8f0d870509fe 214 | FLASH_EraseAllBank1Pages | Yes | Yes | - Erase all pages in Bank1 |
Sergunb 0:8f0d870509fe 215 |----------------------------------------------------------------------------------------------------------------------------------|
Sergunb 0:8f0d870509fe 216 | FLASH_GetBank1Status | Yes | Yes | - Return the status of Bank1 |
Sergunb 0:8f0d870509fe 217 |----------------------------------------------------------------------------------------------------------------------------------|
Sergunb 0:8f0d870509fe 218 | FLASH_WaitForLastBank1Operation | Yes | Yes | - Wait for Bank1 last operation |
Sergunb 0:8f0d870509fe 219 +----------------------------------------------------------------------------------------------------------------------------------+
Sergunb 0:8f0d870509fe 220
Sergunb 0:8f0d870509fe 221 *****************************************************************************
Sergunb 0:8f0d870509fe 222 * New Functions used only with STM32F10x_XL density devices to manage Bank2 *
Sergunb 0:8f0d870509fe 223 *****************************************************************************
Sergunb 0:8f0d870509fe 224 +----------------------------------------------------------------------------------------------------------------------------------+
Sergunb 0:8f0d870509fe 225 | Functions prototypes |STM32F10x_XL|Other STM32F10x| Comments |
Sergunb 0:8f0d870509fe 226 | | devices | devices | |
Sergunb 0:8f0d870509fe 227 |----------------------------------------------------------------------------------------------------------------------------------|
Sergunb 0:8f0d870509fe 228 | FLASH_UnlockBank2 | Yes | No | - Unlock Bank2 |
Sergunb 0:8f0d870509fe 229 |----------------------------------------------------------------------------------------------------------------------------------|
Sergunb 0:8f0d870509fe 230 |FLASH_LockBank2 | Yes | No | - Lock Bank2 |
Sergunb 0:8f0d870509fe 231 |----------------------------------------------------------------------------------------------------------------------------------|
Sergunb 0:8f0d870509fe 232 | FLASH_EraseAllBank2Pages | Yes | No | - Erase all pages in Bank2 |
Sergunb 0:8f0d870509fe 233 |----------------------------------------------------------------------------------------------------------------------------------|
Sergunb 0:8f0d870509fe 234 | FLASH_GetBank2Status | Yes | No | - Return the status of Bank2 |
Sergunb 0:8f0d870509fe 235 |----------------------------------------------------------------------------------------------------------------------------------|
Sergunb 0:8f0d870509fe 236 | FLASH_WaitForLastBank2Operation | Yes | No | - Wait for Bank2 last operation |
Sergunb 0:8f0d870509fe 237 |----------------------------------------------------------------------------------------------------------------------------------|
Sergunb 0:8f0d870509fe 238 | FLASH_BootConfig | Yes | No | - Configure to boot from Bank1 or Bank2 |
Sergunb 0:8f0d870509fe 239 +----------------------------------------------------------------------------------------------------------------------------------+
Sergunb 0:8f0d870509fe 240 @endcode
Sergunb 0:8f0d870509fe 241 */
Sergunb 0:8f0d870509fe 242
Sergunb 0:8f0d870509fe 243
Sergunb 0:8f0d870509fe 244 /**
Sergunb 0:8f0d870509fe 245 * @brief Sets the code latency value.
Sergunb 0:8f0d870509fe 246 * @note This function can be used for all STM32F10x devices.
Sergunb 0:8f0d870509fe 247 * @param FLASH_Latency: specifies the FLASH Latency value.
Sergunb 0:8f0d870509fe 248 * This parameter can be one of the following values:
Sergunb 0:8f0d870509fe 249 * @arg FLASH_Latency_0: FLASH Zero Latency cycle
Sergunb 0:8f0d870509fe 250 * @arg FLASH_Latency_1: FLASH One Latency cycle
Sergunb 0:8f0d870509fe 251 * @arg FLASH_Latency_2: FLASH Two Latency cycles
Sergunb 0:8f0d870509fe 252 * @retval None
Sergunb 0:8f0d870509fe 253 */
Sergunb 0:8f0d870509fe 254 void FLASH_SetLatency(uint32_t FLASH_Latency)
Sergunb 0:8f0d870509fe 255 {
Sergunb 0:8f0d870509fe 256 uint32_t tmpreg = 0;
Sergunb 0:8f0d870509fe 257
Sergunb 0:8f0d870509fe 258 /* Check the parameters */
Sergunb 0:8f0d870509fe 259 assert_param(IS_FLASH_LATENCY(FLASH_Latency));
Sergunb 0:8f0d870509fe 260
Sergunb 0:8f0d870509fe 261 /* Read the ACR register */
Sergunb 0:8f0d870509fe 262 tmpreg = FLASH->ACR;
Sergunb 0:8f0d870509fe 263
Sergunb 0:8f0d870509fe 264 /* Sets the Latency value */
Sergunb 0:8f0d870509fe 265 tmpreg &= ACR_LATENCY_Mask;
Sergunb 0:8f0d870509fe 266 tmpreg |= FLASH_Latency;
Sergunb 0:8f0d870509fe 267
Sergunb 0:8f0d870509fe 268 /* Write the ACR register */
Sergunb 0:8f0d870509fe 269 FLASH->ACR = tmpreg;
Sergunb 0:8f0d870509fe 270 }
Sergunb 0:8f0d870509fe 271
Sergunb 0:8f0d870509fe 272 /**
Sergunb 0:8f0d870509fe 273 * @brief Enables or disables the Half cycle flash access.
Sergunb 0:8f0d870509fe 274 * @note This function can be used for all STM32F10x devices.
Sergunb 0:8f0d870509fe 275 * @param FLASH_HalfCycleAccess: specifies the FLASH Half cycle Access mode.
Sergunb 0:8f0d870509fe 276 * This parameter can be one of the following values:
Sergunb 0:8f0d870509fe 277 * @arg FLASH_HalfCycleAccess_Enable: FLASH Half Cycle Enable
Sergunb 0:8f0d870509fe 278 * @arg FLASH_HalfCycleAccess_Disable: FLASH Half Cycle Disable
Sergunb 0:8f0d870509fe 279 * @retval None
Sergunb 0:8f0d870509fe 280 */
Sergunb 0:8f0d870509fe 281 void FLASH_HalfCycleAccessCmd(uint32_t FLASH_HalfCycleAccess)
Sergunb 0:8f0d870509fe 282 {
Sergunb 0:8f0d870509fe 283 /* Check the parameters */
Sergunb 0:8f0d870509fe 284 assert_param(IS_FLASH_HALFCYCLEACCESS_STATE(FLASH_HalfCycleAccess));
Sergunb 0:8f0d870509fe 285
Sergunb 0:8f0d870509fe 286 /* Enable or disable the Half cycle access */
Sergunb 0:8f0d870509fe 287 FLASH->ACR &= ACR_HLFCYA_Mask;
Sergunb 0:8f0d870509fe 288 FLASH->ACR |= FLASH_HalfCycleAccess;
Sergunb 0:8f0d870509fe 289 }
Sergunb 0:8f0d870509fe 290
Sergunb 0:8f0d870509fe 291 /**
Sergunb 0:8f0d870509fe 292 * @brief Enables or disables the Prefetch Buffer.
Sergunb 0:8f0d870509fe 293 * @note This function can be used for all STM32F10x devices.
Sergunb 0:8f0d870509fe 294 * @param FLASH_PrefetchBuffer: specifies the Prefetch buffer status.
Sergunb 0:8f0d870509fe 295 * This parameter can be one of the following values:
Sergunb 0:8f0d870509fe 296 * @arg FLASH_PrefetchBuffer_Enable: FLASH Prefetch Buffer Enable
Sergunb 0:8f0d870509fe 297 * @arg FLASH_PrefetchBuffer_Disable: FLASH Prefetch Buffer Disable
Sergunb 0:8f0d870509fe 298 * @retval None
Sergunb 0:8f0d870509fe 299 */
Sergunb 0:8f0d870509fe 300 void FLASH_PrefetchBufferCmd(uint32_t FLASH_PrefetchBuffer)
Sergunb 0:8f0d870509fe 301 {
Sergunb 0:8f0d870509fe 302 /* Check the parameters */
Sergunb 0:8f0d870509fe 303 assert_param(IS_FLASH_PREFETCHBUFFER_STATE(FLASH_PrefetchBuffer));
Sergunb 0:8f0d870509fe 304
Sergunb 0:8f0d870509fe 305 /* Enable or disable the Prefetch Buffer */
Sergunb 0:8f0d870509fe 306 FLASH->ACR &= ACR_PRFTBE_Mask;
Sergunb 0:8f0d870509fe 307 FLASH->ACR |= FLASH_PrefetchBuffer;
Sergunb 0:8f0d870509fe 308 }
Sergunb 0:8f0d870509fe 309
Sergunb 0:8f0d870509fe 310 /**
Sergunb 0:8f0d870509fe 311 * @brief Unlocks the FLASH Program Erase Controller.
Sergunb 0:8f0d870509fe 312 * @note This function can be used for all STM32F10x devices.
Sergunb 0:8f0d870509fe 313 * - For STM32F10X_XL devices this function unlocks Bank1 and Bank2.
Sergunb 0:8f0d870509fe 314 * - For all other devices it unlocks Bank1 and it is equivalent
Sergunb 0:8f0d870509fe 315 * to FLASH_UnlockBank1 function..
Sergunb 0:8f0d870509fe 316 * @param None
Sergunb 0:8f0d870509fe 317 * @retval None
Sergunb 0:8f0d870509fe 318 */
Sergunb 0:8f0d870509fe 319 void FLASH_Unlock(void)
Sergunb 0:8f0d870509fe 320 {
Sergunb 0:8f0d870509fe 321 /* Authorize the FPEC of Bank1 Access */
Sergunb 0:8f0d870509fe 322 FLASH->KEYR = FLASH_KEY1;
Sergunb 0:8f0d870509fe 323 FLASH->KEYR = FLASH_KEY2;
Sergunb 0:8f0d870509fe 324
Sergunb 0:8f0d870509fe 325 #ifdef STM32F10X_XL
Sergunb 0:8f0d870509fe 326 /* Authorize the FPEC of Bank2 Access */
Sergunb 0:8f0d870509fe 327 FLASH->KEYR2 = FLASH_KEY1;
Sergunb 0:8f0d870509fe 328 FLASH->KEYR2 = FLASH_KEY2;
Sergunb 0:8f0d870509fe 329 #endif /* STM32F10X_XL */
Sergunb 0:8f0d870509fe 330 }
Sergunb 0:8f0d870509fe 331 /**
Sergunb 0:8f0d870509fe 332 * @brief Unlocks the FLASH Bank1 Program Erase Controller.
Sergunb 0:8f0d870509fe 333 * @note This function can be used for all STM32F10x devices.
Sergunb 0:8f0d870509fe 334 * - For STM32F10X_XL devices this function unlocks Bank1.
Sergunb 0:8f0d870509fe 335 * - For all other devices it unlocks Bank1 and it is
Sergunb 0:8f0d870509fe 336 * equivalent to FLASH_Unlock function.
Sergunb 0:8f0d870509fe 337 * @param None
Sergunb 0:8f0d870509fe 338 * @retval None
Sergunb 0:8f0d870509fe 339 */
Sergunb 0:8f0d870509fe 340 void FLASH_UnlockBank1(void)
Sergunb 0:8f0d870509fe 341 {
Sergunb 0:8f0d870509fe 342 /* Authorize the FPEC of Bank1 Access */
Sergunb 0:8f0d870509fe 343 FLASH->KEYR = FLASH_KEY1;
Sergunb 0:8f0d870509fe 344 FLASH->KEYR = FLASH_KEY2;
Sergunb 0:8f0d870509fe 345 }
Sergunb 0:8f0d870509fe 346
Sergunb 0:8f0d870509fe 347 #ifdef STM32F10X_XL
Sergunb 0:8f0d870509fe 348 /**
Sergunb 0:8f0d870509fe 349 * @brief Unlocks the FLASH Bank2 Program Erase Controller.
Sergunb 0:8f0d870509fe 350 * @note This function can be used only for STM32F10X_XL density devices.
Sergunb 0:8f0d870509fe 351 * @param None
Sergunb 0:8f0d870509fe 352 * @retval None
Sergunb 0:8f0d870509fe 353 */
Sergunb 0:8f0d870509fe 354 void FLASH_UnlockBank2(void)
Sergunb 0:8f0d870509fe 355 {
Sergunb 0:8f0d870509fe 356 /* Authorize the FPEC of Bank2 Access */
Sergunb 0:8f0d870509fe 357 FLASH->KEYR2 = FLASH_KEY1;
Sergunb 0:8f0d870509fe 358 FLASH->KEYR2 = FLASH_KEY2;
Sergunb 0:8f0d870509fe 359
Sergunb 0:8f0d870509fe 360 }
Sergunb 0:8f0d870509fe 361 #endif /* STM32F10X_XL */
Sergunb 0:8f0d870509fe 362
Sergunb 0:8f0d870509fe 363 /**
Sergunb 0:8f0d870509fe 364 * @brief Locks the FLASH Program Erase Controller.
Sergunb 0:8f0d870509fe 365 * @note This function can be used for all STM32F10x devices.
Sergunb 0:8f0d870509fe 366 * - For STM32F10X_XL devices this function Locks Bank1 and Bank2.
Sergunb 0:8f0d870509fe 367 * - For all other devices it Locks Bank1 and it is equivalent
Sergunb 0:8f0d870509fe 368 * to FLASH_LockBank1 function.
Sergunb 0:8f0d870509fe 369 * @param None
Sergunb 0:8f0d870509fe 370 * @retval None
Sergunb 0:8f0d870509fe 371 */
Sergunb 0:8f0d870509fe 372 void FLASH_Lock(void)
Sergunb 0:8f0d870509fe 373 {
Sergunb 0:8f0d870509fe 374 /* Set the Lock Bit to lock the FPEC and the CR of Bank1 */
Sergunb 0:8f0d870509fe 375 FLASH->CR |= CR_LOCK_Set;
Sergunb 0:8f0d870509fe 376
Sergunb 0:8f0d870509fe 377 #ifdef STM32F10X_XL
Sergunb 0:8f0d870509fe 378 /* Set the Lock Bit to lock the FPEC and the CR of Bank2 */
Sergunb 0:8f0d870509fe 379 FLASH->CR2 |= CR_LOCK_Set;
Sergunb 0:8f0d870509fe 380 #endif /* STM32F10X_XL */
Sergunb 0:8f0d870509fe 381 }
Sergunb 0:8f0d870509fe 382
Sergunb 0:8f0d870509fe 383 /**
Sergunb 0:8f0d870509fe 384 * @brief Locks the FLASH Bank1 Program Erase Controller.
Sergunb 0:8f0d870509fe 385 * @note this function can be used for all STM32F10x devices.
Sergunb 0:8f0d870509fe 386 * - For STM32F10X_XL devices this function Locks Bank1.
Sergunb 0:8f0d870509fe 387 * - For all other devices it Locks Bank1 and it is equivalent
Sergunb 0:8f0d870509fe 388 * to FLASH_Lock function.
Sergunb 0:8f0d870509fe 389 * @param None
Sergunb 0:8f0d870509fe 390 * @retval None
Sergunb 0:8f0d870509fe 391 */
Sergunb 0:8f0d870509fe 392 void FLASH_LockBank1(void)
Sergunb 0:8f0d870509fe 393 {
Sergunb 0:8f0d870509fe 394 /* Set the Lock Bit to lock the FPEC and the CR of Bank1 */
Sergunb 0:8f0d870509fe 395 FLASH->CR |= CR_LOCK_Set;
Sergunb 0:8f0d870509fe 396 }
Sergunb 0:8f0d870509fe 397
Sergunb 0:8f0d870509fe 398 #ifdef STM32F10X_XL
Sergunb 0:8f0d870509fe 399 /**
Sergunb 0:8f0d870509fe 400 * @brief Locks the FLASH Bank2 Program Erase Controller.
Sergunb 0:8f0d870509fe 401 * @note This function can be used only for STM32F10X_XL density devices.
Sergunb 0:8f0d870509fe 402 * @param None
Sergunb 0:8f0d870509fe 403 * @retval None
Sergunb 0:8f0d870509fe 404 */
Sergunb 0:8f0d870509fe 405 void FLASH_LockBank2(void)
Sergunb 0:8f0d870509fe 406 {
Sergunb 0:8f0d870509fe 407 /* Set the Lock Bit to lock the FPEC and the CR of Bank2 */
Sergunb 0:8f0d870509fe 408 FLASH->CR2 |= CR_LOCK_Set;
Sergunb 0:8f0d870509fe 409 }
Sergunb 0:8f0d870509fe 410 #endif /* STM32F10X_XL */
Sergunb 0:8f0d870509fe 411
Sergunb 0:8f0d870509fe 412 /**
Sergunb 0:8f0d870509fe 413 * @brief Erases a specified FLASH page.
Sergunb 0:8f0d870509fe 414 * @note This function can be used for all STM32F10x devices.
Sergunb 0:8f0d870509fe 415 * @param Page_Address: The page address to be erased.
Sergunb 0:8f0d870509fe 416 * @retval FLASH Status: The returned value can be: FLASH_BUSY, FLASH_ERROR_PG,
Sergunb 0:8f0d870509fe 417 * FLASH_ERROR_WRP, FLASH_COMPLETE or FLASH_TIMEOUT.
Sergunb 0:8f0d870509fe 418 */
Sergunb 0:8f0d870509fe 419 FLASH_Status FLASH_ErasePage(uint32_t Page_Address)
Sergunb 0:8f0d870509fe 420 {
Sergunb 0:8f0d870509fe 421 FLASH_Status status = FLASH_COMPLETE;
Sergunb 0:8f0d870509fe 422 /* Check the parameters */
Sergunb 0:8f0d870509fe 423 assert_param(IS_FLASH_ADDRESS(Page_Address));
Sergunb 0:8f0d870509fe 424
Sergunb 0:8f0d870509fe 425 #ifdef STM32F10X_XL
Sergunb 0:8f0d870509fe 426 if(Page_Address < FLASH_BANK1_END_ADDRESS)
Sergunb 0:8f0d870509fe 427 {
Sergunb 0:8f0d870509fe 428 /* Wait for last operation to be completed */
Sergunb 0:8f0d870509fe 429 status = FLASH_WaitForLastBank1Operation(EraseTimeout);
Sergunb 0:8f0d870509fe 430 if(status == FLASH_COMPLETE)
Sergunb 0:8f0d870509fe 431 {
Sergunb 0:8f0d870509fe 432 /* if the previous operation is completed, proceed to erase the page */
Sergunb 0:8f0d870509fe 433 FLASH->CR|= CR_PER_Set;
Sergunb 0:8f0d870509fe 434 FLASH->AR = Page_Address;
Sergunb 0:8f0d870509fe 435 FLASH->CR|= CR_STRT_Set;
Sergunb 0:8f0d870509fe 436
Sergunb 0:8f0d870509fe 437 /* Wait for last operation to be completed */
Sergunb 0:8f0d870509fe 438 status = FLASH_WaitForLastBank1Operation(EraseTimeout);
Sergunb 0:8f0d870509fe 439
Sergunb 0:8f0d870509fe 440 /* Disable the PER Bit */
Sergunb 0:8f0d870509fe 441 FLASH->CR &= CR_PER_Reset;
Sergunb 0:8f0d870509fe 442 }
Sergunb 0:8f0d870509fe 443 }
Sergunb 0:8f0d870509fe 444 else
Sergunb 0:8f0d870509fe 445 {
Sergunb 0:8f0d870509fe 446 /* Wait for last operation to be completed */
Sergunb 0:8f0d870509fe 447 status = FLASH_WaitForLastBank2Operation(EraseTimeout);
Sergunb 0:8f0d870509fe 448 if(status == FLASH_COMPLETE)
Sergunb 0:8f0d870509fe 449 {
Sergunb 0:8f0d870509fe 450 /* if the previous operation is completed, proceed to erase the page */
Sergunb 0:8f0d870509fe 451 FLASH->CR2|= CR_PER_Set;
Sergunb 0:8f0d870509fe 452 FLASH->AR2 = Page_Address;
Sergunb 0:8f0d870509fe 453 FLASH->CR2|= CR_STRT_Set;
Sergunb 0:8f0d870509fe 454
Sergunb 0:8f0d870509fe 455 /* Wait for last operation to be completed */
Sergunb 0:8f0d870509fe 456 status = FLASH_WaitForLastBank2Operation(EraseTimeout);
Sergunb 0:8f0d870509fe 457
Sergunb 0:8f0d870509fe 458 /* Disable the PER Bit */
Sergunb 0:8f0d870509fe 459 FLASH->CR2 &= CR_PER_Reset;
Sergunb 0:8f0d870509fe 460 }
Sergunb 0:8f0d870509fe 461 }
Sergunb 0:8f0d870509fe 462 #else
Sergunb 0:8f0d870509fe 463 /* Wait for last operation to be completed */
Sergunb 0:8f0d870509fe 464 status = FLASH_WaitForLastOperation(EraseTimeout);
Sergunb 0:8f0d870509fe 465
Sergunb 0:8f0d870509fe 466 if(status == FLASH_COMPLETE)
Sergunb 0:8f0d870509fe 467 {
Sergunb 0:8f0d870509fe 468 /* if the previous operation is completed, proceed to erase the page */
Sergunb 0:8f0d870509fe 469 FLASH->CR|= CR_PER_Set;
Sergunb 0:8f0d870509fe 470 FLASH->AR = Page_Address;
Sergunb 0:8f0d870509fe 471 FLASH->CR|= CR_STRT_Set;
Sergunb 0:8f0d870509fe 472
Sergunb 0:8f0d870509fe 473 /* Wait for last operation to be completed */
Sergunb 0:8f0d870509fe 474 status = FLASH_WaitForLastOperation(EraseTimeout);
Sergunb 0:8f0d870509fe 475
Sergunb 0:8f0d870509fe 476 /* Disable the PER Bit */
Sergunb 0:8f0d870509fe 477 FLASH->CR &= CR_PER_Reset;
Sergunb 0:8f0d870509fe 478 }
Sergunb 0:8f0d870509fe 479 #endif /* STM32F10X_XL */
Sergunb 0:8f0d870509fe 480
Sergunb 0:8f0d870509fe 481 /* Return the Erase Status */
Sergunb 0:8f0d870509fe 482 return status;
Sergunb 0:8f0d870509fe 483 }
Sergunb 0:8f0d870509fe 484
Sergunb 0:8f0d870509fe 485 /**
Sergunb 0:8f0d870509fe 486 * @brief Erases all FLASH pages.
Sergunb 0:8f0d870509fe 487 * @note This function can be used for all STM32F10x devices.
Sergunb 0:8f0d870509fe 488 * @param None
Sergunb 0:8f0d870509fe 489 * @retval FLASH Status: The returned value can be: FLASH_ERROR_PG,
Sergunb 0:8f0d870509fe 490 * FLASH_ERROR_WRP, FLASH_COMPLETE or FLASH_TIMEOUT.
Sergunb 0:8f0d870509fe 491 */
Sergunb 0:8f0d870509fe 492 FLASH_Status FLASH_EraseAllPages(void)
Sergunb 0:8f0d870509fe 493 {
Sergunb 0:8f0d870509fe 494 FLASH_Status status = FLASH_COMPLETE;
Sergunb 0:8f0d870509fe 495
Sergunb 0:8f0d870509fe 496 #ifdef STM32F10X_XL
Sergunb 0:8f0d870509fe 497 /* Wait for last operation to be completed */
Sergunb 0:8f0d870509fe 498 status = FLASH_WaitForLastBank1Operation(EraseTimeout);
Sergunb 0:8f0d870509fe 499
Sergunb 0:8f0d870509fe 500 if(status == FLASH_COMPLETE)
Sergunb 0:8f0d870509fe 501 {
Sergunb 0:8f0d870509fe 502 /* if the previous operation is completed, proceed to erase all pages */
Sergunb 0:8f0d870509fe 503 FLASH->CR |= CR_MER_Set;
Sergunb 0:8f0d870509fe 504 FLASH->CR |= CR_STRT_Set;
Sergunb 0:8f0d870509fe 505
Sergunb 0:8f0d870509fe 506 /* Wait for last operation to be completed */
Sergunb 0:8f0d870509fe 507 status = FLASH_WaitForLastBank1Operation(EraseTimeout);
Sergunb 0:8f0d870509fe 508
Sergunb 0:8f0d870509fe 509 /* Disable the MER Bit */
Sergunb 0:8f0d870509fe 510 FLASH->CR &= CR_MER_Reset;
Sergunb 0:8f0d870509fe 511 }
Sergunb 0:8f0d870509fe 512 if(status == FLASH_COMPLETE)
Sergunb 0:8f0d870509fe 513 {
Sergunb 0:8f0d870509fe 514 /* if the previous operation is completed, proceed to erase all pages */
Sergunb 0:8f0d870509fe 515 FLASH->CR2 |= CR_MER_Set;
Sergunb 0:8f0d870509fe 516 FLASH->CR2 |= CR_STRT_Set;
Sergunb 0:8f0d870509fe 517
Sergunb 0:8f0d870509fe 518 /* Wait for last operation to be completed */
Sergunb 0:8f0d870509fe 519 status = FLASH_WaitForLastBank2Operation(EraseTimeout);
Sergunb 0:8f0d870509fe 520
Sergunb 0:8f0d870509fe 521 /* Disable the MER Bit */
Sergunb 0:8f0d870509fe 522 FLASH->CR2 &= CR_MER_Reset;
Sergunb 0:8f0d870509fe 523 }
Sergunb 0:8f0d870509fe 524 #else
Sergunb 0:8f0d870509fe 525 /* Wait for last operation to be completed */
Sergunb 0:8f0d870509fe 526 status = FLASH_WaitForLastOperation(EraseTimeout);
Sergunb 0:8f0d870509fe 527 if(status == FLASH_COMPLETE)
Sergunb 0:8f0d870509fe 528 {
Sergunb 0:8f0d870509fe 529 /* if the previous operation is completed, proceed to erase all pages */
Sergunb 0:8f0d870509fe 530 FLASH->CR |= CR_MER_Set;
Sergunb 0:8f0d870509fe 531 FLASH->CR |= CR_STRT_Set;
Sergunb 0:8f0d870509fe 532
Sergunb 0:8f0d870509fe 533 /* Wait for last operation to be completed */
Sergunb 0:8f0d870509fe 534 status = FLASH_WaitForLastOperation(EraseTimeout);
Sergunb 0:8f0d870509fe 535
Sergunb 0:8f0d870509fe 536 /* Disable the MER Bit */
Sergunb 0:8f0d870509fe 537 FLASH->CR &= CR_MER_Reset;
Sergunb 0:8f0d870509fe 538 }
Sergunb 0:8f0d870509fe 539 #endif /* STM32F10X_XL */
Sergunb 0:8f0d870509fe 540
Sergunb 0:8f0d870509fe 541 /* Return the Erase Status */
Sergunb 0:8f0d870509fe 542 return status;
Sergunb 0:8f0d870509fe 543 }
Sergunb 0:8f0d870509fe 544
Sergunb 0:8f0d870509fe 545 /**
Sergunb 0:8f0d870509fe 546 * @brief Erases all Bank1 FLASH pages.
Sergunb 0:8f0d870509fe 547 * @note This function can be used for all STM32F10x devices.
Sergunb 0:8f0d870509fe 548 * - For STM32F10X_XL devices this function erases all Bank1 pages.
Sergunb 0:8f0d870509fe 549 * - For all other devices it erases all Bank1 pages and it is equivalent
Sergunb 0:8f0d870509fe 550 * to FLASH_EraseAllPages function.
Sergunb 0:8f0d870509fe 551 * @param None
Sergunb 0:8f0d870509fe 552 * @retval FLASH Status: The returned value can be: FLASH_ERROR_PG,
Sergunb 0:8f0d870509fe 553 * FLASH_ERROR_WRP, FLASH_COMPLETE or FLASH_TIMEOUT.
Sergunb 0:8f0d870509fe 554 */
Sergunb 0:8f0d870509fe 555 FLASH_Status FLASH_EraseAllBank1Pages(void)
Sergunb 0:8f0d870509fe 556 {
Sergunb 0:8f0d870509fe 557 FLASH_Status status = FLASH_COMPLETE;
Sergunb 0:8f0d870509fe 558 /* Wait for last operation to be completed */
Sergunb 0:8f0d870509fe 559 status = FLASH_WaitForLastBank1Operation(EraseTimeout);
Sergunb 0:8f0d870509fe 560
Sergunb 0:8f0d870509fe 561 if(status == FLASH_COMPLETE)
Sergunb 0:8f0d870509fe 562 {
Sergunb 0:8f0d870509fe 563 /* if the previous operation is completed, proceed to erase all pages */
Sergunb 0:8f0d870509fe 564 FLASH->CR |= CR_MER_Set;
Sergunb 0:8f0d870509fe 565 FLASH->CR |= CR_STRT_Set;
Sergunb 0:8f0d870509fe 566
Sergunb 0:8f0d870509fe 567 /* Wait for last operation to be completed */
Sergunb 0:8f0d870509fe 568 status = FLASH_WaitForLastBank1Operation(EraseTimeout);
Sergunb 0:8f0d870509fe 569
Sergunb 0:8f0d870509fe 570 /* Disable the MER Bit */
Sergunb 0:8f0d870509fe 571 FLASH->CR &= CR_MER_Reset;
Sergunb 0:8f0d870509fe 572 }
Sergunb 0:8f0d870509fe 573 /* Return the Erase Status */
Sergunb 0:8f0d870509fe 574 return status;
Sergunb 0:8f0d870509fe 575 }
Sergunb 0:8f0d870509fe 576
Sergunb 0:8f0d870509fe 577 #ifdef STM32F10X_XL
Sergunb 0:8f0d870509fe 578 /**
Sergunb 0:8f0d870509fe 579 * @brief Erases all Bank2 FLASH pages.
Sergunb 0:8f0d870509fe 580 * @note This function can be used only for STM32F10x_XL density devices.
Sergunb 0:8f0d870509fe 581 * @param None
Sergunb 0:8f0d870509fe 582 * @retval FLASH Status: The returned value can be: FLASH_ERROR_PG,
Sergunb 0:8f0d870509fe 583 * FLASH_ERROR_WRP, FLASH_COMPLETE or FLASH_TIMEOUT.
Sergunb 0:8f0d870509fe 584 */
Sergunb 0:8f0d870509fe 585 FLASH_Status FLASH_EraseAllBank2Pages(void)
Sergunb 0:8f0d870509fe 586 {
Sergunb 0:8f0d870509fe 587 FLASH_Status status = FLASH_COMPLETE;
Sergunb 0:8f0d870509fe 588 /* Wait for last operation to be completed */
Sergunb 0:8f0d870509fe 589 status = FLASH_WaitForLastBank2Operation(EraseTimeout);
Sergunb 0:8f0d870509fe 590
Sergunb 0:8f0d870509fe 591 if(status == FLASH_COMPLETE)
Sergunb 0:8f0d870509fe 592 {
Sergunb 0:8f0d870509fe 593 /* if the previous operation is completed, proceed to erase all pages */
Sergunb 0:8f0d870509fe 594 FLASH->CR2 |= CR_MER_Set;
Sergunb 0:8f0d870509fe 595 FLASH->CR2 |= CR_STRT_Set;
Sergunb 0:8f0d870509fe 596
Sergunb 0:8f0d870509fe 597 /* Wait for last operation to be completed */
Sergunb 0:8f0d870509fe 598 status = FLASH_WaitForLastBank2Operation(EraseTimeout);
Sergunb 0:8f0d870509fe 599
Sergunb 0:8f0d870509fe 600 /* Disable the MER Bit */
Sergunb 0:8f0d870509fe 601 FLASH->CR2 &= CR_MER_Reset;
Sergunb 0:8f0d870509fe 602 }
Sergunb 0:8f0d870509fe 603 /* Return the Erase Status */
Sergunb 0:8f0d870509fe 604 return status;
Sergunb 0:8f0d870509fe 605 }
Sergunb 0:8f0d870509fe 606 #endif /* STM32F10X_XL */
Sergunb 0:8f0d870509fe 607
Sergunb 0:8f0d870509fe 608 /**
Sergunb 0:8f0d870509fe 609 * @brief Erases the FLASH option bytes.
Sergunb 0:8f0d870509fe 610 * @note This functions erases all option bytes except the Read protection (RDP).
Sergunb 0:8f0d870509fe 611 * @note This function can be used for all STM32F10x devices.
Sergunb 0:8f0d870509fe 612 * @param None
Sergunb 0:8f0d870509fe 613 * @retval FLASH Status: The returned value can be: FLASH_ERROR_PG,
Sergunb 0:8f0d870509fe 614 * FLASH_ERROR_WRP, FLASH_COMPLETE or FLASH_TIMEOUT.
Sergunb 0:8f0d870509fe 615 */
Sergunb 0:8f0d870509fe 616 FLASH_Status FLASH_EraseOptionBytes(void)
Sergunb 0:8f0d870509fe 617 {
Sergunb 0:8f0d870509fe 618 uint16_t rdptmp = RDP_Key;
Sergunb 0:8f0d870509fe 619
Sergunb 0:8f0d870509fe 620 FLASH_Status status = FLASH_COMPLETE;
Sergunb 0:8f0d870509fe 621
Sergunb 0:8f0d870509fe 622 /* Get the actual read protection Option Byte value */
Sergunb 0:8f0d870509fe 623 if(FLASH_GetReadOutProtectionStatus() != RESET)
Sergunb 0:8f0d870509fe 624 {
Sergunb 0:8f0d870509fe 625 rdptmp = 0x00;
Sergunb 0:8f0d870509fe 626 }
Sergunb 0:8f0d870509fe 627
Sergunb 0:8f0d870509fe 628 /* Wait for last operation to be completed */
Sergunb 0:8f0d870509fe 629 status = FLASH_WaitForLastOperation(EraseTimeout);
Sergunb 0:8f0d870509fe 630 if(status == FLASH_COMPLETE)
Sergunb 0:8f0d870509fe 631 {
Sergunb 0:8f0d870509fe 632 /* Authorize the small information block programming */
Sergunb 0:8f0d870509fe 633 FLASH->OPTKEYR = FLASH_KEY1;
Sergunb 0:8f0d870509fe 634 FLASH->OPTKEYR = FLASH_KEY2;
Sergunb 0:8f0d870509fe 635
Sergunb 0:8f0d870509fe 636 /* if the previous operation is completed, proceed to erase the option bytes */
Sergunb 0:8f0d870509fe 637 FLASH->CR |= CR_OPTER_Set;
Sergunb 0:8f0d870509fe 638 FLASH->CR |= CR_STRT_Set;
Sergunb 0:8f0d870509fe 639 /* Wait for last operation to be completed */
Sergunb 0:8f0d870509fe 640 status = FLASH_WaitForLastOperation(EraseTimeout);
Sergunb 0:8f0d870509fe 641
Sergunb 0:8f0d870509fe 642 if(status == FLASH_COMPLETE)
Sergunb 0:8f0d870509fe 643 {
Sergunb 0:8f0d870509fe 644 /* if the erase operation is completed, disable the OPTER Bit */
Sergunb 0:8f0d870509fe 645 FLASH->CR &= CR_OPTER_Reset;
Sergunb 0:8f0d870509fe 646
Sergunb 0:8f0d870509fe 647 /* Enable the Option Bytes Programming operation */
Sergunb 0:8f0d870509fe 648 FLASH->CR |= CR_OPTPG_Set;
Sergunb 0:8f0d870509fe 649 /* Restore the last read protection Option Byte value */
Sergunb 0:8f0d870509fe 650 OB->RDP = (uint16_t)rdptmp;
Sergunb 0:8f0d870509fe 651 /* Wait for last operation to be completed */
Sergunb 0:8f0d870509fe 652 status = FLASH_WaitForLastOperation(ProgramTimeout);
Sergunb 0:8f0d870509fe 653
Sergunb 0:8f0d870509fe 654 if(status != FLASH_TIMEOUT)
Sergunb 0:8f0d870509fe 655 {
Sergunb 0:8f0d870509fe 656 /* if the program operation is completed, disable the OPTPG Bit */
Sergunb 0:8f0d870509fe 657 FLASH->CR &= CR_OPTPG_Reset;
Sergunb 0:8f0d870509fe 658 }
Sergunb 0:8f0d870509fe 659 }
Sergunb 0:8f0d870509fe 660 else
Sergunb 0:8f0d870509fe 661 {
Sergunb 0:8f0d870509fe 662 if (status != FLASH_TIMEOUT)
Sergunb 0:8f0d870509fe 663 {
Sergunb 0:8f0d870509fe 664 /* Disable the OPTPG Bit */
Sergunb 0:8f0d870509fe 665 FLASH->CR &= CR_OPTPG_Reset;
Sergunb 0:8f0d870509fe 666 }
Sergunb 0:8f0d870509fe 667 }
Sergunb 0:8f0d870509fe 668 }
Sergunb 0:8f0d870509fe 669 /* Return the erase status */
Sergunb 0:8f0d870509fe 670 return status;
Sergunb 0:8f0d870509fe 671 }
Sergunb 0:8f0d870509fe 672
Sergunb 0:8f0d870509fe 673 /**
Sergunb 0:8f0d870509fe 674 * @brief Programs a word at a specified address.
Sergunb 0:8f0d870509fe 675 * @note This function can be used for all STM32F10x devices.
Sergunb 0:8f0d870509fe 676 * @param Address: specifies the address to be programmed.
Sergunb 0:8f0d870509fe 677 * @param Data: specifies the data to be programmed.
Sergunb 0:8f0d870509fe 678 * @retval FLASH Status: The returned value can be: FLASH_ERROR_PG,
Sergunb 0:8f0d870509fe 679 * FLASH_ERROR_WRP, FLASH_COMPLETE or FLASH_TIMEOUT.
Sergunb 0:8f0d870509fe 680 */
Sergunb 0:8f0d870509fe 681 FLASH_Status FLASH_ProgramWord(uint32_t Address, uint32_t Data)
Sergunb 0:8f0d870509fe 682 {
Sergunb 0:8f0d870509fe 683 FLASH_Status status = FLASH_COMPLETE;
Sergunb 0:8f0d870509fe 684 __IO uint32_t tmp = 0;
Sergunb 0:8f0d870509fe 685
Sergunb 0:8f0d870509fe 686 /* Check the parameters */
Sergunb 0:8f0d870509fe 687 assert_param(IS_FLASH_ADDRESS(Address));
Sergunb 0:8f0d870509fe 688
Sergunb 0:8f0d870509fe 689 #ifdef STM32F10X_XL
Sergunb 0:8f0d870509fe 690 if(Address < FLASH_BANK1_END_ADDRESS - 2)
Sergunb 0:8f0d870509fe 691 {
Sergunb 0:8f0d870509fe 692 /* Wait for last operation to be completed */
Sergunb 0:8f0d870509fe 693 status = FLASH_WaitForLastBank1Operation(ProgramTimeout);
Sergunb 0:8f0d870509fe 694 if(status == FLASH_COMPLETE)
Sergunb 0:8f0d870509fe 695 {
Sergunb 0:8f0d870509fe 696 /* if the previous operation is completed, proceed to program the new first
Sergunb 0:8f0d870509fe 697 half word */
Sergunb 0:8f0d870509fe 698 FLASH->CR |= CR_PG_Set;
Sergunb 0:8f0d870509fe 699
Sergunb 0:8f0d870509fe 700 *(__IO uint16_t*)Address = (uint16_t)Data;
Sergunb 0:8f0d870509fe 701 /* Wait for last operation to be completed */
Sergunb 0:8f0d870509fe 702 status = FLASH_WaitForLastOperation(ProgramTimeout);
Sergunb 0:8f0d870509fe 703
Sergunb 0:8f0d870509fe 704 if(status == FLASH_COMPLETE)
Sergunb 0:8f0d870509fe 705 {
Sergunb 0:8f0d870509fe 706 /* if the previous operation is completed, proceed to program the new second
Sergunb 0:8f0d870509fe 707 half word */
Sergunb 0:8f0d870509fe 708 tmp = Address + 2;
Sergunb 0:8f0d870509fe 709
Sergunb 0:8f0d870509fe 710 *(__IO uint16_t*) tmp = Data >> 16;
Sergunb 0:8f0d870509fe 711
Sergunb 0:8f0d870509fe 712 /* Wait for last operation to be completed */
Sergunb 0:8f0d870509fe 713 status = FLASH_WaitForLastOperation(ProgramTimeout);
Sergunb 0:8f0d870509fe 714
Sergunb 0:8f0d870509fe 715 /* Disable the PG Bit */
Sergunb 0:8f0d870509fe 716 FLASH->CR &= CR_PG_Reset;
Sergunb 0:8f0d870509fe 717 }
Sergunb 0:8f0d870509fe 718 else
Sergunb 0:8f0d870509fe 719 {
Sergunb 0:8f0d870509fe 720 /* Disable the PG Bit */
Sergunb 0:8f0d870509fe 721 FLASH->CR &= CR_PG_Reset;
Sergunb 0:8f0d870509fe 722 }
Sergunb 0:8f0d870509fe 723 }
Sergunb 0:8f0d870509fe 724 }
Sergunb 0:8f0d870509fe 725 else if(Address == (FLASH_BANK1_END_ADDRESS - 1))
Sergunb 0:8f0d870509fe 726 {
Sergunb 0:8f0d870509fe 727 /* Wait for last operation to be completed */
Sergunb 0:8f0d870509fe 728 status = FLASH_WaitForLastBank1Operation(ProgramTimeout);
Sergunb 0:8f0d870509fe 729
Sergunb 0:8f0d870509fe 730 if(status == FLASH_COMPLETE)
Sergunb 0:8f0d870509fe 731 {
Sergunb 0:8f0d870509fe 732 /* if the previous operation is completed, proceed to program the new first
Sergunb 0:8f0d870509fe 733 half word */
Sergunb 0:8f0d870509fe 734 FLASH->CR |= CR_PG_Set;
Sergunb 0:8f0d870509fe 735
Sergunb 0:8f0d870509fe 736 *(__IO uint16_t*)Address = (uint16_t)Data;
Sergunb 0:8f0d870509fe 737
Sergunb 0:8f0d870509fe 738 /* Wait for last operation to be completed */
Sergunb 0:8f0d870509fe 739 status = FLASH_WaitForLastBank1Operation(ProgramTimeout);
Sergunb 0:8f0d870509fe 740
Sergunb 0:8f0d870509fe 741 /* Disable the PG Bit */
Sergunb 0:8f0d870509fe 742 FLASH->CR &= CR_PG_Reset;
Sergunb 0:8f0d870509fe 743 }
Sergunb 0:8f0d870509fe 744 else
Sergunb 0:8f0d870509fe 745 {
Sergunb 0:8f0d870509fe 746 /* Disable the PG Bit */
Sergunb 0:8f0d870509fe 747 FLASH->CR &= CR_PG_Reset;
Sergunb 0:8f0d870509fe 748 }
Sergunb 0:8f0d870509fe 749
Sergunb 0:8f0d870509fe 750 /* Wait for last operation to be completed */
Sergunb 0:8f0d870509fe 751 status = FLASH_WaitForLastBank2Operation(ProgramTimeout);
Sergunb 0:8f0d870509fe 752
Sergunb 0:8f0d870509fe 753 if(status == FLASH_COMPLETE)
Sergunb 0:8f0d870509fe 754 {
Sergunb 0:8f0d870509fe 755 /* if the previous operation is completed, proceed to program the new second
Sergunb 0:8f0d870509fe 756 half word */
Sergunb 0:8f0d870509fe 757 FLASH->CR2 |= CR_PG_Set;
Sergunb 0:8f0d870509fe 758 tmp = Address + 2;
Sergunb 0:8f0d870509fe 759
Sergunb 0:8f0d870509fe 760 *(__IO uint16_t*) tmp = Data >> 16;
Sergunb 0:8f0d870509fe 761
Sergunb 0:8f0d870509fe 762 /* Wait for last operation to be completed */
Sergunb 0:8f0d870509fe 763 status = FLASH_WaitForLastBank2Operation(ProgramTimeout);
Sergunb 0:8f0d870509fe 764
Sergunb 0:8f0d870509fe 765 /* Disable the PG Bit */
Sergunb 0:8f0d870509fe 766 FLASH->CR2 &= CR_PG_Reset;
Sergunb 0:8f0d870509fe 767 }
Sergunb 0:8f0d870509fe 768 else
Sergunb 0:8f0d870509fe 769 {
Sergunb 0:8f0d870509fe 770 /* Disable the PG Bit */
Sergunb 0:8f0d870509fe 771 FLASH->CR2 &= CR_PG_Reset;
Sergunb 0:8f0d870509fe 772 }
Sergunb 0:8f0d870509fe 773 }
Sergunb 0:8f0d870509fe 774 else
Sergunb 0:8f0d870509fe 775 {
Sergunb 0:8f0d870509fe 776 /* Wait for last operation to be completed */
Sergunb 0:8f0d870509fe 777 status = FLASH_WaitForLastBank2Operation(ProgramTimeout);
Sergunb 0:8f0d870509fe 778
Sergunb 0:8f0d870509fe 779 if(status == FLASH_COMPLETE)
Sergunb 0:8f0d870509fe 780 {
Sergunb 0:8f0d870509fe 781 /* if the previous operation is completed, proceed to program the new first
Sergunb 0:8f0d870509fe 782 half word */
Sergunb 0:8f0d870509fe 783 FLASH->CR2 |= CR_PG_Set;
Sergunb 0:8f0d870509fe 784
Sergunb 0:8f0d870509fe 785 *(__IO uint16_t*)Address = (uint16_t)Data;
Sergunb 0:8f0d870509fe 786 /* Wait for last operation to be completed */
Sergunb 0:8f0d870509fe 787 status = FLASH_WaitForLastBank2Operation(ProgramTimeout);
Sergunb 0:8f0d870509fe 788
Sergunb 0:8f0d870509fe 789 if(status == FLASH_COMPLETE)
Sergunb 0:8f0d870509fe 790 {
Sergunb 0:8f0d870509fe 791 /* if the previous operation is completed, proceed to program the new second
Sergunb 0:8f0d870509fe 792 half word */
Sergunb 0:8f0d870509fe 793 tmp = Address + 2;
Sergunb 0:8f0d870509fe 794
Sergunb 0:8f0d870509fe 795 *(__IO uint16_t*) tmp = Data >> 16;
Sergunb 0:8f0d870509fe 796
Sergunb 0:8f0d870509fe 797 /* Wait for last operation to be completed */
Sergunb 0:8f0d870509fe 798 status = FLASH_WaitForLastBank2Operation(ProgramTimeout);
Sergunb 0:8f0d870509fe 799
Sergunb 0:8f0d870509fe 800 /* Disable the PG Bit */
Sergunb 0:8f0d870509fe 801 FLASH->CR2 &= CR_PG_Reset;
Sergunb 0:8f0d870509fe 802 }
Sergunb 0:8f0d870509fe 803 else
Sergunb 0:8f0d870509fe 804 {
Sergunb 0:8f0d870509fe 805 /* Disable the PG Bit */
Sergunb 0:8f0d870509fe 806 FLASH->CR2 &= CR_PG_Reset;
Sergunb 0:8f0d870509fe 807 }
Sergunb 0:8f0d870509fe 808 }
Sergunb 0:8f0d870509fe 809 }
Sergunb 0:8f0d870509fe 810 #else
Sergunb 0:8f0d870509fe 811 /* Wait for last operation to be completed */
Sergunb 0:8f0d870509fe 812 status = FLASH_WaitForLastOperation(ProgramTimeout);
Sergunb 0:8f0d870509fe 813
Sergunb 0:8f0d870509fe 814 if(status == FLASH_COMPLETE)
Sergunb 0:8f0d870509fe 815 {
Sergunb 0:8f0d870509fe 816 /* if the previous operation is completed, proceed to program the new first
Sergunb 0:8f0d870509fe 817 half word */
Sergunb 0:8f0d870509fe 818 FLASH->CR |= CR_PG_Set;
Sergunb 0:8f0d870509fe 819
Sergunb 0:8f0d870509fe 820 *(__IO uint16_t*)Address = (uint16_t)Data;
Sergunb 0:8f0d870509fe 821 /* Wait for last operation to be completed */
Sergunb 0:8f0d870509fe 822 status = FLASH_WaitForLastOperation(ProgramTimeout);
Sergunb 0:8f0d870509fe 823
Sergunb 0:8f0d870509fe 824 if(status == FLASH_COMPLETE)
Sergunb 0:8f0d870509fe 825 {
Sergunb 0:8f0d870509fe 826 /* if the previous operation is completed, proceed to program the new second
Sergunb 0:8f0d870509fe 827 half word */
Sergunb 0:8f0d870509fe 828 tmp = Address + 2;
Sergunb 0:8f0d870509fe 829
Sergunb 0:8f0d870509fe 830 *(__IO uint16_t*) tmp = Data >> 16;
Sergunb 0:8f0d870509fe 831
Sergunb 0:8f0d870509fe 832 /* Wait for last operation to be completed */
Sergunb 0:8f0d870509fe 833 status = FLASH_WaitForLastOperation(ProgramTimeout);
Sergunb 0:8f0d870509fe 834
Sergunb 0:8f0d870509fe 835 /* Disable the PG Bit */
Sergunb 0:8f0d870509fe 836 FLASH->CR &= CR_PG_Reset;
Sergunb 0:8f0d870509fe 837 }
Sergunb 0:8f0d870509fe 838 else
Sergunb 0:8f0d870509fe 839 {
Sergunb 0:8f0d870509fe 840 /* Disable the PG Bit */
Sergunb 0:8f0d870509fe 841 FLASH->CR &= CR_PG_Reset;
Sergunb 0:8f0d870509fe 842 }
Sergunb 0:8f0d870509fe 843 }
Sergunb 0:8f0d870509fe 844 #endif /* STM32F10X_XL */
Sergunb 0:8f0d870509fe 845
Sergunb 0:8f0d870509fe 846 /* Return the Program Status */
Sergunb 0:8f0d870509fe 847 return status;
Sergunb 0:8f0d870509fe 848 }
Sergunb 0:8f0d870509fe 849
Sergunb 0:8f0d870509fe 850 /**
Sergunb 0:8f0d870509fe 851 * @brief Programs a half word at a specified address.
Sergunb 0:8f0d870509fe 852 * @note This function can be used for all STM32F10x devices.
Sergunb 0:8f0d870509fe 853 * @param Address: specifies the address to be programmed.
Sergunb 0:8f0d870509fe 854 * @param Data: specifies the data to be programmed.
Sergunb 0:8f0d870509fe 855 * @retval FLASH Status: The returned value can be: FLASH_ERROR_PG,
Sergunb 0:8f0d870509fe 856 * FLASH_ERROR_WRP, FLASH_COMPLETE or FLASH_TIMEOUT.
Sergunb 0:8f0d870509fe 857 */
Sergunb 0:8f0d870509fe 858 FLASH_Status FLASH_ProgramHalfWord(uint32_t Address, uint16_t Data)
Sergunb 0:8f0d870509fe 859 {
Sergunb 0:8f0d870509fe 860 FLASH_Status status = FLASH_COMPLETE;
Sergunb 0:8f0d870509fe 861 /* Check the parameters */
Sergunb 0:8f0d870509fe 862 assert_param(IS_FLASH_ADDRESS(Address));
Sergunb 0:8f0d870509fe 863
Sergunb 0:8f0d870509fe 864 #ifdef STM32F10X_XL
Sergunb 0:8f0d870509fe 865 /* Wait for last operation to be completed */
Sergunb 0:8f0d870509fe 866 status = FLASH_WaitForLastOperation(ProgramTimeout);
Sergunb 0:8f0d870509fe 867
Sergunb 0:8f0d870509fe 868 if(Address < FLASH_BANK1_END_ADDRESS)
Sergunb 0:8f0d870509fe 869 {
Sergunb 0:8f0d870509fe 870 if(status == FLASH_COMPLETE)
Sergunb 0:8f0d870509fe 871 {
Sergunb 0:8f0d870509fe 872 /* if the previous operation is completed, proceed to program the new data */
Sergunb 0:8f0d870509fe 873 FLASH->CR |= CR_PG_Set;
Sergunb 0:8f0d870509fe 874
Sergunb 0:8f0d870509fe 875 *(__IO uint16_t*)Address = Data;
Sergunb 0:8f0d870509fe 876 /* Wait for last operation to be completed */
Sergunb 0:8f0d870509fe 877 status = FLASH_WaitForLastBank1Operation(ProgramTimeout);
Sergunb 0:8f0d870509fe 878
Sergunb 0:8f0d870509fe 879 /* Disable the PG Bit */
Sergunb 0:8f0d870509fe 880 FLASH->CR &= CR_PG_Reset;
Sergunb 0:8f0d870509fe 881 }
Sergunb 0:8f0d870509fe 882 }
Sergunb 0:8f0d870509fe 883 else
Sergunb 0:8f0d870509fe 884 {
Sergunb 0:8f0d870509fe 885 if(status == FLASH_COMPLETE)
Sergunb 0:8f0d870509fe 886 {
Sergunb 0:8f0d870509fe 887 /* if the previous operation is completed, proceed to program the new data */
Sergunb 0:8f0d870509fe 888 FLASH->CR2 |= CR_PG_Set;
Sergunb 0:8f0d870509fe 889
Sergunb 0:8f0d870509fe 890 *(__IO uint16_t*)Address = Data;
Sergunb 0:8f0d870509fe 891 /* Wait for last operation to be completed */
Sergunb 0:8f0d870509fe 892 status = FLASH_WaitForLastBank2Operation(ProgramTimeout);
Sergunb 0:8f0d870509fe 893
Sergunb 0:8f0d870509fe 894 /* Disable the PG Bit */
Sergunb 0:8f0d870509fe 895 FLASH->CR2 &= CR_PG_Reset;
Sergunb 0:8f0d870509fe 896 }
Sergunb 0:8f0d870509fe 897 }
Sergunb 0:8f0d870509fe 898 #else
Sergunb 0:8f0d870509fe 899 /* Wait for last operation to be completed */
Sergunb 0:8f0d870509fe 900 status = FLASH_WaitForLastOperation(ProgramTimeout);
Sergunb 0:8f0d870509fe 901
Sergunb 0:8f0d870509fe 902 if(status == FLASH_COMPLETE)
Sergunb 0:8f0d870509fe 903 {
Sergunb 0:8f0d870509fe 904 /* if the previous operation is completed, proceed to program the new data */
Sergunb 0:8f0d870509fe 905 FLASH->CR |= CR_PG_Set;
Sergunb 0:8f0d870509fe 906
Sergunb 0:8f0d870509fe 907 *(__IO uint16_t*)Address = Data;
Sergunb 0:8f0d870509fe 908 /* Wait for last operation to be completed */
Sergunb 0:8f0d870509fe 909 status = FLASH_WaitForLastOperation(ProgramTimeout);
Sergunb 0:8f0d870509fe 910
Sergunb 0:8f0d870509fe 911 /* Disable the PG Bit */
Sergunb 0:8f0d870509fe 912 FLASH->CR &= CR_PG_Reset;
Sergunb 0:8f0d870509fe 913 }
Sergunb 0:8f0d870509fe 914 #endif /* STM32F10X_XL */
Sergunb 0:8f0d870509fe 915
Sergunb 0:8f0d870509fe 916 /* Return the Program Status */
Sergunb 0:8f0d870509fe 917 return status;
Sergunb 0:8f0d870509fe 918 }
Sergunb 0:8f0d870509fe 919
Sergunb 0:8f0d870509fe 920 /**
Sergunb 0:8f0d870509fe 921 * @brief Programs a half word at a specified Option Byte Data address.
Sergunb 0:8f0d870509fe 922 * @note This function can be used for all STM32F10x devices.
Sergunb 0:8f0d870509fe 923 * @param Address: specifies the address to be programmed.
Sergunb 0:8f0d870509fe 924 * This parameter can be 0x1FFFF804 or 0x1FFFF806.
Sergunb 0:8f0d870509fe 925 * @param Data: specifies the data to be programmed.
Sergunb 0:8f0d870509fe 926 * @retval FLASH Status: The returned value can be: FLASH_ERROR_PG,
Sergunb 0:8f0d870509fe 927 * FLASH_ERROR_WRP, FLASH_COMPLETE or FLASH_TIMEOUT.
Sergunb 0:8f0d870509fe 928 */
Sergunb 0:8f0d870509fe 929 FLASH_Status FLASH_ProgramOptionByteData(uint32_t Address, uint8_t Data)
Sergunb 0:8f0d870509fe 930 {
Sergunb 0:8f0d870509fe 931 FLASH_Status status = FLASH_COMPLETE;
Sergunb 0:8f0d870509fe 932 /* Check the parameters */
Sergunb 0:8f0d870509fe 933 assert_param(IS_OB_DATA_ADDRESS(Address));
Sergunb 0:8f0d870509fe 934 status = FLASH_WaitForLastOperation(ProgramTimeout);
Sergunb 0:8f0d870509fe 935
Sergunb 0:8f0d870509fe 936 if(status == FLASH_COMPLETE)
Sergunb 0:8f0d870509fe 937 {
Sergunb 0:8f0d870509fe 938 /* Authorize the small information block programming */
Sergunb 0:8f0d870509fe 939 FLASH->OPTKEYR = FLASH_KEY1;
Sergunb 0:8f0d870509fe 940 FLASH->OPTKEYR = FLASH_KEY2;
Sergunb 0:8f0d870509fe 941 /* Enables the Option Bytes Programming operation */
Sergunb 0:8f0d870509fe 942 FLASH->CR |= CR_OPTPG_Set;
Sergunb 0:8f0d870509fe 943 *(__IO uint16_t*)Address = Data;
Sergunb 0:8f0d870509fe 944
Sergunb 0:8f0d870509fe 945 /* Wait for last operation to be completed */
Sergunb 0:8f0d870509fe 946 status = FLASH_WaitForLastOperation(ProgramTimeout);
Sergunb 0:8f0d870509fe 947 if(status != FLASH_TIMEOUT)
Sergunb 0:8f0d870509fe 948 {
Sergunb 0:8f0d870509fe 949 /* if the program operation is completed, disable the OPTPG Bit */
Sergunb 0:8f0d870509fe 950 FLASH->CR &= CR_OPTPG_Reset;
Sergunb 0:8f0d870509fe 951 }
Sergunb 0:8f0d870509fe 952 }
Sergunb 0:8f0d870509fe 953 /* Return the Option Byte Data Program Status */
Sergunb 0:8f0d870509fe 954 return status;
Sergunb 0:8f0d870509fe 955 }
Sergunb 0:8f0d870509fe 956
Sergunb 0:8f0d870509fe 957 /**
Sergunb 0:8f0d870509fe 958 * @brief Write protects the desired pages
Sergunb 0:8f0d870509fe 959 * @note This function can be used for all STM32F10x devices.
Sergunb 0:8f0d870509fe 960 * @param FLASH_Pages: specifies the address of the pages to be write protected.
Sergunb 0:8f0d870509fe 961 * This parameter can be:
Sergunb 0:8f0d870509fe 962 * @arg For @b STM32_Low-density_devices: value between FLASH_WRProt_Pages0to3 and FLASH_WRProt_Pages28to31
Sergunb 0:8f0d870509fe 963 * @arg For @b STM32_Medium-density_devices: value between FLASH_WRProt_Pages0to3
Sergunb 0:8f0d870509fe 964 * and FLASH_WRProt_Pages124to127
Sergunb 0:8f0d870509fe 965 * @arg For @b STM32_High-density_devices: value between FLASH_WRProt_Pages0to1 and
Sergunb 0:8f0d870509fe 966 * FLASH_WRProt_Pages60to61 or FLASH_WRProt_Pages62to255
Sergunb 0:8f0d870509fe 967 * @arg For @b STM32_Connectivity_line_devices: value between FLASH_WRProt_Pages0to1 and
Sergunb 0:8f0d870509fe 968 * FLASH_WRProt_Pages60to61 or FLASH_WRProt_Pages62to127
Sergunb 0:8f0d870509fe 969 * @arg For @b STM32_XL-density_devices: value between FLASH_WRProt_Pages0to1 and
Sergunb 0:8f0d870509fe 970 * FLASH_WRProt_Pages60to61 or FLASH_WRProt_Pages62to511
Sergunb 0:8f0d870509fe 971 * @arg FLASH_WRProt_AllPages
Sergunb 0:8f0d870509fe 972 * @retval FLASH Status: The returned value can be: FLASH_ERROR_PG,
Sergunb 0:8f0d870509fe 973 * FLASH_ERROR_WRP, FLASH_COMPLETE or FLASH_TIMEOUT.
Sergunb 0:8f0d870509fe 974 */
Sergunb 0:8f0d870509fe 975 FLASH_Status FLASH_EnableWriteProtection(uint32_t FLASH_Pages)
Sergunb 0:8f0d870509fe 976 {
Sergunb 0:8f0d870509fe 977 uint16_t WRP0_Data = 0xFFFF, WRP1_Data = 0xFFFF, WRP2_Data = 0xFFFF, WRP3_Data = 0xFFFF;
Sergunb 0:8f0d870509fe 978
Sergunb 0:8f0d870509fe 979 FLASH_Status status = FLASH_COMPLETE;
Sergunb 0:8f0d870509fe 980
Sergunb 0:8f0d870509fe 981 /* Check the parameters */
Sergunb 0:8f0d870509fe 982 assert_param(IS_FLASH_WRPROT_PAGE(FLASH_Pages));
Sergunb 0:8f0d870509fe 983
Sergunb 0:8f0d870509fe 984 FLASH_Pages = (uint32_t)(~FLASH_Pages);
Sergunb 0:8f0d870509fe 985 WRP0_Data = (uint16_t)(FLASH_Pages & WRP0_Mask);
Sergunb 0:8f0d870509fe 986 WRP1_Data = (uint16_t)((FLASH_Pages & WRP1_Mask) >> 8);
Sergunb 0:8f0d870509fe 987 WRP2_Data = (uint16_t)((FLASH_Pages & WRP2_Mask) >> 16);
Sergunb 0:8f0d870509fe 988 WRP3_Data = (uint16_t)((FLASH_Pages & WRP3_Mask) >> 24);
Sergunb 0:8f0d870509fe 989
Sergunb 0:8f0d870509fe 990 /* Wait for last operation to be completed */
Sergunb 0:8f0d870509fe 991 status = FLASH_WaitForLastOperation(ProgramTimeout);
Sergunb 0:8f0d870509fe 992
Sergunb 0:8f0d870509fe 993 if(status == FLASH_COMPLETE)
Sergunb 0:8f0d870509fe 994 {
Sergunb 0:8f0d870509fe 995 /* Authorizes the small information block programming */
Sergunb 0:8f0d870509fe 996 FLASH->OPTKEYR = FLASH_KEY1;
Sergunb 0:8f0d870509fe 997 FLASH->OPTKEYR = FLASH_KEY2;
Sergunb 0:8f0d870509fe 998 FLASH->CR |= CR_OPTPG_Set;
Sergunb 0:8f0d870509fe 999 if(WRP0_Data != 0xFF)
Sergunb 0:8f0d870509fe 1000 {
Sergunb 0:8f0d870509fe 1001 OB->WRP0 = WRP0_Data;
Sergunb 0:8f0d870509fe 1002
Sergunb 0:8f0d870509fe 1003 /* Wait for last operation to be completed */
Sergunb 0:8f0d870509fe 1004 status = FLASH_WaitForLastOperation(ProgramTimeout);
Sergunb 0:8f0d870509fe 1005 }
Sergunb 0:8f0d870509fe 1006 if((status == FLASH_COMPLETE) && (WRP1_Data != 0xFF))
Sergunb 0:8f0d870509fe 1007 {
Sergunb 0:8f0d870509fe 1008 OB->WRP1 = WRP1_Data;
Sergunb 0:8f0d870509fe 1009
Sergunb 0:8f0d870509fe 1010 /* Wait for last operation to be completed */
Sergunb 0:8f0d870509fe 1011 status = FLASH_WaitForLastOperation(ProgramTimeout);
Sergunb 0:8f0d870509fe 1012 }
Sergunb 0:8f0d870509fe 1013 if((status == FLASH_COMPLETE) && (WRP2_Data != 0xFF))
Sergunb 0:8f0d870509fe 1014 {
Sergunb 0:8f0d870509fe 1015 OB->WRP2 = WRP2_Data;
Sergunb 0:8f0d870509fe 1016
Sergunb 0:8f0d870509fe 1017 /* Wait for last operation to be completed */
Sergunb 0:8f0d870509fe 1018 status = FLASH_WaitForLastOperation(ProgramTimeout);
Sergunb 0:8f0d870509fe 1019 }
Sergunb 0:8f0d870509fe 1020
Sergunb 0:8f0d870509fe 1021 if((status == FLASH_COMPLETE)&& (WRP3_Data != 0xFF))
Sergunb 0:8f0d870509fe 1022 {
Sergunb 0:8f0d870509fe 1023 OB->WRP3 = WRP3_Data;
Sergunb 0:8f0d870509fe 1024
Sergunb 0:8f0d870509fe 1025 /* Wait for last operation to be completed */
Sergunb 0:8f0d870509fe 1026 status = FLASH_WaitForLastOperation(ProgramTimeout);
Sergunb 0:8f0d870509fe 1027 }
Sergunb 0:8f0d870509fe 1028
Sergunb 0:8f0d870509fe 1029 if(status != FLASH_TIMEOUT)
Sergunb 0:8f0d870509fe 1030 {
Sergunb 0:8f0d870509fe 1031 /* if the program operation is completed, disable the OPTPG Bit */
Sergunb 0:8f0d870509fe 1032 FLASH->CR &= CR_OPTPG_Reset;
Sergunb 0:8f0d870509fe 1033 }
Sergunb 0:8f0d870509fe 1034 }
Sergunb 0:8f0d870509fe 1035 /* Return the write protection operation Status */
Sergunb 0:8f0d870509fe 1036 return status;
Sergunb 0:8f0d870509fe 1037 }
Sergunb 0:8f0d870509fe 1038
Sergunb 0:8f0d870509fe 1039 /**
Sergunb 0:8f0d870509fe 1040 * @brief Enables or disables the read out protection.
Sergunb 0:8f0d870509fe 1041 * @note If the user has already programmed the other option bytes before calling
Sergunb 0:8f0d870509fe 1042 * this function, he must re-program them since this function erases all option bytes.
Sergunb 0:8f0d870509fe 1043 * @note This function can be used for all STM32F10x devices.
Sergunb 0:8f0d870509fe 1044 * @param Newstate: new state of the ReadOut Protection.
Sergunb 0:8f0d870509fe 1045 * This parameter can be: ENABLE or DISABLE.
Sergunb 0:8f0d870509fe 1046 * @retval FLASH Status: The returned value can be: FLASH_ERROR_PG,
Sergunb 0:8f0d870509fe 1047 * FLASH_ERROR_WRP, FLASH_COMPLETE or FLASH_TIMEOUT.
Sergunb 0:8f0d870509fe 1048 */
Sergunb 0:8f0d870509fe 1049 FLASH_Status FLASH_ReadOutProtection(FunctionalState NewState)
Sergunb 0:8f0d870509fe 1050 {
Sergunb 0:8f0d870509fe 1051 FLASH_Status status = FLASH_COMPLETE;
Sergunb 0:8f0d870509fe 1052 /* Check the parameters */
Sergunb 0:8f0d870509fe 1053 assert_param(IS_FUNCTIONAL_STATE(NewState));
Sergunb 0:8f0d870509fe 1054 status = FLASH_WaitForLastOperation(EraseTimeout);
Sergunb 0:8f0d870509fe 1055 if(status == FLASH_COMPLETE)
Sergunb 0:8f0d870509fe 1056 {
Sergunb 0:8f0d870509fe 1057 /* Authorizes the small information block programming */
Sergunb 0:8f0d870509fe 1058 FLASH->OPTKEYR = FLASH_KEY1;
Sergunb 0:8f0d870509fe 1059 FLASH->OPTKEYR = FLASH_KEY2;
Sergunb 0:8f0d870509fe 1060 FLASH->CR |= CR_OPTER_Set;
Sergunb 0:8f0d870509fe 1061 FLASH->CR |= CR_STRT_Set;
Sergunb 0:8f0d870509fe 1062 /* Wait for last operation to be completed */
Sergunb 0:8f0d870509fe 1063 status = FLASH_WaitForLastOperation(EraseTimeout);
Sergunb 0:8f0d870509fe 1064 if(status == FLASH_COMPLETE)
Sergunb 0:8f0d870509fe 1065 {
Sergunb 0:8f0d870509fe 1066 /* if the erase operation is completed, disable the OPTER Bit */
Sergunb 0:8f0d870509fe 1067 FLASH->CR &= CR_OPTER_Reset;
Sergunb 0:8f0d870509fe 1068 /* Enable the Option Bytes Programming operation */
Sergunb 0:8f0d870509fe 1069 FLASH->CR |= CR_OPTPG_Set;
Sergunb 0:8f0d870509fe 1070 if(NewState != DISABLE)
Sergunb 0:8f0d870509fe 1071 {
Sergunb 0:8f0d870509fe 1072 OB->RDP = 0x00;
Sergunb 0:8f0d870509fe 1073 }
Sergunb 0:8f0d870509fe 1074 else
Sergunb 0:8f0d870509fe 1075 {
Sergunb 0:8f0d870509fe 1076 OB->RDP = RDP_Key;
Sergunb 0:8f0d870509fe 1077 }
Sergunb 0:8f0d870509fe 1078 /* Wait for last operation to be completed */
Sergunb 0:8f0d870509fe 1079 status = FLASH_WaitForLastOperation(EraseTimeout);
Sergunb 0:8f0d870509fe 1080
Sergunb 0:8f0d870509fe 1081 if(status != FLASH_TIMEOUT)
Sergunb 0:8f0d870509fe 1082 {
Sergunb 0:8f0d870509fe 1083 /* if the program operation is completed, disable the OPTPG Bit */
Sergunb 0:8f0d870509fe 1084 FLASH->CR &= CR_OPTPG_Reset;
Sergunb 0:8f0d870509fe 1085 }
Sergunb 0:8f0d870509fe 1086 }
Sergunb 0:8f0d870509fe 1087 else
Sergunb 0:8f0d870509fe 1088 {
Sergunb 0:8f0d870509fe 1089 if(status != FLASH_TIMEOUT)
Sergunb 0:8f0d870509fe 1090 {
Sergunb 0:8f0d870509fe 1091 /* Disable the OPTER Bit */
Sergunb 0:8f0d870509fe 1092 FLASH->CR &= CR_OPTER_Reset;
Sergunb 0:8f0d870509fe 1093 }
Sergunb 0:8f0d870509fe 1094 }
Sergunb 0:8f0d870509fe 1095 }
Sergunb 0:8f0d870509fe 1096 /* Return the protection operation Status */
Sergunb 0:8f0d870509fe 1097 return status;
Sergunb 0:8f0d870509fe 1098 }
Sergunb 0:8f0d870509fe 1099
Sergunb 0:8f0d870509fe 1100 /**
Sergunb 0:8f0d870509fe 1101 * @brief Programs the FLASH User Option Byte: IWDG_SW / RST_STOP / RST_STDBY.
Sergunb 0:8f0d870509fe 1102 * @note This function can be used for all STM32F10x devices.
Sergunb 0:8f0d870509fe 1103 * @param OB_IWDG: Selects the IWDG mode
Sergunb 0:8f0d870509fe 1104 * This parameter can be one of the following values:
Sergunb 0:8f0d870509fe 1105 * @arg OB_IWDG_SW: Software IWDG selected
Sergunb 0:8f0d870509fe 1106 * @arg OB_IWDG_HW: Hardware IWDG selected
Sergunb 0:8f0d870509fe 1107 * @param OB_STOP: Reset event when entering STOP mode.
Sergunb 0:8f0d870509fe 1108 * This parameter can be one of the following values:
Sergunb 0:8f0d870509fe 1109 * @arg OB_STOP_NoRST: No reset generated when entering in STOP
Sergunb 0:8f0d870509fe 1110 * @arg OB_STOP_RST: Reset generated when entering in STOP
Sergunb 0:8f0d870509fe 1111 * @param OB_STDBY: Reset event when entering Standby mode.
Sergunb 0:8f0d870509fe 1112 * This parameter can be one of the following values:
Sergunb 0:8f0d870509fe 1113 * @arg OB_STDBY_NoRST: No reset generated when entering in STANDBY
Sergunb 0:8f0d870509fe 1114 * @arg OB_STDBY_RST: Reset generated when entering in STANDBY
Sergunb 0:8f0d870509fe 1115 * @retval FLASH Status: The returned value can be: FLASH_ERROR_PG,
Sergunb 0:8f0d870509fe 1116 * FLASH_ERROR_WRP, FLASH_COMPLETE or FLASH_TIMEOUT.
Sergunb 0:8f0d870509fe 1117 */
Sergunb 0:8f0d870509fe 1118 FLASH_Status FLASH_UserOptionByteConfig(uint16_t OB_IWDG, uint16_t OB_STOP, uint16_t OB_STDBY)
Sergunb 0:8f0d870509fe 1119 {
Sergunb 0:8f0d870509fe 1120 FLASH_Status status = FLASH_COMPLETE;
Sergunb 0:8f0d870509fe 1121
Sergunb 0:8f0d870509fe 1122 /* Check the parameters */
Sergunb 0:8f0d870509fe 1123 assert_param(IS_OB_IWDG_SOURCE(OB_IWDG));
Sergunb 0:8f0d870509fe 1124 assert_param(IS_OB_STOP_SOURCE(OB_STOP));
Sergunb 0:8f0d870509fe 1125 assert_param(IS_OB_STDBY_SOURCE(OB_STDBY));
Sergunb 0:8f0d870509fe 1126
Sergunb 0:8f0d870509fe 1127 /* Authorize the small information block programming */
Sergunb 0:8f0d870509fe 1128 FLASH->OPTKEYR = FLASH_KEY1;
Sergunb 0:8f0d870509fe 1129 FLASH->OPTKEYR = FLASH_KEY2;
Sergunb 0:8f0d870509fe 1130
Sergunb 0:8f0d870509fe 1131 /* Wait for last operation to be completed */
Sergunb 0:8f0d870509fe 1132 status = FLASH_WaitForLastOperation(ProgramTimeout);
Sergunb 0:8f0d870509fe 1133
Sergunb 0:8f0d870509fe 1134 if(status == FLASH_COMPLETE)
Sergunb 0:8f0d870509fe 1135 {
Sergunb 0:8f0d870509fe 1136 /* Enable the Option Bytes Programming operation */
Sergunb 0:8f0d870509fe 1137 FLASH->CR |= CR_OPTPG_Set;
Sergunb 0:8f0d870509fe 1138
Sergunb 0:8f0d870509fe 1139 OB->USER = OB_IWDG | (uint16_t)(OB_STOP | (uint16_t)(OB_STDBY | ((uint16_t)0xF8)));
Sergunb 0:8f0d870509fe 1140
Sergunb 0:8f0d870509fe 1141 /* Wait for last operation to be completed */
Sergunb 0:8f0d870509fe 1142 status = FLASH_WaitForLastOperation(ProgramTimeout);
Sergunb 0:8f0d870509fe 1143 if(status != FLASH_TIMEOUT)
Sergunb 0:8f0d870509fe 1144 {
Sergunb 0:8f0d870509fe 1145 /* if the program operation is completed, disable the OPTPG Bit */
Sergunb 0:8f0d870509fe 1146 FLASH->CR &= CR_OPTPG_Reset;
Sergunb 0:8f0d870509fe 1147 }
Sergunb 0:8f0d870509fe 1148 }
Sergunb 0:8f0d870509fe 1149 /* Return the Option Byte program Status */
Sergunb 0:8f0d870509fe 1150 return status;
Sergunb 0:8f0d870509fe 1151 }
Sergunb 0:8f0d870509fe 1152
Sergunb 0:8f0d870509fe 1153 #ifdef STM32F10X_XL
Sergunb 0:8f0d870509fe 1154 /**
Sergunb 0:8f0d870509fe 1155 * @brief Configures to boot from Bank1 or Bank2.
Sergunb 0:8f0d870509fe 1156 * @note This function can be used only for STM32F10x_XL density devices.
Sergunb 0:8f0d870509fe 1157 * @param FLASH_BOOT: select the FLASH Bank to boot from.
Sergunb 0:8f0d870509fe 1158 * This parameter can be one of the following values:
Sergunb 0:8f0d870509fe 1159 * @arg FLASH_BOOT_Bank1: At startup, if boot pins are set in boot from user Flash
Sergunb 0:8f0d870509fe 1160 * position and this parameter is selected the device will boot from Bank1(Default).
Sergunb 0:8f0d870509fe 1161 * @arg FLASH_BOOT_Bank2: At startup, if boot pins are set in boot from user Flash
Sergunb 0:8f0d870509fe 1162 * position and this parameter is selected the device will boot from Bank2 or Bank1,
Sergunb 0:8f0d870509fe 1163 * depending on the activation of the bank. The active banks are checked in
Sergunb 0:8f0d870509fe 1164 * the following order: Bank2, followed by Bank1.
Sergunb 0:8f0d870509fe 1165 * The active bank is recognized by the value programmed at the base address
Sergunb 0:8f0d870509fe 1166 * of the respective bank (corresponding to the initial stack pointer value
Sergunb 0:8f0d870509fe 1167 * in the interrupt vector table).
Sergunb 0:8f0d870509fe 1168 * For more information, please refer to AN2606 from www.st.com.
Sergunb 0:8f0d870509fe 1169 * @retval FLASH Status: The returned value can be: FLASH_ERROR_PG,
Sergunb 0:8f0d870509fe 1170 * FLASH_ERROR_WRP, FLASH_COMPLETE or FLASH_TIMEOUT.
Sergunb 0:8f0d870509fe 1171 */
Sergunb 0:8f0d870509fe 1172 FLASH_Status FLASH_BootConfig(uint16_t FLASH_BOOT)
Sergunb 0:8f0d870509fe 1173 {
Sergunb 0:8f0d870509fe 1174 FLASH_Status status = FLASH_COMPLETE;
Sergunb 0:8f0d870509fe 1175 assert_param(IS_FLASH_BOOT(FLASH_BOOT));
Sergunb 0:8f0d870509fe 1176 /* Authorize the small information block programming */
Sergunb 0:8f0d870509fe 1177 FLASH->OPTKEYR = FLASH_KEY1;
Sergunb 0:8f0d870509fe 1178 FLASH->OPTKEYR = FLASH_KEY2;
Sergunb 0:8f0d870509fe 1179
Sergunb 0:8f0d870509fe 1180 /* Wait for last operation to be completed */
Sergunb 0:8f0d870509fe 1181 status = FLASH_WaitForLastOperation(ProgramTimeout);
Sergunb 0:8f0d870509fe 1182
Sergunb 0:8f0d870509fe 1183 if(status == FLASH_COMPLETE)
Sergunb 0:8f0d870509fe 1184 {
Sergunb 0:8f0d870509fe 1185 /* Enable the Option Bytes Programming operation */
Sergunb 0:8f0d870509fe 1186 FLASH->CR |= CR_OPTPG_Set;
Sergunb 0:8f0d870509fe 1187
Sergunb 0:8f0d870509fe 1188 if(FLASH_BOOT == FLASH_BOOT_Bank1)
Sergunb 0:8f0d870509fe 1189 {
Sergunb 0:8f0d870509fe 1190 OB->USER |= OB_USER_BFB2;
Sergunb 0:8f0d870509fe 1191 }
Sergunb 0:8f0d870509fe 1192 else
Sergunb 0:8f0d870509fe 1193 {
Sergunb 0:8f0d870509fe 1194 OB->USER &= (uint16_t)(~(uint16_t)(OB_USER_BFB2));
Sergunb 0:8f0d870509fe 1195 }
Sergunb 0:8f0d870509fe 1196 /* Wait for last operation to be completed */
Sergunb 0:8f0d870509fe 1197 status = FLASH_WaitForLastOperation(ProgramTimeout);
Sergunb 0:8f0d870509fe 1198 if(status != FLASH_TIMEOUT)
Sergunb 0:8f0d870509fe 1199 {
Sergunb 0:8f0d870509fe 1200 /* if the program operation is completed, disable the OPTPG Bit */
Sergunb 0:8f0d870509fe 1201 FLASH->CR &= CR_OPTPG_Reset;
Sergunb 0:8f0d870509fe 1202 }
Sergunb 0:8f0d870509fe 1203 }
Sergunb 0:8f0d870509fe 1204 /* Return the Option Byte program Status */
Sergunb 0:8f0d870509fe 1205 return status;
Sergunb 0:8f0d870509fe 1206 }
Sergunb 0:8f0d870509fe 1207 #endif /* STM32F10X_XL */
Sergunb 0:8f0d870509fe 1208
Sergunb 0:8f0d870509fe 1209 /**
Sergunb 0:8f0d870509fe 1210 * @brief Returns the FLASH User Option Bytes values.
Sergunb 0:8f0d870509fe 1211 * @note This function can be used for all STM32F10x devices.
Sergunb 0:8f0d870509fe 1212 * @param None
Sergunb 0:8f0d870509fe 1213 * @retval The FLASH User Option Bytes values:IWDG_SW(Bit0), RST_STOP(Bit1)
Sergunb 0:8f0d870509fe 1214 * and RST_STDBY(Bit2).
Sergunb 0:8f0d870509fe 1215 */
Sergunb 0:8f0d870509fe 1216 uint32_t FLASH_GetUserOptionByte(void)
Sergunb 0:8f0d870509fe 1217 {
Sergunb 0:8f0d870509fe 1218 /* Return the User Option Byte */
Sergunb 0:8f0d870509fe 1219 return (uint32_t)(FLASH->OBR >> 2);
Sergunb 0:8f0d870509fe 1220 }
Sergunb 0:8f0d870509fe 1221
Sergunb 0:8f0d870509fe 1222 /**
Sergunb 0:8f0d870509fe 1223 * @brief Returns the FLASH Write Protection Option Bytes Register value.
Sergunb 0:8f0d870509fe 1224 * @note This function can be used for all STM32F10x devices.
Sergunb 0:8f0d870509fe 1225 * @param None
Sergunb 0:8f0d870509fe 1226 * @retval The FLASH Write Protection Option Bytes Register value
Sergunb 0:8f0d870509fe 1227 */
Sergunb 0:8f0d870509fe 1228 uint32_t FLASH_GetWriteProtectionOptionByte(void)
Sergunb 0:8f0d870509fe 1229 {
Sergunb 0:8f0d870509fe 1230 /* Return the Flash write protection Register value */
Sergunb 0:8f0d870509fe 1231 return (uint32_t)(FLASH->WRPR);
Sergunb 0:8f0d870509fe 1232 }
Sergunb 0:8f0d870509fe 1233
Sergunb 0:8f0d870509fe 1234 /**
Sergunb 0:8f0d870509fe 1235 * @brief Checks whether the FLASH Read Out Protection Status is set or not.
Sergunb 0:8f0d870509fe 1236 * @note This function can be used for all STM32F10x devices.
Sergunb 0:8f0d870509fe 1237 * @param None
Sergunb 0:8f0d870509fe 1238 * @retval FLASH ReadOut Protection Status(SET or RESET)
Sergunb 0:8f0d870509fe 1239 */
Sergunb 0:8f0d870509fe 1240 FlagStatus FLASH_GetReadOutProtectionStatus(void)
Sergunb 0:8f0d870509fe 1241 {
Sergunb 0:8f0d870509fe 1242 FlagStatus readoutstatus = RESET;
Sergunb 0:8f0d870509fe 1243 if ((FLASH->OBR & RDPRT_Mask) != (uint32_t)RESET)
Sergunb 0:8f0d870509fe 1244 {
Sergunb 0:8f0d870509fe 1245 readoutstatus = SET;
Sergunb 0:8f0d870509fe 1246 }
Sergunb 0:8f0d870509fe 1247 else
Sergunb 0:8f0d870509fe 1248 {
Sergunb 0:8f0d870509fe 1249 readoutstatus = RESET;
Sergunb 0:8f0d870509fe 1250 }
Sergunb 0:8f0d870509fe 1251 return readoutstatus;
Sergunb 0:8f0d870509fe 1252 }
Sergunb 0:8f0d870509fe 1253
Sergunb 0:8f0d870509fe 1254 /**
Sergunb 0:8f0d870509fe 1255 * @brief Checks whether the FLASH Prefetch Buffer status is set or not.
Sergunb 0:8f0d870509fe 1256 * @note This function can be used for all STM32F10x devices.
Sergunb 0:8f0d870509fe 1257 * @param None
Sergunb 0:8f0d870509fe 1258 * @retval FLASH Prefetch Buffer Status (SET or RESET).
Sergunb 0:8f0d870509fe 1259 */
Sergunb 0:8f0d870509fe 1260 FlagStatus FLASH_GetPrefetchBufferStatus(void)
Sergunb 0:8f0d870509fe 1261 {
Sergunb 0:8f0d870509fe 1262 FlagStatus bitstatus = RESET;
Sergunb 0:8f0d870509fe 1263
Sergunb 0:8f0d870509fe 1264 if ((FLASH->ACR & ACR_PRFTBS_Mask) != (uint32_t)RESET)
Sergunb 0:8f0d870509fe 1265 {
Sergunb 0:8f0d870509fe 1266 bitstatus = SET;
Sergunb 0:8f0d870509fe 1267 }
Sergunb 0:8f0d870509fe 1268 else
Sergunb 0:8f0d870509fe 1269 {
Sergunb 0:8f0d870509fe 1270 bitstatus = RESET;
Sergunb 0:8f0d870509fe 1271 }
Sergunb 0:8f0d870509fe 1272 /* Return the new state of FLASH Prefetch Buffer Status (SET or RESET) */
Sergunb 0:8f0d870509fe 1273 return bitstatus;
Sergunb 0:8f0d870509fe 1274 }
Sergunb 0:8f0d870509fe 1275
Sergunb 0:8f0d870509fe 1276 /**
Sergunb 0:8f0d870509fe 1277 * @brief Enables or disables the specified FLASH interrupts.
Sergunb 0:8f0d870509fe 1278 * @note This function can be used for all STM32F10x devices.
Sergunb 0:8f0d870509fe 1279 * - For STM32F10X_XL devices, enables or disables the specified FLASH interrupts
Sergunb 0:8f0d870509fe 1280 for Bank1 and Bank2.
Sergunb 0:8f0d870509fe 1281 * - For other devices it enables or disables the specified FLASH interrupts for Bank1.
Sergunb 0:8f0d870509fe 1282 * @param FLASH_IT: specifies the FLASH interrupt sources to be enabled or disabled.
Sergunb 0:8f0d870509fe 1283 * This parameter can be any combination of the following values:
Sergunb 0:8f0d870509fe 1284 * @arg FLASH_IT_ERROR: FLASH Error Interrupt
Sergunb 0:8f0d870509fe 1285 * @arg FLASH_IT_EOP: FLASH end of operation Interrupt
Sergunb 0:8f0d870509fe 1286 * @param NewState: new state of the specified Flash interrupts.
Sergunb 0:8f0d870509fe 1287 * This parameter can be: ENABLE or DISABLE.
Sergunb 0:8f0d870509fe 1288 * @retval None
Sergunb 0:8f0d870509fe 1289 */
Sergunb 0:8f0d870509fe 1290 void FLASH_ITConfig(uint32_t FLASH_IT, FunctionalState NewState)
Sergunb 0:8f0d870509fe 1291 {
Sergunb 0:8f0d870509fe 1292 #ifdef STM32F10X_XL
Sergunb 0:8f0d870509fe 1293 /* Check the parameters */
Sergunb 0:8f0d870509fe 1294 assert_param(IS_FLASH_IT(FLASH_IT));
Sergunb 0:8f0d870509fe 1295 assert_param(IS_FUNCTIONAL_STATE(NewState));
Sergunb 0:8f0d870509fe 1296
Sergunb 0:8f0d870509fe 1297 if((FLASH_IT & 0x80000000) != 0x0)
Sergunb 0:8f0d870509fe 1298 {
Sergunb 0:8f0d870509fe 1299 if(NewState != DISABLE)
Sergunb 0:8f0d870509fe 1300 {
Sergunb 0:8f0d870509fe 1301 /* Enable the interrupt sources */
Sergunb 0:8f0d870509fe 1302 FLASH->CR2 |= (FLASH_IT & 0x7FFFFFFF);
Sergunb 0:8f0d870509fe 1303 }
Sergunb 0:8f0d870509fe 1304 else
Sergunb 0:8f0d870509fe 1305 {
Sergunb 0:8f0d870509fe 1306 /* Disable the interrupt sources */
Sergunb 0:8f0d870509fe 1307 FLASH->CR2 &= ~(uint32_t)(FLASH_IT & 0x7FFFFFFF);
Sergunb 0:8f0d870509fe 1308 }
Sergunb 0:8f0d870509fe 1309 }
Sergunb 0:8f0d870509fe 1310 else
Sergunb 0:8f0d870509fe 1311 {
Sergunb 0:8f0d870509fe 1312 if(NewState != DISABLE)
Sergunb 0:8f0d870509fe 1313 {
Sergunb 0:8f0d870509fe 1314 /* Enable the interrupt sources */
Sergunb 0:8f0d870509fe 1315 FLASH->CR |= FLASH_IT;
Sergunb 0:8f0d870509fe 1316 }
Sergunb 0:8f0d870509fe 1317 else
Sergunb 0:8f0d870509fe 1318 {
Sergunb 0:8f0d870509fe 1319 /* Disable the interrupt sources */
Sergunb 0:8f0d870509fe 1320 FLASH->CR &= ~(uint32_t)FLASH_IT;
Sergunb 0:8f0d870509fe 1321 }
Sergunb 0:8f0d870509fe 1322 }
Sergunb 0:8f0d870509fe 1323 #else
Sergunb 0:8f0d870509fe 1324 /* Check the parameters */
Sergunb 0:8f0d870509fe 1325 assert_param(IS_FLASH_IT(FLASH_IT));
Sergunb 0:8f0d870509fe 1326 assert_param(IS_FUNCTIONAL_STATE(NewState));
Sergunb 0:8f0d870509fe 1327
Sergunb 0:8f0d870509fe 1328 if(NewState != DISABLE)
Sergunb 0:8f0d870509fe 1329 {
Sergunb 0:8f0d870509fe 1330 /* Enable the interrupt sources */
Sergunb 0:8f0d870509fe 1331 FLASH->CR |= FLASH_IT;
Sergunb 0:8f0d870509fe 1332 }
Sergunb 0:8f0d870509fe 1333 else
Sergunb 0:8f0d870509fe 1334 {
Sergunb 0:8f0d870509fe 1335 /* Disable the interrupt sources */
Sergunb 0:8f0d870509fe 1336 FLASH->CR &= ~(uint32_t)FLASH_IT;
Sergunb 0:8f0d870509fe 1337 }
Sergunb 0:8f0d870509fe 1338 #endif /* STM32F10X_XL */
Sergunb 0:8f0d870509fe 1339 }
Sergunb 0:8f0d870509fe 1340
Sergunb 0:8f0d870509fe 1341 /**
Sergunb 0:8f0d870509fe 1342 * @brief Checks whether the specified FLASH flag is set or not.
Sergunb 0:8f0d870509fe 1343 * @note This function can be used for all STM32F10x devices.
Sergunb 0:8f0d870509fe 1344 * - For STM32F10X_XL devices, this function checks whether the specified
Sergunb 0:8f0d870509fe 1345 * Bank1 or Bank2 flag is set or not.
Sergunb 0:8f0d870509fe 1346 * - For other devices, it checks whether the specified Bank1 flag is
Sergunb 0:8f0d870509fe 1347 * set or not.
Sergunb 0:8f0d870509fe 1348 * @param FLASH_FLAG: specifies the FLASH flag to check.
Sergunb 0:8f0d870509fe 1349 * This parameter can be one of the following values:
Sergunb 0:8f0d870509fe 1350 * @arg FLASH_FLAG_BSY: FLASH Busy flag
Sergunb 0:8f0d870509fe 1351 * @arg FLASH_FLAG_PGERR: FLASH Program error flag
Sergunb 0:8f0d870509fe 1352 * @arg FLASH_FLAG_WRPRTERR: FLASH Write protected error flag
Sergunb 0:8f0d870509fe 1353 * @arg FLASH_FLAG_EOP: FLASH End of Operation flag
Sergunb 0:8f0d870509fe 1354 * @arg FLASH_FLAG_OPTERR: FLASH Option Byte error flag
Sergunb 0:8f0d870509fe 1355 * @retval The new state of FLASH_FLAG (SET or RESET).
Sergunb 0:8f0d870509fe 1356 */
Sergunb 0:8f0d870509fe 1357 FlagStatus FLASH_GetFlagStatus(uint32_t FLASH_FLAG)
Sergunb 0:8f0d870509fe 1358 {
Sergunb 0:8f0d870509fe 1359 FlagStatus bitstatus = RESET;
Sergunb 0:8f0d870509fe 1360
Sergunb 0:8f0d870509fe 1361 #ifdef STM32F10X_XL
Sergunb 0:8f0d870509fe 1362 /* Check the parameters */
Sergunb 0:8f0d870509fe 1363 assert_param(IS_FLASH_GET_FLAG(FLASH_FLAG)) ;
Sergunb 0:8f0d870509fe 1364 if(FLASH_FLAG == FLASH_FLAG_OPTERR)
Sergunb 0:8f0d870509fe 1365 {
Sergunb 0:8f0d870509fe 1366 if((FLASH->OBR & FLASH_FLAG_OPTERR) != (uint32_t)RESET)
Sergunb 0:8f0d870509fe 1367 {
Sergunb 0:8f0d870509fe 1368 bitstatus = SET;
Sergunb 0:8f0d870509fe 1369 }
Sergunb 0:8f0d870509fe 1370 else
Sergunb 0:8f0d870509fe 1371 {
Sergunb 0:8f0d870509fe 1372 bitstatus = RESET;
Sergunb 0:8f0d870509fe 1373 }
Sergunb 0:8f0d870509fe 1374 }
Sergunb 0:8f0d870509fe 1375 else
Sergunb 0:8f0d870509fe 1376 {
Sergunb 0:8f0d870509fe 1377 if((FLASH_FLAG & 0x80000000) != 0x0)
Sergunb 0:8f0d870509fe 1378 {
Sergunb 0:8f0d870509fe 1379 if((FLASH->SR2 & FLASH_FLAG) != (uint32_t)RESET)
Sergunb 0:8f0d870509fe 1380 {
Sergunb 0:8f0d870509fe 1381 bitstatus = SET;
Sergunb 0:8f0d870509fe 1382 }
Sergunb 0:8f0d870509fe 1383 else
Sergunb 0:8f0d870509fe 1384 {
Sergunb 0:8f0d870509fe 1385 bitstatus = RESET;
Sergunb 0:8f0d870509fe 1386 }
Sergunb 0:8f0d870509fe 1387 }
Sergunb 0:8f0d870509fe 1388 else
Sergunb 0:8f0d870509fe 1389 {
Sergunb 0:8f0d870509fe 1390 if((FLASH->SR & FLASH_FLAG) != (uint32_t)RESET)
Sergunb 0:8f0d870509fe 1391 {
Sergunb 0:8f0d870509fe 1392 bitstatus = SET;
Sergunb 0:8f0d870509fe 1393 }
Sergunb 0:8f0d870509fe 1394 else
Sergunb 0:8f0d870509fe 1395 {
Sergunb 0:8f0d870509fe 1396 bitstatus = RESET;
Sergunb 0:8f0d870509fe 1397 }
Sergunb 0:8f0d870509fe 1398 }
Sergunb 0:8f0d870509fe 1399 }
Sergunb 0:8f0d870509fe 1400 #else
Sergunb 0:8f0d870509fe 1401 /* Check the parameters */
Sergunb 0:8f0d870509fe 1402 assert_param(IS_FLASH_GET_FLAG(FLASH_FLAG)) ;
Sergunb 0:8f0d870509fe 1403 if(FLASH_FLAG == FLASH_FLAG_OPTERR)
Sergunb 0:8f0d870509fe 1404 {
Sergunb 0:8f0d870509fe 1405 if((FLASH->OBR & FLASH_FLAG_OPTERR) != (uint32_t)RESET)
Sergunb 0:8f0d870509fe 1406 {
Sergunb 0:8f0d870509fe 1407 bitstatus = SET;
Sergunb 0:8f0d870509fe 1408 }
Sergunb 0:8f0d870509fe 1409 else
Sergunb 0:8f0d870509fe 1410 {
Sergunb 0:8f0d870509fe 1411 bitstatus = RESET;
Sergunb 0:8f0d870509fe 1412 }
Sergunb 0:8f0d870509fe 1413 }
Sergunb 0:8f0d870509fe 1414 else
Sergunb 0:8f0d870509fe 1415 {
Sergunb 0:8f0d870509fe 1416 if((FLASH->SR & FLASH_FLAG) != (uint32_t)RESET)
Sergunb 0:8f0d870509fe 1417 {
Sergunb 0:8f0d870509fe 1418 bitstatus = SET;
Sergunb 0:8f0d870509fe 1419 }
Sergunb 0:8f0d870509fe 1420 else
Sergunb 0:8f0d870509fe 1421 {
Sergunb 0:8f0d870509fe 1422 bitstatus = RESET;
Sergunb 0:8f0d870509fe 1423 }
Sergunb 0:8f0d870509fe 1424 }
Sergunb 0:8f0d870509fe 1425 #endif /* STM32F10X_XL */
Sergunb 0:8f0d870509fe 1426
Sergunb 0:8f0d870509fe 1427 /* Return the new state of FLASH_FLAG (SET or RESET) */
Sergunb 0:8f0d870509fe 1428 return bitstatus;
Sergunb 0:8f0d870509fe 1429 }
Sergunb 0:8f0d870509fe 1430
Sergunb 0:8f0d870509fe 1431 /**
Sergunb 0:8f0d870509fe 1432 * @brief Clears the FLASH's pending flags.
Sergunb 0:8f0d870509fe 1433 * @note This function can be used for all STM32F10x devices.
Sergunb 0:8f0d870509fe 1434 * - For STM32F10X_XL devices, this function clears Bank1 or Bank2’s pending flags
Sergunb 0:8f0d870509fe 1435 * - For other devices, it clears Bank1’s pending flags.
Sergunb 0:8f0d870509fe 1436 * @param FLASH_FLAG: specifies the FLASH flags to clear.
Sergunb 0:8f0d870509fe 1437 * This parameter can be any combination of the following values:
Sergunb 0:8f0d870509fe 1438 * @arg FLASH_FLAG_PGERR: FLASH Program error flag
Sergunb 0:8f0d870509fe 1439 * @arg FLASH_FLAG_WRPRTERR: FLASH Write protected error flag
Sergunb 0:8f0d870509fe 1440 * @arg FLASH_FLAG_EOP: FLASH End of Operation flag
Sergunb 0:8f0d870509fe 1441 * @retval None
Sergunb 0:8f0d870509fe 1442 */
Sergunb 0:8f0d870509fe 1443 void FLASH_ClearFlag(uint32_t FLASH_FLAG)
Sergunb 0:8f0d870509fe 1444 {
Sergunb 0:8f0d870509fe 1445 #ifdef STM32F10X_XL
Sergunb 0:8f0d870509fe 1446 /* Check the parameters */
Sergunb 0:8f0d870509fe 1447 assert_param(IS_FLASH_CLEAR_FLAG(FLASH_FLAG)) ;
Sergunb 0:8f0d870509fe 1448
Sergunb 0:8f0d870509fe 1449 if((FLASH_FLAG & 0x80000000) != 0x0)
Sergunb 0:8f0d870509fe 1450 {
Sergunb 0:8f0d870509fe 1451 /* Clear the flags */
Sergunb 0:8f0d870509fe 1452 FLASH->SR2 = FLASH_FLAG;
Sergunb 0:8f0d870509fe 1453 }
Sergunb 0:8f0d870509fe 1454 else
Sergunb 0:8f0d870509fe 1455 {
Sergunb 0:8f0d870509fe 1456 /* Clear the flags */
Sergunb 0:8f0d870509fe 1457 FLASH->SR = FLASH_FLAG;
Sergunb 0:8f0d870509fe 1458 }
Sergunb 0:8f0d870509fe 1459
Sergunb 0:8f0d870509fe 1460 #else
Sergunb 0:8f0d870509fe 1461 /* Check the parameters */
Sergunb 0:8f0d870509fe 1462 assert_param(IS_FLASH_CLEAR_FLAG(FLASH_FLAG)) ;
Sergunb 0:8f0d870509fe 1463
Sergunb 0:8f0d870509fe 1464 /* Clear the flags */
Sergunb 0:8f0d870509fe 1465 FLASH->SR = FLASH_FLAG;
Sergunb 0:8f0d870509fe 1466 #endif /* STM32F10X_XL */
Sergunb 0:8f0d870509fe 1467 }
Sergunb 0:8f0d870509fe 1468
Sergunb 0:8f0d870509fe 1469 /**
Sergunb 0:8f0d870509fe 1470 * @brief Returns the FLASH Status.
Sergunb 0:8f0d870509fe 1471 * @note This function can be used for all STM32F10x devices, it is equivalent
Sergunb 0:8f0d870509fe 1472 * to FLASH_GetBank1Status function.
Sergunb 0:8f0d870509fe 1473 * @param None
Sergunb 0:8f0d870509fe 1474 * @retval FLASH Status: The returned value can be: FLASH_BUSY, FLASH_ERROR_PG,
Sergunb 0:8f0d870509fe 1475 * FLASH_ERROR_WRP or FLASH_COMPLETE
Sergunb 0:8f0d870509fe 1476 */
Sergunb 0:8f0d870509fe 1477 FLASH_Status FLASH_GetStatus(void)
Sergunb 0:8f0d870509fe 1478 {
Sergunb 0:8f0d870509fe 1479 FLASH_Status flashstatus = FLASH_COMPLETE;
Sergunb 0:8f0d870509fe 1480
Sergunb 0:8f0d870509fe 1481 if((FLASH->SR & FLASH_FLAG_BSY) == FLASH_FLAG_BSY)
Sergunb 0:8f0d870509fe 1482 {
Sergunb 0:8f0d870509fe 1483 flashstatus = FLASH_BUSY;
Sergunb 0:8f0d870509fe 1484 }
Sergunb 0:8f0d870509fe 1485 else
Sergunb 0:8f0d870509fe 1486 {
Sergunb 0:8f0d870509fe 1487 if((FLASH->SR & FLASH_FLAG_PGERR) != 0)
Sergunb 0:8f0d870509fe 1488 {
Sergunb 0:8f0d870509fe 1489 flashstatus = FLASH_ERROR_PG;
Sergunb 0:8f0d870509fe 1490 }
Sergunb 0:8f0d870509fe 1491 else
Sergunb 0:8f0d870509fe 1492 {
Sergunb 0:8f0d870509fe 1493 if((FLASH->SR & FLASH_FLAG_WRPRTERR) != 0 )
Sergunb 0:8f0d870509fe 1494 {
Sergunb 0:8f0d870509fe 1495 flashstatus = FLASH_ERROR_WRP;
Sergunb 0:8f0d870509fe 1496 }
Sergunb 0:8f0d870509fe 1497 else
Sergunb 0:8f0d870509fe 1498 {
Sergunb 0:8f0d870509fe 1499 flashstatus = FLASH_COMPLETE;
Sergunb 0:8f0d870509fe 1500 }
Sergunb 0:8f0d870509fe 1501 }
Sergunb 0:8f0d870509fe 1502 }
Sergunb 0:8f0d870509fe 1503 /* Return the Flash Status */
Sergunb 0:8f0d870509fe 1504 return flashstatus;
Sergunb 0:8f0d870509fe 1505 }
Sergunb 0:8f0d870509fe 1506
Sergunb 0:8f0d870509fe 1507 /**
Sergunb 0:8f0d870509fe 1508 * @brief Returns the FLASH Bank1 Status.
Sergunb 0:8f0d870509fe 1509 * @note This function can be used for all STM32F10x devices, it is equivalent
Sergunb 0:8f0d870509fe 1510 * to FLASH_GetStatus function.
Sergunb 0:8f0d870509fe 1511 * @param None
Sergunb 0:8f0d870509fe 1512 * @retval FLASH Status: The returned value can be: FLASH_BUSY, FLASH_ERROR_PG,
Sergunb 0:8f0d870509fe 1513 * FLASH_ERROR_WRP or FLASH_COMPLETE
Sergunb 0:8f0d870509fe 1514 */
Sergunb 0:8f0d870509fe 1515 FLASH_Status FLASH_GetBank1Status(void)
Sergunb 0:8f0d870509fe 1516 {
Sergunb 0:8f0d870509fe 1517 FLASH_Status flashstatus = FLASH_COMPLETE;
Sergunb 0:8f0d870509fe 1518
Sergunb 0:8f0d870509fe 1519 if((FLASH->SR & FLASH_FLAG_BANK1_BSY) == FLASH_FLAG_BSY)
Sergunb 0:8f0d870509fe 1520 {
Sergunb 0:8f0d870509fe 1521 flashstatus = FLASH_BUSY;
Sergunb 0:8f0d870509fe 1522 }
Sergunb 0:8f0d870509fe 1523 else
Sergunb 0:8f0d870509fe 1524 {
Sergunb 0:8f0d870509fe 1525 if((FLASH->SR & FLASH_FLAG_BANK1_PGERR) != 0)
Sergunb 0:8f0d870509fe 1526 {
Sergunb 0:8f0d870509fe 1527 flashstatus = FLASH_ERROR_PG;
Sergunb 0:8f0d870509fe 1528 }
Sergunb 0:8f0d870509fe 1529 else
Sergunb 0:8f0d870509fe 1530 {
Sergunb 0:8f0d870509fe 1531 if((FLASH->SR & FLASH_FLAG_BANK1_WRPRTERR) != 0 )
Sergunb 0:8f0d870509fe 1532 {
Sergunb 0:8f0d870509fe 1533 flashstatus = FLASH_ERROR_WRP;
Sergunb 0:8f0d870509fe 1534 }
Sergunb 0:8f0d870509fe 1535 else
Sergunb 0:8f0d870509fe 1536 {
Sergunb 0:8f0d870509fe 1537 flashstatus = FLASH_COMPLETE;
Sergunb 0:8f0d870509fe 1538 }
Sergunb 0:8f0d870509fe 1539 }
Sergunb 0:8f0d870509fe 1540 }
Sergunb 0:8f0d870509fe 1541 /* Return the Flash Status */
Sergunb 0:8f0d870509fe 1542 return flashstatus;
Sergunb 0:8f0d870509fe 1543 }
Sergunb 0:8f0d870509fe 1544
Sergunb 0:8f0d870509fe 1545 #ifdef STM32F10X_XL
Sergunb 0:8f0d870509fe 1546 /**
Sergunb 0:8f0d870509fe 1547 * @brief Returns the FLASH Bank2 Status.
Sergunb 0:8f0d870509fe 1548 * @note This function can be used for STM32F10x_XL density devices.
Sergunb 0:8f0d870509fe 1549 * @param None
Sergunb 0:8f0d870509fe 1550 * @retval FLASH Status: The returned value can be: FLASH_BUSY, FLASH_ERROR_PG,
Sergunb 0:8f0d870509fe 1551 * FLASH_ERROR_WRP or FLASH_COMPLETE
Sergunb 0:8f0d870509fe 1552 */
Sergunb 0:8f0d870509fe 1553 FLASH_Status FLASH_GetBank2Status(void)
Sergunb 0:8f0d870509fe 1554 {
Sergunb 0:8f0d870509fe 1555 FLASH_Status flashstatus = FLASH_COMPLETE;
Sergunb 0:8f0d870509fe 1556
Sergunb 0:8f0d870509fe 1557 if((FLASH->SR2 & (FLASH_FLAG_BANK2_BSY & 0x7FFFFFFF)) == (FLASH_FLAG_BANK2_BSY & 0x7FFFFFFF))
Sergunb 0:8f0d870509fe 1558 {
Sergunb 0:8f0d870509fe 1559 flashstatus = FLASH_BUSY;
Sergunb 0:8f0d870509fe 1560 }
Sergunb 0:8f0d870509fe 1561 else
Sergunb 0:8f0d870509fe 1562 {
Sergunb 0:8f0d870509fe 1563 if((FLASH->SR2 & (FLASH_FLAG_BANK2_PGERR & 0x7FFFFFFF)) != 0)
Sergunb 0:8f0d870509fe 1564 {
Sergunb 0:8f0d870509fe 1565 flashstatus = FLASH_ERROR_PG;
Sergunb 0:8f0d870509fe 1566 }
Sergunb 0:8f0d870509fe 1567 else
Sergunb 0:8f0d870509fe 1568 {
Sergunb 0:8f0d870509fe 1569 if((FLASH->SR2 & (FLASH_FLAG_BANK2_WRPRTERR & 0x7FFFFFFF)) != 0 )
Sergunb 0:8f0d870509fe 1570 {
Sergunb 0:8f0d870509fe 1571 flashstatus = FLASH_ERROR_WRP;
Sergunb 0:8f0d870509fe 1572 }
Sergunb 0:8f0d870509fe 1573 else
Sergunb 0:8f0d870509fe 1574 {
Sergunb 0:8f0d870509fe 1575 flashstatus = FLASH_COMPLETE;
Sergunb 0:8f0d870509fe 1576 }
Sergunb 0:8f0d870509fe 1577 }
Sergunb 0:8f0d870509fe 1578 }
Sergunb 0:8f0d870509fe 1579 /* Return the Flash Status */
Sergunb 0:8f0d870509fe 1580 return flashstatus;
Sergunb 0:8f0d870509fe 1581 }
Sergunb 0:8f0d870509fe 1582 #endif /* STM32F10X_XL */
Sergunb 0:8f0d870509fe 1583 /**
Sergunb 0:8f0d870509fe 1584 * @brief Waits for a Flash operation to complete or a TIMEOUT to occur.
Sergunb 0:8f0d870509fe 1585 * @note This function can be used for all STM32F10x devices,
Sergunb 0:8f0d870509fe 1586 * it is equivalent to FLASH_WaitForLastBank1Operation.
Sergunb 0:8f0d870509fe 1587 * - For STM32F10X_XL devices this function waits for a Bank1 Flash operation
Sergunb 0:8f0d870509fe 1588 * to complete or a TIMEOUT to occur.
Sergunb 0:8f0d870509fe 1589 * - For all other devices it waits for a Flash operation to complete
Sergunb 0:8f0d870509fe 1590 * or a TIMEOUT to occur.
Sergunb 0:8f0d870509fe 1591 * @param Timeout: FLASH programming Timeout
Sergunb 0:8f0d870509fe 1592 * @retval FLASH Status: The returned value can be: FLASH_ERROR_PG,
Sergunb 0:8f0d870509fe 1593 * FLASH_ERROR_WRP, FLASH_COMPLETE or FLASH_TIMEOUT.
Sergunb 0:8f0d870509fe 1594 */
Sergunb 0:8f0d870509fe 1595 FLASH_Status FLASH_WaitForLastOperation(uint32_t Timeout)
Sergunb 0:8f0d870509fe 1596 {
Sergunb 0:8f0d870509fe 1597 FLASH_Status status = FLASH_COMPLETE;
Sergunb 0:8f0d870509fe 1598
Sergunb 0:8f0d870509fe 1599 /* Check for the Flash Status */
Sergunb 0:8f0d870509fe 1600 status = FLASH_GetBank1Status();
Sergunb 0:8f0d870509fe 1601 /* Wait for a Flash operation to complete or a TIMEOUT to occur */
Sergunb 0:8f0d870509fe 1602 while((status == FLASH_BUSY) && (Timeout != 0x00))
Sergunb 0:8f0d870509fe 1603 {
Sergunb 0:8f0d870509fe 1604 status = FLASH_GetBank1Status();
Sergunb 0:8f0d870509fe 1605 Timeout--;
Sergunb 0:8f0d870509fe 1606 }
Sergunb 0:8f0d870509fe 1607 if(Timeout == 0x00 )
Sergunb 0:8f0d870509fe 1608 {
Sergunb 0:8f0d870509fe 1609 status = FLASH_TIMEOUT;
Sergunb 0:8f0d870509fe 1610 }
Sergunb 0:8f0d870509fe 1611 /* Return the operation status */
Sergunb 0:8f0d870509fe 1612 return status;
Sergunb 0:8f0d870509fe 1613 }
Sergunb 0:8f0d870509fe 1614
Sergunb 0:8f0d870509fe 1615 /**
Sergunb 0:8f0d870509fe 1616 * @brief Waits for a Flash operation on Bank1 to complete or a TIMEOUT to occur.
Sergunb 0:8f0d870509fe 1617 * @note This function can be used for all STM32F10x devices,
Sergunb 0:8f0d870509fe 1618 * it is equivalent to FLASH_WaitForLastOperation.
Sergunb 0:8f0d870509fe 1619 * @param Timeout: FLASH programming Timeout
Sergunb 0:8f0d870509fe 1620 * @retval FLASH Status: The returned value can be: FLASH_ERROR_PG,
Sergunb 0:8f0d870509fe 1621 * FLASH_ERROR_WRP, FLASH_COMPLETE or FLASH_TIMEOUT.
Sergunb 0:8f0d870509fe 1622 */
Sergunb 0:8f0d870509fe 1623 FLASH_Status FLASH_WaitForLastBank1Operation(uint32_t Timeout)
Sergunb 0:8f0d870509fe 1624 {
Sergunb 0:8f0d870509fe 1625 FLASH_Status status = FLASH_COMPLETE;
Sergunb 0:8f0d870509fe 1626
Sergunb 0:8f0d870509fe 1627 /* Check for the Flash Status */
Sergunb 0:8f0d870509fe 1628 status = FLASH_GetBank1Status();
Sergunb 0:8f0d870509fe 1629 /* Wait for a Flash operation to complete or a TIMEOUT to occur */
Sergunb 0:8f0d870509fe 1630 while((status == FLASH_FLAG_BANK1_BSY) && (Timeout != 0x00))
Sergunb 0:8f0d870509fe 1631 {
Sergunb 0:8f0d870509fe 1632 status = FLASH_GetBank1Status();
Sergunb 0:8f0d870509fe 1633 Timeout--;
Sergunb 0:8f0d870509fe 1634 }
Sergunb 0:8f0d870509fe 1635 if(Timeout == 0x00 )
Sergunb 0:8f0d870509fe 1636 {
Sergunb 0:8f0d870509fe 1637 status = FLASH_TIMEOUT;
Sergunb 0:8f0d870509fe 1638 }
Sergunb 0:8f0d870509fe 1639 /* Return the operation status */
Sergunb 0:8f0d870509fe 1640 return status;
Sergunb 0:8f0d870509fe 1641 }
Sergunb 0:8f0d870509fe 1642
Sergunb 0:8f0d870509fe 1643 #ifdef STM32F10X_XL
Sergunb 0:8f0d870509fe 1644 /**
Sergunb 0:8f0d870509fe 1645 * @brief Waits for a Flash operation on Bank2 to complete or a TIMEOUT to occur.
Sergunb 0:8f0d870509fe 1646 * @note This function can be used only for STM32F10x_XL density devices.
Sergunb 0:8f0d870509fe 1647 * @param Timeout: FLASH programming Timeout
Sergunb 0:8f0d870509fe 1648 * @retval FLASH Status: The returned value can be: FLASH_ERROR_PG,
Sergunb 0:8f0d870509fe 1649 * FLASH_ERROR_WRP, FLASH_COMPLETE or FLASH_TIMEOUT.
Sergunb 0:8f0d870509fe 1650 */
Sergunb 0:8f0d870509fe 1651 FLASH_Status FLASH_WaitForLastBank2Operation(uint32_t Timeout)
Sergunb 0:8f0d870509fe 1652 {
Sergunb 0:8f0d870509fe 1653 FLASH_Status status = FLASH_COMPLETE;
Sergunb 0:8f0d870509fe 1654
Sergunb 0:8f0d870509fe 1655 /* Check for the Flash Status */
Sergunb 0:8f0d870509fe 1656 status = FLASH_GetBank2Status();
Sergunb 0:8f0d870509fe 1657 /* Wait for a Flash operation to complete or a TIMEOUT to occur */
Sergunb 0:8f0d870509fe 1658 while((status == (FLASH_FLAG_BANK2_BSY & 0x7FFFFFFF)) && (Timeout != 0x00))
Sergunb 0:8f0d870509fe 1659 {
Sergunb 0:8f0d870509fe 1660 status = FLASH_GetBank2Status();
Sergunb 0:8f0d870509fe 1661 Timeout--;
Sergunb 0:8f0d870509fe 1662 }
Sergunb 0:8f0d870509fe 1663 if(Timeout == 0x00 )
Sergunb 0:8f0d870509fe 1664 {
Sergunb 0:8f0d870509fe 1665 status = FLASH_TIMEOUT;
Sergunb 0:8f0d870509fe 1666 }
Sergunb 0:8f0d870509fe 1667 /* Return the operation status */
Sergunb 0:8f0d870509fe 1668 return status;
Sergunb 0:8f0d870509fe 1669 }
Sergunb 0:8f0d870509fe 1670 #endif /* STM32F10X_XL */
Sergunb 0:8f0d870509fe 1671
Sergunb 0:8f0d870509fe 1672 /**
Sergunb 0:8f0d870509fe 1673 * @}
Sergunb 0:8f0d870509fe 1674 */
Sergunb 0:8f0d870509fe 1675
Sergunb 0:8f0d870509fe 1676 /**
Sergunb 0:8f0d870509fe 1677 * @}
Sergunb 0:8f0d870509fe 1678 */
Sergunb 0:8f0d870509fe 1679
Sergunb 0:8f0d870509fe 1680 /**
Sergunb 0:8f0d870509fe 1681 * @}
Sergunb 0:8f0d870509fe 1682 */
Sergunb 0:8f0d870509fe 1683
Sergunb 0:8f0d870509fe 1684 /******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/