fix LPC812 PWM

Dependents:   IR_LED_Send

Fork of mbed-dev by mbed official

Committer:
nameless129
Date:
Mon May 16 16:50:30 2016 +0000
Revision:
129:2e517c56bcfb
Parent:
124:6a4a5b7d7324
PWM Fix:Duty 0%??H???????????????

Who changed what in which revision?

UserRevisionLine numberNew contents of line
bogdanm 0:9b334a45a8ff 1 /**
bogdanm 0:9b334a45a8ff 2 ******************************************************************************
bogdanm 0:9b334a45a8ff 3 * @file stm32f1xx_hal_flash_ex.c
bogdanm 0:9b334a45a8ff 4 * @author MCD Application Team
mbed_official 124:6a4a5b7d7324 5 * @version V1.0.4
mbed_official 124:6a4a5b7d7324 6 * @date 29-April-2016
bogdanm 0:9b334a45a8ff 7 * @brief Extended FLASH HAL module driver.
bogdanm 0:9b334a45a8ff 8 *
bogdanm 0:9b334a45a8ff 9 * This file provides firmware functions to manage the following
bogdanm 0:9b334a45a8ff 10 * functionalities of the FLASH peripheral:
bogdanm 0:9b334a45a8ff 11 * + Extended Initialization/de-initialization functions
bogdanm 0:9b334a45a8ff 12 * + Extended I/O operation functions
bogdanm 0:9b334a45a8ff 13 * + Extended Peripheral Control functions
bogdanm 0:9b334a45a8ff 14 *
bogdanm 0:9b334a45a8ff 15 @verbatim
bogdanm 0:9b334a45a8ff 16 ==============================================================================
bogdanm 0:9b334a45a8ff 17 ##### Flash peripheral extended features #####
bogdanm 0:9b334a45a8ff 18 ==============================================================================
bogdanm 0:9b334a45a8ff 19
bogdanm 0:9b334a45a8ff 20 ##### How to use this driver #####
bogdanm 0:9b334a45a8ff 21 ==============================================================================
bogdanm 0:9b334a45a8ff 22 [..] This driver provides functions to configure and program the FLASH memory
bogdanm 0:9b334a45a8ff 23 of all STM32F1xxx devices. It includes
bogdanm 0:9b334a45a8ff 24
bogdanm 0:9b334a45a8ff 25 (++) Set/Reset the write protection
bogdanm 0:9b334a45a8ff 26 (++) Program the user Option Bytes
bogdanm 0:9b334a45a8ff 27 (++) Get the Read protection Level
bogdanm 0:9b334a45a8ff 28
bogdanm 0:9b334a45a8ff 29 @endverbatim
bogdanm 0:9b334a45a8ff 30 ******************************************************************************
bogdanm 0:9b334a45a8ff 31 * @attention
bogdanm 0:9b334a45a8ff 32 *
mbed_official 124:6a4a5b7d7324 33 * <h2><center>&copy; COPYRIGHT(c) 2016 STMicroelectronics</center></h2>
bogdanm 0:9b334a45a8ff 34 *
bogdanm 0:9b334a45a8ff 35 * Redistribution and use in source and binary forms, with or without modification,
bogdanm 0:9b334a45a8ff 36 * are permitted provided that the following conditions are met:
bogdanm 0:9b334a45a8ff 37 * 1. Redistributions of source code must retain the above copyright notice,
bogdanm 0:9b334a45a8ff 38 * this list of conditions and the following disclaimer.
bogdanm 0:9b334a45a8ff 39 * 2. Redistributions in binary form must reproduce the above copyright notice,
bogdanm 0:9b334a45a8ff 40 * this list of conditions and the following disclaimer in the documentation
bogdanm 0:9b334a45a8ff 41 * and/or other materials provided with the distribution.
bogdanm 0:9b334a45a8ff 42 * 3. Neither the name of STMicroelectronics nor the names of its contributors
bogdanm 0:9b334a45a8ff 43 * may be used to endorse or promote products derived from this software
bogdanm 0:9b334a45a8ff 44 * without specific prior written permission.
bogdanm 0:9b334a45a8ff 45 *
bogdanm 0:9b334a45a8ff 46 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
bogdanm 0:9b334a45a8ff 47 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
bogdanm 0:9b334a45a8ff 48 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
bogdanm 0:9b334a45a8ff 49 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
bogdanm 0:9b334a45a8ff 50 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
bogdanm 0:9b334a45a8ff 51 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
bogdanm 0:9b334a45a8ff 52 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
bogdanm 0:9b334a45a8ff 53 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
bogdanm 0:9b334a45a8ff 54 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
bogdanm 0:9b334a45a8ff 55 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
bogdanm 0:9b334a45a8ff 56 *
bogdanm 0:9b334a45a8ff 57 ******************************************************************************
bogdanm 0:9b334a45a8ff 58 */
bogdanm 0:9b334a45a8ff 59
bogdanm 0:9b334a45a8ff 60 /* Includes ------------------------------------------------------------------*/
bogdanm 0:9b334a45a8ff 61 #include "stm32f1xx_hal.h"
bogdanm 0:9b334a45a8ff 62
bogdanm 0:9b334a45a8ff 63 /** @addtogroup STM32F1xx_HAL_Driver
bogdanm 0:9b334a45a8ff 64 * @{
bogdanm 0:9b334a45a8ff 65 */
bogdanm 0:9b334a45a8ff 66 #ifdef HAL_FLASH_MODULE_ENABLED
bogdanm 0:9b334a45a8ff 67
bogdanm 0:9b334a45a8ff 68 /** @addtogroup FLASH
bogdanm 0:9b334a45a8ff 69 * @{
bogdanm 0:9b334a45a8ff 70 */
bogdanm 0:9b334a45a8ff 71 /** @addtogroup FLASH_Private_Variables
bogdanm 0:9b334a45a8ff 72 * @{
bogdanm 0:9b334a45a8ff 73 */
bogdanm 0:9b334a45a8ff 74 /* Variables used for Erase pages under interruption*/
bogdanm 0:9b334a45a8ff 75 extern FLASH_ProcessTypeDef pFlash;
bogdanm 0:9b334a45a8ff 76 /**
bogdanm 0:9b334a45a8ff 77 * @}
bogdanm 0:9b334a45a8ff 78 */
bogdanm 0:9b334a45a8ff 79
bogdanm 0:9b334a45a8ff 80 /**
bogdanm 0:9b334a45a8ff 81 * @}
bogdanm 0:9b334a45a8ff 82 */
bogdanm 0:9b334a45a8ff 83
bogdanm 0:9b334a45a8ff 84 /** @defgroup FLASHEx FLASHEx
mbed_official 124:6a4a5b7d7324 85 * @brief FLASH HAL Extension module driver
bogdanm 0:9b334a45a8ff 86 * @{
bogdanm 0:9b334a45a8ff 87 */
bogdanm 0:9b334a45a8ff 88
bogdanm 0:9b334a45a8ff 89 /* Private typedef -----------------------------------------------------------*/
bogdanm 0:9b334a45a8ff 90 /* Private define ------------------------------------------------------------*/
bogdanm 0:9b334a45a8ff 91 /** @defgroup FLASHEx_Private_Constants FLASHEx Private Constants
bogdanm 0:9b334a45a8ff 92 * @{
bogdanm 0:9b334a45a8ff 93 */
mbed_official 124:6a4a5b7d7324 94 #define FLASH_POSITION_IWDGSW_BIT (uint32_t)POSITION_VAL(FLASH_OBR_IWDG_SW)
mbed_official 124:6a4a5b7d7324 95 #define FLASH_POSITION_OB_USERDATA0_BIT (uint32_t)POSITION_VAL(FLASH_OBR_DATA0)
mbed_official 124:6a4a5b7d7324 96 #define FLASH_POSITION_OB_USERDATA1_BIT (uint32_t)POSITION_VAL(FLASH_OBR_DATA1)
bogdanm 0:9b334a45a8ff 97 /**
bogdanm 0:9b334a45a8ff 98 * @}
bogdanm 0:9b334a45a8ff 99 */
bogdanm 0:9b334a45a8ff 100
bogdanm 0:9b334a45a8ff 101 /* Private macro -------------------------------------------------------------*/
bogdanm 0:9b334a45a8ff 102 /** @defgroup FLASHEx_Private_Macros FLASHEx Private Macros
bogdanm 0:9b334a45a8ff 103 * @{
bogdanm 0:9b334a45a8ff 104 */
bogdanm 0:9b334a45a8ff 105 /**
bogdanm 0:9b334a45a8ff 106 * @}
bogdanm 0:9b334a45a8ff 107 */
bogdanm 0:9b334a45a8ff 108
bogdanm 0:9b334a45a8ff 109 /* Private variables ---------------------------------------------------------*/
bogdanm 0:9b334a45a8ff 110 /* Private function prototypes -----------------------------------------------*/
bogdanm 0:9b334a45a8ff 111 /** @defgroup FLASHEx_Private_Functions FLASHEx Private Functions
bogdanm 0:9b334a45a8ff 112 * @{
bogdanm 0:9b334a45a8ff 113 */
bogdanm 0:9b334a45a8ff 114 /* Erase operations */
bogdanm 0:9b334a45a8ff 115 static void FLASH_MassErase(uint32_t Banks);
bogdanm 0:9b334a45a8ff 116
bogdanm 0:9b334a45a8ff 117 /* Option bytes control */
bogdanm 0:9b334a45a8ff 118 static HAL_StatusTypeDef FLASH_OB_EnableWRP(uint32_t WriteProtectPage);
bogdanm 0:9b334a45a8ff 119 static HAL_StatusTypeDef FLASH_OB_DisableWRP(uint32_t WriteProtectPage);
bogdanm 0:9b334a45a8ff 120 static HAL_StatusTypeDef FLASH_OB_RDP_LevelConfig(uint8_t ReadProtectLevel);
bogdanm 0:9b334a45a8ff 121 static HAL_StatusTypeDef FLASH_OB_UserConfig(uint8_t UserConfig);
bogdanm 0:9b334a45a8ff 122 static HAL_StatusTypeDef FLASH_OB_ProgramData(uint32_t Address, uint8_t Data);
bogdanm 0:9b334a45a8ff 123 static uint32_t FLASH_OB_GetWRP(void);
mbed_official 124:6a4a5b7d7324 124 static uint32_t FLASH_OB_GetRDP(void);
bogdanm 0:9b334a45a8ff 125 static uint8_t FLASH_OB_GetUser(void);
bogdanm 0:9b334a45a8ff 126
bogdanm 0:9b334a45a8ff 127 /**
bogdanm 0:9b334a45a8ff 128 * @}
bogdanm 0:9b334a45a8ff 129 */
bogdanm 0:9b334a45a8ff 130
bogdanm 0:9b334a45a8ff 131 /* Exported functions ---------------------------------------------------------*/
bogdanm 0:9b334a45a8ff 132 /** @defgroup FLASHEx_Exported_Functions FLASHEx Exported Functions
bogdanm 0:9b334a45a8ff 133 * @{
bogdanm 0:9b334a45a8ff 134 */
bogdanm 0:9b334a45a8ff 135
mbed_official 124:6a4a5b7d7324 136 /** @defgroup FLASHEx_Exported_Functions_Group1 FLASHEx Memory Erasing functions
mbed_official 124:6a4a5b7d7324 137 * @brief FLASH Memory Erasing functions
bogdanm 0:9b334a45a8ff 138 *
bogdanm 0:9b334a45a8ff 139 @verbatim
mbed_official 124:6a4a5b7d7324 140 ==============================================================================
mbed_official 124:6a4a5b7d7324 141 ##### FLASH Erasing Programming functions #####
mbed_official 124:6a4a5b7d7324 142 ==============================================================================
mbed_official 124:6a4a5b7d7324 143
mbed_official 124:6a4a5b7d7324 144 [..] The FLASH Memory Erasing functions, includes the following functions:
mbed_official 124:6a4a5b7d7324 145 (+) @ref HAL_FLASHEx_Erase: return only when erase has been done
mbed_official 124:6a4a5b7d7324 146 (+) @ref HAL_FLASHEx_Erase_IT: end of erase is done when @ref HAL_FLASH_EndOfOperationCallback
mbed_official 124:6a4a5b7d7324 147 is called with parameter 0xFFFFFFFF
mbed_official 124:6a4a5b7d7324 148
mbed_official 124:6a4a5b7d7324 149 [..] Any operation of erase should follow these steps:
mbed_official 124:6a4a5b7d7324 150 (#) Call the @ref HAL_FLASH_Unlock() function to enable the flash control register and
mbed_official 124:6a4a5b7d7324 151 program memory access.
mbed_official 124:6a4a5b7d7324 152 (#) Call the desired function to erase page.
mbed_official 124:6a4a5b7d7324 153 (#) Call the @ref HAL_FLASH_Lock() to disable the flash program memory access
mbed_official 124:6a4a5b7d7324 154 (recommended to protect the FLASH memory against possible unwanted operation).
bogdanm 0:9b334a45a8ff 155
bogdanm 0:9b334a45a8ff 156 @endverbatim
bogdanm 0:9b334a45a8ff 157 * @{
bogdanm 0:9b334a45a8ff 158 */
bogdanm 0:9b334a45a8ff 159
bogdanm 0:9b334a45a8ff 160
bogdanm 0:9b334a45a8ff 161 /**
bogdanm 0:9b334a45a8ff 162 * @brief Perform a mass erase or erase the specified FLASH memory pages
mbed_official 124:6a4a5b7d7324 163 * @note To correctly run this function, the @ref HAL_FLASH_Unlock() function
mbed_official 124:6a4a5b7d7324 164 * must be called before.
mbed_official 124:6a4a5b7d7324 165 * Call the @ref HAL_FLASH_Lock() to disable the flash memory access
mbed_official 124:6a4a5b7d7324 166 * (recommended to protect the FLASH memory against possible unwanted operation)
mbed_official 124:6a4a5b7d7324 167 * @param[in] pEraseInit pointer to an FLASH_EraseInitTypeDef structure that
bogdanm 0:9b334a45a8ff 168 * contains the configuration information for the erasing.
bogdanm 0:9b334a45a8ff 169 *
mbed_official 124:6a4a5b7d7324 170 * @param[out] PageError pointer to variable that
bogdanm 0:9b334a45a8ff 171 * contains the configuration information on faulty page in case of error
bogdanm 0:9b334a45a8ff 172 * (0xFFFFFFFF means that all the pages have been correctly erased)
bogdanm 0:9b334a45a8ff 173 *
bogdanm 0:9b334a45a8ff 174 * @retval HAL_StatusTypeDef HAL Status
bogdanm 0:9b334a45a8ff 175 */
bogdanm 0:9b334a45a8ff 176 HAL_StatusTypeDef HAL_FLASHEx_Erase(FLASH_EraseInitTypeDef *pEraseInit, uint32_t *PageError)
bogdanm 0:9b334a45a8ff 177 {
bogdanm 0:9b334a45a8ff 178 HAL_StatusTypeDef status = HAL_ERROR;
bogdanm 0:9b334a45a8ff 179 uint32_t address = 0;
bogdanm 0:9b334a45a8ff 180
bogdanm 0:9b334a45a8ff 181 /* Process Locked */
bogdanm 0:9b334a45a8ff 182 __HAL_LOCK(&pFlash);
bogdanm 0:9b334a45a8ff 183
bogdanm 0:9b334a45a8ff 184 /* Check the parameters */
bogdanm 0:9b334a45a8ff 185 assert_param(IS_FLASH_TYPEERASE(pEraseInit->TypeErase));
bogdanm 0:9b334a45a8ff 186
bogdanm 0:9b334a45a8ff 187 if (pEraseInit->TypeErase == FLASH_TYPEERASE_MASSERASE)
bogdanm 0:9b334a45a8ff 188 {
mbed_official 124:6a4a5b7d7324 189 #if defined(FLASH_BANK2_END)
bogdanm 0:9b334a45a8ff 190 if (pEraseInit->Banks == FLASH_BANK_BOTH)
bogdanm 0:9b334a45a8ff 191 {
bogdanm 0:9b334a45a8ff 192 /* Mass Erase requested for Bank1 and Bank2 */
bogdanm 0:9b334a45a8ff 193 /* Wait for last operation to be completed */
bogdanm 0:9b334a45a8ff 194 if ((FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE) == HAL_OK) && \
bogdanm 0:9b334a45a8ff 195 (FLASH_WaitForLastOperationBank2((uint32_t)FLASH_TIMEOUT_VALUE) == HAL_OK))
bogdanm 0:9b334a45a8ff 196 {
bogdanm 0:9b334a45a8ff 197 /*Mass erase to be done*/
bogdanm 0:9b334a45a8ff 198 FLASH_MassErase(FLASH_BANK_BOTH);
bogdanm 0:9b334a45a8ff 199
bogdanm 0:9b334a45a8ff 200 /* Wait for last operation to be completed */
bogdanm 0:9b334a45a8ff 201 if ((FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE) == HAL_OK) && \
bogdanm 0:9b334a45a8ff 202 (FLASH_WaitForLastOperationBank2((uint32_t)FLASH_TIMEOUT_VALUE) == HAL_OK))
bogdanm 0:9b334a45a8ff 203 {
bogdanm 0:9b334a45a8ff 204 status = HAL_OK;
bogdanm 0:9b334a45a8ff 205 }
bogdanm 0:9b334a45a8ff 206
bogdanm 0:9b334a45a8ff 207 /* If the erase operation is completed, disable the MER Bit */
bogdanm 0:9b334a45a8ff 208 CLEAR_BIT(FLASH->CR, FLASH_CR_MER);
bogdanm 0:9b334a45a8ff 209 CLEAR_BIT(FLASH->CR2, FLASH_CR2_MER);
bogdanm 0:9b334a45a8ff 210 }
bogdanm 0:9b334a45a8ff 211 }
bogdanm 0:9b334a45a8ff 212 else if (pEraseInit->Banks == FLASH_BANK_2)
bogdanm 0:9b334a45a8ff 213 {
bogdanm 0:9b334a45a8ff 214 /* Mass Erase requested for Bank2 */
bogdanm 0:9b334a45a8ff 215 /* Wait for last operation to be completed */
bogdanm 0:9b334a45a8ff 216 if (FLASH_WaitForLastOperationBank2((uint32_t)FLASH_TIMEOUT_VALUE) == HAL_OK)
bogdanm 0:9b334a45a8ff 217 {
bogdanm 0:9b334a45a8ff 218 /*Mass erase to be done*/
bogdanm 0:9b334a45a8ff 219 FLASH_MassErase(FLASH_BANK_2);
bogdanm 0:9b334a45a8ff 220
bogdanm 0:9b334a45a8ff 221 /* Wait for last operation to be completed */
bogdanm 0:9b334a45a8ff 222 status = FLASH_WaitForLastOperationBank2((uint32_t)FLASH_TIMEOUT_VALUE);
bogdanm 0:9b334a45a8ff 223
bogdanm 0:9b334a45a8ff 224 /* If the erase operation is completed, disable the MER Bit */
bogdanm 0:9b334a45a8ff 225 CLEAR_BIT(FLASH->CR2, FLASH_CR2_MER);
bogdanm 0:9b334a45a8ff 226 }
bogdanm 0:9b334a45a8ff 227 }
bogdanm 0:9b334a45a8ff 228 else
mbed_official 124:6a4a5b7d7324 229 #endif /* FLASH_BANK2_END */
bogdanm 0:9b334a45a8ff 230 {
bogdanm 0:9b334a45a8ff 231 /* Mass Erase requested for Bank1 */
bogdanm 0:9b334a45a8ff 232 /* Wait for last operation to be completed */
bogdanm 0:9b334a45a8ff 233 if (FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE) == HAL_OK)
bogdanm 0:9b334a45a8ff 234 {
bogdanm 0:9b334a45a8ff 235 /*Mass erase to be done*/
bogdanm 0:9b334a45a8ff 236 FLASH_MassErase(FLASH_BANK_1);
bogdanm 0:9b334a45a8ff 237
bogdanm 0:9b334a45a8ff 238 /* Wait for last operation to be completed */
bogdanm 0:9b334a45a8ff 239 status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE);
bogdanm 0:9b334a45a8ff 240
bogdanm 0:9b334a45a8ff 241 /* If the erase operation is completed, disable the MER Bit */
bogdanm 0:9b334a45a8ff 242 CLEAR_BIT(FLASH->CR, FLASH_CR_MER);
bogdanm 0:9b334a45a8ff 243 }
bogdanm 0:9b334a45a8ff 244 }
bogdanm 0:9b334a45a8ff 245 }
bogdanm 0:9b334a45a8ff 246 else
bogdanm 0:9b334a45a8ff 247 {
bogdanm 0:9b334a45a8ff 248 /* Page Erase is requested */
bogdanm 0:9b334a45a8ff 249 /* Check the parameters */
bogdanm 0:9b334a45a8ff 250 assert_param(IS_FLASH_PROGRAM_ADDRESS(pEraseInit->PageAddress));
bogdanm 0:9b334a45a8ff 251 assert_param(IS_FLASH_NB_PAGES(pEraseInit->PageAddress, pEraseInit->NbPages));
bogdanm 0:9b334a45a8ff 252
mbed_official 124:6a4a5b7d7324 253 #if defined(FLASH_BANK2_END)
bogdanm 0:9b334a45a8ff 254 /* Page Erase requested on address located on bank2 */
bogdanm 0:9b334a45a8ff 255 if(pEraseInit->PageAddress > FLASH_BANK1_END)
bogdanm 0:9b334a45a8ff 256 {
bogdanm 0:9b334a45a8ff 257 /* Wait for last operation to be completed */
bogdanm 0:9b334a45a8ff 258 if (FLASH_WaitForLastOperationBank2((uint32_t)FLASH_TIMEOUT_VALUE) == HAL_OK)
bogdanm 0:9b334a45a8ff 259 {
bogdanm 0:9b334a45a8ff 260 /*Initialization of PageError variable*/
bogdanm 0:9b334a45a8ff 261 *PageError = 0xFFFFFFFF;
bogdanm 0:9b334a45a8ff 262
bogdanm 0:9b334a45a8ff 263 /* Erase by page by page to be done*/
bogdanm 0:9b334a45a8ff 264 for(address = pEraseInit->PageAddress;
bogdanm 0:9b334a45a8ff 265 address < (pEraseInit->PageAddress + (pEraseInit->NbPages)*FLASH_PAGE_SIZE);
bogdanm 0:9b334a45a8ff 266 address += FLASH_PAGE_SIZE)
bogdanm 0:9b334a45a8ff 267 {
bogdanm 0:9b334a45a8ff 268 FLASH_PageErase(address);
bogdanm 0:9b334a45a8ff 269
bogdanm 0:9b334a45a8ff 270 /* Wait for last operation to be completed */
bogdanm 0:9b334a45a8ff 271 status = FLASH_WaitForLastOperationBank2((uint32_t)FLASH_TIMEOUT_VALUE);
bogdanm 0:9b334a45a8ff 272
bogdanm 0:9b334a45a8ff 273 /* If the erase operation is completed, disable the PER Bit */
bogdanm 0:9b334a45a8ff 274 CLEAR_BIT(FLASH->CR2, FLASH_CR2_PER);
bogdanm 0:9b334a45a8ff 275
bogdanm 0:9b334a45a8ff 276 if (status != HAL_OK)
bogdanm 0:9b334a45a8ff 277 {
bogdanm 0:9b334a45a8ff 278 /* In case of error, stop erase procedure and return the faulty address */
bogdanm 0:9b334a45a8ff 279 *PageError = address;
bogdanm 0:9b334a45a8ff 280 break;
bogdanm 0:9b334a45a8ff 281 }
bogdanm 0:9b334a45a8ff 282 }
bogdanm 0:9b334a45a8ff 283 }
bogdanm 0:9b334a45a8ff 284 }
bogdanm 0:9b334a45a8ff 285 else
mbed_official 124:6a4a5b7d7324 286 #endif /* FLASH_BANK2_END */
mbed_official 124:6a4a5b7d7324 287 {
bogdanm 0:9b334a45a8ff 288 /* Page Erase requested on address located on bank1 */
bogdanm 0:9b334a45a8ff 289 /* Wait for last operation to be completed */
bogdanm 0:9b334a45a8ff 290 if (FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE) == HAL_OK)
bogdanm 0:9b334a45a8ff 291 {
mbed_official 124:6a4a5b7d7324 292 /*Initialization of PageError variable*/
mbed_official 124:6a4a5b7d7324 293 *PageError = 0xFFFFFFFF;
mbed_official 124:6a4a5b7d7324 294
mbed_official 124:6a4a5b7d7324 295 /* Erase page by page to be done*/
mbed_official 124:6a4a5b7d7324 296 for(address = pEraseInit->PageAddress;
mbed_official 124:6a4a5b7d7324 297 address < ((pEraseInit->NbPages * FLASH_PAGE_SIZE) + pEraseInit->PageAddress);
mbed_official 124:6a4a5b7d7324 298 address += FLASH_PAGE_SIZE)
bogdanm 0:9b334a45a8ff 299 {
mbed_official 124:6a4a5b7d7324 300 FLASH_PageErase(address);
bogdanm 0:9b334a45a8ff 301
bogdanm 0:9b334a45a8ff 302 /* Wait for last operation to be completed */
bogdanm 0:9b334a45a8ff 303 status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE);
bogdanm 0:9b334a45a8ff 304
mbed_official 124:6a4a5b7d7324 305 /* If the erase operation is completed, disable the PER Bit */
mbed_official 124:6a4a5b7d7324 306 CLEAR_BIT(FLASH->CR, FLASH_CR_PER);
bogdanm 0:9b334a45a8ff 307
mbed_official 124:6a4a5b7d7324 308 if (status != HAL_OK)
bogdanm 0:9b334a45a8ff 309 {
mbed_official 124:6a4a5b7d7324 310 /* In case of error, stop erase procedure and return the faulty address */
mbed_official 124:6a4a5b7d7324 311 *PageError = address;
mbed_official 124:6a4a5b7d7324 312 break;
bogdanm 0:9b334a45a8ff 313 }
bogdanm 0:9b334a45a8ff 314 }
bogdanm 0:9b334a45a8ff 315 }
bogdanm 0:9b334a45a8ff 316 }
bogdanm 0:9b334a45a8ff 317 }
bogdanm 0:9b334a45a8ff 318
bogdanm 0:9b334a45a8ff 319 /* Process Unlocked */
bogdanm 0:9b334a45a8ff 320 __HAL_UNLOCK(&pFlash);
bogdanm 0:9b334a45a8ff 321
bogdanm 0:9b334a45a8ff 322 return status;
bogdanm 0:9b334a45a8ff 323 }
bogdanm 0:9b334a45a8ff 324
bogdanm 0:9b334a45a8ff 325 /**
mbed_official 124:6a4a5b7d7324 326 * @brief Perform a mass erase or erase the specified FLASH memory pages with interrupt enabled
mbed_official 124:6a4a5b7d7324 327 * @note To correctly run this function, the @ref HAL_FLASH_Unlock() function
mbed_official 124:6a4a5b7d7324 328 * must be called before.
mbed_official 124:6a4a5b7d7324 329 * Call the @ref HAL_FLASH_Lock() to disable the flash memory access
mbed_official 124:6a4a5b7d7324 330 * (recommended to protect the FLASH memory against possible unwanted operation)
mbed_official 124:6a4a5b7d7324 331 * @param pEraseInit pointer to an FLASH_EraseInitTypeDef structure that
bogdanm 0:9b334a45a8ff 332 * contains the configuration information for the erasing.
bogdanm 0:9b334a45a8ff 333 *
bogdanm 0:9b334a45a8ff 334 * @retval HAL_StatusTypeDef HAL Status
bogdanm 0:9b334a45a8ff 335 */
bogdanm 0:9b334a45a8ff 336 HAL_StatusTypeDef HAL_FLASHEx_Erase_IT(FLASH_EraseInitTypeDef *pEraseInit)
bogdanm 0:9b334a45a8ff 337 {
bogdanm 0:9b334a45a8ff 338 HAL_StatusTypeDef status = HAL_OK;
bogdanm 0:9b334a45a8ff 339
bogdanm 0:9b334a45a8ff 340 /* Process Locked */
bogdanm 0:9b334a45a8ff 341 __HAL_LOCK(&pFlash);
bogdanm 0:9b334a45a8ff 342
bogdanm 0:9b334a45a8ff 343 /* If procedure already ongoing, reject the next one */
bogdanm 0:9b334a45a8ff 344 if (pFlash.ProcedureOnGoing != FLASH_PROC_NONE)
bogdanm 0:9b334a45a8ff 345 {
bogdanm 0:9b334a45a8ff 346 return HAL_ERROR;
bogdanm 0:9b334a45a8ff 347 }
bogdanm 0:9b334a45a8ff 348
bogdanm 0:9b334a45a8ff 349 /* Check the parameters */
bogdanm 0:9b334a45a8ff 350 assert_param(IS_FLASH_TYPEERASE(pEraseInit->TypeErase));
bogdanm 0:9b334a45a8ff 351
bogdanm 0:9b334a45a8ff 352 /* Enable End of FLASH Operation and Error source interrupts */
mbed_official 124:6a4a5b7d7324 353 __HAL_FLASH_ENABLE_IT(FLASH_IT_EOP | FLASH_IT_ERR);
bogdanm 0:9b334a45a8ff 354
mbed_official 124:6a4a5b7d7324 355 #if defined(FLASH_BANK2_END)
bogdanm 0:9b334a45a8ff 356 /* Enable End of FLASH Operation and Error source interrupts */
mbed_official 124:6a4a5b7d7324 357 __HAL_FLASH_ENABLE_IT(FLASH_IT_EOP_BANK2 | FLASH_IT_ERR_BANK2);
mbed_official 124:6a4a5b7d7324 358
bogdanm 0:9b334a45a8ff 359 #endif
bogdanm 0:9b334a45a8ff 360 if (pEraseInit->TypeErase == FLASH_TYPEERASE_MASSERASE)
bogdanm 0:9b334a45a8ff 361 {
bogdanm 0:9b334a45a8ff 362 /*Mass erase to be done*/
bogdanm 0:9b334a45a8ff 363 pFlash.ProcedureOnGoing = FLASH_PROC_MASSERASE;
mbed_official 124:6a4a5b7d7324 364 FLASH_MassErase(pEraseInit->Banks);
bogdanm 0:9b334a45a8ff 365 }
bogdanm 0:9b334a45a8ff 366 else
bogdanm 0:9b334a45a8ff 367 {
bogdanm 0:9b334a45a8ff 368 /* Erase by page to be done*/
bogdanm 0:9b334a45a8ff 369
bogdanm 0:9b334a45a8ff 370 /* Check the parameters */
bogdanm 0:9b334a45a8ff 371 assert_param(IS_FLASH_PROGRAM_ADDRESS(pEraseInit->PageAddress));
bogdanm 0:9b334a45a8ff 372 assert_param(IS_FLASH_NB_PAGES(pEraseInit->PageAddress, pEraseInit->NbPages));
bogdanm 0:9b334a45a8ff 373
bogdanm 0:9b334a45a8ff 374 pFlash.ProcedureOnGoing = FLASH_PROC_PAGEERASE;
bogdanm 0:9b334a45a8ff 375 pFlash.DataRemaining = pEraseInit->NbPages;
bogdanm 0:9b334a45a8ff 376 pFlash.Address = pEraseInit->PageAddress;
bogdanm 0:9b334a45a8ff 377
bogdanm 0:9b334a45a8ff 378 /*Erase 1st page and wait for IT*/
bogdanm 0:9b334a45a8ff 379 FLASH_PageErase(pEraseInit->PageAddress);
bogdanm 0:9b334a45a8ff 380 }
bogdanm 0:9b334a45a8ff 381
bogdanm 0:9b334a45a8ff 382 return status;
bogdanm 0:9b334a45a8ff 383 }
bogdanm 0:9b334a45a8ff 384
bogdanm 0:9b334a45a8ff 385 /**
bogdanm 0:9b334a45a8ff 386 * @}
bogdanm 0:9b334a45a8ff 387 */
mbed_official 124:6a4a5b7d7324 388
mbed_official 124:6a4a5b7d7324 389 /** @defgroup FLASHEx_Exported_Functions_Group2 Option Bytes Programming functions
mbed_official 124:6a4a5b7d7324 390 * @brief Option Bytes Programming functions
bogdanm 0:9b334a45a8ff 391 *
bogdanm 0:9b334a45a8ff 392 @verbatim
mbed_official 124:6a4a5b7d7324 393 ==============================================================================
mbed_official 124:6a4a5b7d7324 394 ##### Option Bytes Programming functions #####
mbed_official 124:6a4a5b7d7324 395 ==============================================================================
bogdanm 0:9b334a45a8ff 396 [..]
bogdanm 0:9b334a45a8ff 397 This subsection provides a set of functions allowing to control the FLASH
mbed_official 124:6a4a5b7d7324 398 option bytes operations.
bogdanm 0:9b334a45a8ff 399
bogdanm 0:9b334a45a8ff 400 @endverbatim
bogdanm 0:9b334a45a8ff 401 * @{
bogdanm 0:9b334a45a8ff 402 */
bogdanm 0:9b334a45a8ff 403
bogdanm 0:9b334a45a8ff 404 /**
bogdanm 0:9b334a45a8ff 405 * @brief Erases the FLASH option bytes.
bogdanm 0:9b334a45a8ff 406 * @note This functions erases all option bytes except the Read protection (RDP).
mbed_official 124:6a4a5b7d7324 407 * The function @ref HAL_FLASH_Unlock() should be called before to unlock the FLASH interface
mbed_official 124:6a4a5b7d7324 408 * The function @ref HAL_FLASH_OB_Unlock() should be called before to unlock the options bytes
mbed_official 124:6a4a5b7d7324 409 * The function @ref HAL_FLASH_OB_Launch() should be called after to force the reload of the options bytes
bogdanm 0:9b334a45a8ff 410 * (system reset will occur)
bogdanm 0:9b334a45a8ff 411 * @retval HAL status
bogdanm 0:9b334a45a8ff 412 */
bogdanm 0:9b334a45a8ff 413
bogdanm 0:9b334a45a8ff 414 HAL_StatusTypeDef HAL_FLASHEx_OBErase(void)
bogdanm 0:9b334a45a8ff 415 {
bogdanm 0:9b334a45a8ff 416 uint8_t rdptmp = OB_RDP_LEVEL_0;
bogdanm 0:9b334a45a8ff 417 HAL_StatusTypeDef status = HAL_ERROR;
bogdanm 0:9b334a45a8ff 418
bogdanm 0:9b334a45a8ff 419 /* Get the actual read protection Option Byte value */
mbed_official 124:6a4a5b7d7324 420 rdptmp = FLASH_OB_GetRDP();
bogdanm 0:9b334a45a8ff 421
bogdanm 0:9b334a45a8ff 422 /* Wait for last operation to be completed */
bogdanm 0:9b334a45a8ff 423 status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE);
bogdanm 0:9b334a45a8ff 424
bogdanm 0:9b334a45a8ff 425 if(status == HAL_OK)
bogdanm 0:9b334a45a8ff 426 {
bogdanm 0:9b334a45a8ff 427 /* Clean the error context */
bogdanm 0:9b334a45a8ff 428 pFlash.ErrorCode = HAL_FLASH_ERROR_NONE;
bogdanm 0:9b334a45a8ff 429
bogdanm 0:9b334a45a8ff 430 /* If the previous operation is completed, proceed to erase the option bytes */
bogdanm 0:9b334a45a8ff 431 SET_BIT(FLASH->CR, FLASH_CR_OPTER);
bogdanm 0:9b334a45a8ff 432 SET_BIT(FLASH->CR, FLASH_CR_STRT);
bogdanm 0:9b334a45a8ff 433
bogdanm 0:9b334a45a8ff 434 /* Wait for last operation to be completed */
bogdanm 0:9b334a45a8ff 435 status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE);
bogdanm 0:9b334a45a8ff 436
bogdanm 0:9b334a45a8ff 437 /* If the erase operation is completed, disable the OPTER Bit */
bogdanm 0:9b334a45a8ff 438 CLEAR_BIT(FLASH->CR, FLASH_CR_OPTER);
bogdanm 0:9b334a45a8ff 439
bogdanm 0:9b334a45a8ff 440 if(status == HAL_OK)
bogdanm 0:9b334a45a8ff 441 {
bogdanm 0:9b334a45a8ff 442 /* Restore the last read protection Option Byte value */
bogdanm 0:9b334a45a8ff 443 status = FLASH_OB_RDP_LevelConfig(rdptmp);
bogdanm 0:9b334a45a8ff 444 }
bogdanm 0:9b334a45a8ff 445 }
bogdanm 0:9b334a45a8ff 446
bogdanm 0:9b334a45a8ff 447 /* Return the erase status */
bogdanm 0:9b334a45a8ff 448 return status;
bogdanm 0:9b334a45a8ff 449 }
bogdanm 0:9b334a45a8ff 450
bogdanm 0:9b334a45a8ff 451 /**
bogdanm 0:9b334a45a8ff 452 * @brief Program option bytes
mbed_official 124:6a4a5b7d7324 453 * @note The function @ref HAL_FLASH_Unlock() should be called before to unlock the FLASH interface
mbed_official 124:6a4a5b7d7324 454 * The function @ref HAL_FLASH_OB_Unlock() should be called before to unlock the options bytes
mbed_official 124:6a4a5b7d7324 455 * The function @ref HAL_FLASH_OB_Launch() should be called after to force the reload of the options bytes
bogdanm 0:9b334a45a8ff 456 * (system reset will occur)
bogdanm 0:9b334a45a8ff 457 *
mbed_official 124:6a4a5b7d7324 458 * @param pOBInit pointer to an FLASH_OBInitStruct structure that
bogdanm 0:9b334a45a8ff 459 * contains the configuration information for the programming.
bogdanm 0:9b334a45a8ff 460 *
bogdanm 0:9b334a45a8ff 461 * @retval HAL_StatusTypeDef HAL Status
bogdanm 0:9b334a45a8ff 462 */
bogdanm 0:9b334a45a8ff 463 HAL_StatusTypeDef HAL_FLASHEx_OBProgram(FLASH_OBProgramInitTypeDef *pOBInit)
bogdanm 0:9b334a45a8ff 464 {
bogdanm 0:9b334a45a8ff 465 HAL_StatusTypeDef status = HAL_ERROR;
bogdanm 0:9b334a45a8ff 466
mbed_official 124:6a4a5b7d7324 467 /* Process Locked */
mbed_official 124:6a4a5b7d7324 468 __HAL_LOCK(&pFlash);
mbed_official 124:6a4a5b7d7324 469
bogdanm 0:9b334a45a8ff 470 /* Check the parameters */
bogdanm 0:9b334a45a8ff 471 assert_param(IS_OPTIONBYTE(pOBInit->OptionType));
bogdanm 0:9b334a45a8ff 472
bogdanm 0:9b334a45a8ff 473 /* Write protection configuration */
bogdanm 0:9b334a45a8ff 474 if((pOBInit->OptionType & OPTIONBYTE_WRP) == OPTIONBYTE_WRP)
bogdanm 0:9b334a45a8ff 475 {
bogdanm 0:9b334a45a8ff 476 assert_param(IS_WRPSTATE(pOBInit->WRPState));
bogdanm 0:9b334a45a8ff 477 if (pOBInit->WRPState == OB_WRPSTATE_ENABLE)
bogdanm 0:9b334a45a8ff 478 {
bogdanm 0:9b334a45a8ff 479 /* Enable of Write protection on the selected page */
bogdanm 0:9b334a45a8ff 480 status = FLASH_OB_EnableWRP(pOBInit->WRPPage);
bogdanm 0:9b334a45a8ff 481 }
bogdanm 0:9b334a45a8ff 482 else
bogdanm 0:9b334a45a8ff 483 {
bogdanm 0:9b334a45a8ff 484 /* Disable of Write protection on the selected page */
bogdanm 0:9b334a45a8ff 485 status = FLASH_OB_DisableWRP(pOBInit->WRPPage);
bogdanm 0:9b334a45a8ff 486 }
mbed_official 124:6a4a5b7d7324 487 if (status != HAL_OK)
mbed_official 124:6a4a5b7d7324 488 {
mbed_official 124:6a4a5b7d7324 489 /* Process Unlocked */
mbed_official 124:6a4a5b7d7324 490 __HAL_UNLOCK(&pFlash);
mbed_official 124:6a4a5b7d7324 491 return status;
mbed_official 124:6a4a5b7d7324 492 }
bogdanm 0:9b334a45a8ff 493 }
bogdanm 0:9b334a45a8ff 494
bogdanm 0:9b334a45a8ff 495 /* Read protection configuration */
bogdanm 0:9b334a45a8ff 496 if((pOBInit->OptionType & OPTIONBYTE_RDP) == OPTIONBYTE_RDP)
bogdanm 0:9b334a45a8ff 497 {
bogdanm 0:9b334a45a8ff 498 status = FLASH_OB_RDP_LevelConfig(pOBInit->RDPLevel);
mbed_official 124:6a4a5b7d7324 499 if (status != HAL_OK)
mbed_official 124:6a4a5b7d7324 500 {
mbed_official 124:6a4a5b7d7324 501 /* Process Unlocked */
mbed_official 124:6a4a5b7d7324 502 __HAL_UNLOCK(&pFlash);
mbed_official 124:6a4a5b7d7324 503 return status;
mbed_official 124:6a4a5b7d7324 504 }
bogdanm 0:9b334a45a8ff 505 }
bogdanm 0:9b334a45a8ff 506
bogdanm 0:9b334a45a8ff 507 /* USER configuration */
bogdanm 0:9b334a45a8ff 508 if((pOBInit->OptionType & OPTIONBYTE_USER) == OPTIONBYTE_USER)
bogdanm 0:9b334a45a8ff 509 {
bogdanm 0:9b334a45a8ff 510 status = FLASH_OB_UserConfig(pOBInit->USERConfig);
mbed_official 124:6a4a5b7d7324 511 if (status != HAL_OK)
mbed_official 124:6a4a5b7d7324 512 {
mbed_official 124:6a4a5b7d7324 513 /* Process Unlocked */
mbed_official 124:6a4a5b7d7324 514 __HAL_UNLOCK(&pFlash);
mbed_official 124:6a4a5b7d7324 515 return status;
mbed_official 124:6a4a5b7d7324 516 }
bogdanm 0:9b334a45a8ff 517 }
bogdanm 0:9b334a45a8ff 518
bogdanm 0:9b334a45a8ff 519 /* DATA configuration*/
bogdanm 0:9b334a45a8ff 520 if((pOBInit->OptionType & OPTIONBYTE_DATA) == OPTIONBYTE_DATA)
bogdanm 0:9b334a45a8ff 521 {
bogdanm 0:9b334a45a8ff 522 status = FLASH_OB_ProgramData(pOBInit->DATAAddress, pOBInit->DATAData);
mbed_official 124:6a4a5b7d7324 523 if (status != HAL_OK)
mbed_official 124:6a4a5b7d7324 524 {
mbed_official 124:6a4a5b7d7324 525 /* Process Unlocked */
mbed_official 124:6a4a5b7d7324 526 __HAL_UNLOCK(&pFlash);
mbed_official 124:6a4a5b7d7324 527 return status;
mbed_official 124:6a4a5b7d7324 528 }
bogdanm 0:9b334a45a8ff 529 }
bogdanm 0:9b334a45a8ff 530
mbed_official 124:6a4a5b7d7324 531 /* Process Unlocked */
mbed_official 124:6a4a5b7d7324 532 __HAL_UNLOCK(&pFlash);
mbed_official 124:6a4a5b7d7324 533
bogdanm 0:9b334a45a8ff 534 return status;
bogdanm 0:9b334a45a8ff 535 }
bogdanm 0:9b334a45a8ff 536
bogdanm 0:9b334a45a8ff 537 /**
bogdanm 0:9b334a45a8ff 538 * @brief Get the Option byte configuration
mbed_official 124:6a4a5b7d7324 539 * @param pOBInit pointer to an FLASH_OBInitStruct structure that
bogdanm 0:9b334a45a8ff 540 * contains the configuration information for the programming.
bogdanm 0:9b334a45a8ff 541 *
bogdanm 0:9b334a45a8ff 542 * @retval None
bogdanm 0:9b334a45a8ff 543 */
bogdanm 0:9b334a45a8ff 544 void HAL_FLASHEx_OBGetConfig(FLASH_OBProgramInitTypeDef *pOBInit)
bogdanm 0:9b334a45a8ff 545 {
bogdanm 0:9b334a45a8ff 546 pOBInit->OptionType = OPTIONBYTE_WRP | OPTIONBYTE_RDP | OPTIONBYTE_USER;
bogdanm 0:9b334a45a8ff 547
bogdanm 0:9b334a45a8ff 548 /*Get WRP*/
bogdanm 0:9b334a45a8ff 549 pOBInit->WRPPage = FLASH_OB_GetWRP();
bogdanm 0:9b334a45a8ff 550
bogdanm 0:9b334a45a8ff 551 /*Get RDP Level*/
bogdanm 0:9b334a45a8ff 552 pOBInit->RDPLevel = FLASH_OB_GetRDP();
bogdanm 0:9b334a45a8ff 553
bogdanm 0:9b334a45a8ff 554 /*Get USER*/
bogdanm 0:9b334a45a8ff 555 pOBInit->USERConfig = FLASH_OB_GetUser();
bogdanm 0:9b334a45a8ff 556 }
bogdanm 0:9b334a45a8ff 557
bogdanm 0:9b334a45a8ff 558 /**
mbed_official 124:6a4a5b7d7324 559 * @brief Get the Option byte user data
mbed_official 124:6a4a5b7d7324 560 * @param DATAAdress Address of the option byte DATA
mbed_official 124:6a4a5b7d7324 561 * This parameter can be one of the following values:
mbed_official 124:6a4a5b7d7324 562 * @arg @ref OB_DATA_ADDRESS_DATA0
mbed_official 124:6a4a5b7d7324 563 * @arg @ref OB_DATA_ADDRESS_DATA1
mbed_official 124:6a4a5b7d7324 564 * @retval Value programmed in USER data
mbed_official 124:6a4a5b7d7324 565 */
mbed_official 124:6a4a5b7d7324 566 uint32_t HAL_FLASHEx_OBGetUserData(uint32_t DATAAdress)
mbed_official 124:6a4a5b7d7324 567 {
mbed_official 124:6a4a5b7d7324 568 uint32_t value = 0;
mbed_official 124:6a4a5b7d7324 569
mbed_official 124:6a4a5b7d7324 570 if (DATAAdress == OB_DATA_ADDRESS_DATA0)
mbed_official 124:6a4a5b7d7324 571 {
mbed_official 124:6a4a5b7d7324 572 /* Get value programmed in OB USER Data0 */
mbed_official 124:6a4a5b7d7324 573 value = READ_BIT(FLASH->OBR, FLASH_OBR_DATA0) >> FLASH_POSITION_OB_USERDATA0_BIT;
mbed_official 124:6a4a5b7d7324 574 }
mbed_official 124:6a4a5b7d7324 575 else
mbed_official 124:6a4a5b7d7324 576 {
mbed_official 124:6a4a5b7d7324 577 /* Get value programmed in OB USER Data1 */
mbed_official 124:6a4a5b7d7324 578 value = READ_BIT(FLASH->OBR, FLASH_OBR_DATA1) >> FLASH_POSITION_OB_USERDATA1_BIT;
mbed_official 124:6a4a5b7d7324 579 }
mbed_official 124:6a4a5b7d7324 580
mbed_official 124:6a4a5b7d7324 581 return value;
mbed_official 124:6a4a5b7d7324 582 }
mbed_official 124:6a4a5b7d7324 583
mbed_official 124:6a4a5b7d7324 584 /**
bogdanm 0:9b334a45a8ff 585 * @}
bogdanm 0:9b334a45a8ff 586 */
bogdanm 0:9b334a45a8ff 587
bogdanm 0:9b334a45a8ff 588 /**
bogdanm 0:9b334a45a8ff 589 * @}
bogdanm 0:9b334a45a8ff 590 */
bogdanm 0:9b334a45a8ff 591
bogdanm 0:9b334a45a8ff 592 /** @addtogroup FLASHEx_Private_Functions
bogdanm 0:9b334a45a8ff 593 * @{
bogdanm 0:9b334a45a8ff 594 */
bogdanm 0:9b334a45a8ff 595
bogdanm 0:9b334a45a8ff 596 /**
bogdanm 0:9b334a45a8ff 597 * @brief Full erase of FLASH memory Bank
mbed_official 124:6a4a5b7d7324 598 * @param Banks Banks to be erased
bogdanm 0:9b334a45a8ff 599 * This parameter can be one of the following values:
mbed_official 124:6a4a5b7d7324 600 * @arg @ref FLASH_BANK_1 Bank1 to be erased
mbed_official 124:6a4a5b7d7324 601 @if STM32F101xG
mbed_official 124:6a4a5b7d7324 602 * @arg @ref FLASH_BANK_2 Bank2 to be erased
mbed_official 124:6a4a5b7d7324 603 * @arg @ref FLASH_BANK_BOTH Bank1 and Bank2 to be erased
mbed_official 124:6a4a5b7d7324 604 @endif
mbed_official 124:6a4a5b7d7324 605 @if STM32F103xG
mbed_official 124:6a4a5b7d7324 606 * @arg @ref FLASH_BANK_2 Bank2 to be erased
mbed_official 124:6a4a5b7d7324 607 * @arg @ref FLASH_BANK_BOTH Bank1 and Bank2 to be erased
mbed_official 124:6a4a5b7d7324 608 @endif
bogdanm 0:9b334a45a8ff 609 *
mbed_official 124:6a4a5b7d7324 610 * @retval None
bogdanm 0:9b334a45a8ff 611 */
bogdanm 0:9b334a45a8ff 612 static void FLASH_MassErase(uint32_t Banks)
bogdanm 0:9b334a45a8ff 613 {
bogdanm 0:9b334a45a8ff 614 /* Check the parameters */
bogdanm 0:9b334a45a8ff 615 assert_param(IS_FLASH_BANK(Banks));
bogdanm 0:9b334a45a8ff 616
bogdanm 0:9b334a45a8ff 617 /* Clean the error context */
bogdanm 0:9b334a45a8ff 618 pFlash.ErrorCode = HAL_FLASH_ERROR_NONE;
bogdanm 0:9b334a45a8ff 619
mbed_official 124:6a4a5b7d7324 620 #if defined(FLASH_BANK2_END)
bogdanm 0:9b334a45a8ff 621 if(Banks == FLASH_BANK_BOTH)
bogdanm 0:9b334a45a8ff 622 {
bogdanm 0:9b334a45a8ff 623 /* bank1 & bank2 will be erased*/
bogdanm 0:9b334a45a8ff 624 SET_BIT(FLASH->CR, FLASH_CR_MER);
bogdanm 0:9b334a45a8ff 625 SET_BIT(FLASH->CR2, FLASH_CR2_MER);
bogdanm 0:9b334a45a8ff 626 SET_BIT(FLASH->CR, FLASH_CR_STRT);
bogdanm 0:9b334a45a8ff 627 SET_BIT(FLASH->CR2, FLASH_CR2_STRT);
bogdanm 0:9b334a45a8ff 628 }
bogdanm 0:9b334a45a8ff 629 else if(Banks == FLASH_BANK_2)
bogdanm 0:9b334a45a8ff 630 {
bogdanm 0:9b334a45a8ff 631 /*Only bank2 will be erased*/
bogdanm 0:9b334a45a8ff 632 SET_BIT(FLASH->CR2, FLASH_CR2_MER);
bogdanm 0:9b334a45a8ff 633 SET_BIT(FLASH->CR2, FLASH_CR2_STRT);
bogdanm 0:9b334a45a8ff 634 }
bogdanm 0:9b334a45a8ff 635 else
bogdanm 0:9b334a45a8ff 636 {
mbed_official 124:6a4a5b7d7324 637 #endif /* FLASH_BANK2_END */
mbed_official 124:6a4a5b7d7324 638 /* Only bank1 will be erased*/
bogdanm 0:9b334a45a8ff 639 SET_BIT(FLASH->CR, FLASH_CR_MER);
bogdanm 0:9b334a45a8ff 640 SET_BIT(FLASH->CR, FLASH_CR_STRT);
mbed_official 124:6a4a5b7d7324 641 #if defined(FLASH_BANK2_END)
bogdanm 0:9b334a45a8ff 642 }
mbed_official 124:6a4a5b7d7324 643 #endif /* FLASH_BANK2_END */
bogdanm 0:9b334a45a8ff 644 }
bogdanm 0:9b334a45a8ff 645
bogdanm 0:9b334a45a8ff 646 /**
bogdanm 0:9b334a45a8ff 647 * @brief Enable the write protection of the desired pages
mbed_official 124:6a4a5b7d7324 648 * @note An option byte erase is done automatically in this function.
bogdanm 0:9b334a45a8ff 649 * @note When the memory read protection level is selected (RDP level = 1),
mbed_official 124:6a4a5b7d7324 650 * it is not possible to program or erase the flash page i if
bogdanm 0:9b334a45a8ff 651 * debug features are connected or boot code is executed in RAM, even if nWRPi = 1
bogdanm 0:9b334a45a8ff 652 *
mbed_official 124:6a4a5b7d7324 653 * @param WriteProtectPage specifies the page(s) to be write protected.
bogdanm 0:9b334a45a8ff 654 * The value of this parameter depend on device used within the same series
bogdanm 0:9b334a45a8ff 655 * @retval HAL status
bogdanm 0:9b334a45a8ff 656 */
bogdanm 0:9b334a45a8ff 657 static HAL_StatusTypeDef FLASH_OB_EnableWRP(uint32_t WriteProtectPage)
bogdanm 0:9b334a45a8ff 658 {
bogdanm 0:9b334a45a8ff 659 HAL_StatusTypeDef status = HAL_OK;
bogdanm 0:9b334a45a8ff 660 uint16_t WRP0_Data = 0xFFFF;
mbed_official 124:6a4a5b7d7324 661 #if defined(FLASH_WRP1_WRP1)
mbed_official 124:6a4a5b7d7324 662 uint16_t WRP1_Data = 0xFFFF;
mbed_official 124:6a4a5b7d7324 663 #endif /* FLASH_WRP1_WRP1 */
mbed_official 124:6a4a5b7d7324 664 #if defined(FLASH_WRP2_WRP2)
mbed_official 124:6a4a5b7d7324 665 uint16_t WRP2_Data = 0xFFFF;
mbed_official 124:6a4a5b7d7324 666 #endif /* FLASH_WRP2_WRP2 */
mbed_official 124:6a4a5b7d7324 667 #if defined(FLASH_WRP3_WRP3)
mbed_official 124:6a4a5b7d7324 668 uint16_t WRP3_Data = 0xFFFF;
mbed_official 124:6a4a5b7d7324 669 #endif /* FLASH_WRP3_WRP3 */
bogdanm 0:9b334a45a8ff 670
bogdanm 0:9b334a45a8ff 671 /* Check the parameters */
bogdanm 0:9b334a45a8ff 672 assert_param(IS_OB_WRP(WriteProtectPage));
bogdanm 0:9b334a45a8ff 673
mbed_official 124:6a4a5b7d7324 674 /* Get current write protected pages and the new pages to be protected ******/
mbed_official 124:6a4a5b7d7324 675 WriteProtectPage = (uint32_t)(~((~FLASH_OB_GetWRP()) | WriteProtectPage));
bogdanm 0:9b334a45a8ff 676
mbed_official 124:6a4a5b7d7324 677 #if defined(OB_WRP_PAGES0TO15MASK)
bogdanm 0:9b334a45a8ff 678 WRP0_Data = (uint16_t)(WriteProtectPage & OB_WRP_PAGES0TO15MASK);
mbed_official 124:6a4a5b7d7324 679 #elif defined(OB_WRP_PAGES0TO31MASK)
mbed_official 124:6a4a5b7d7324 680 WRP0_Data = (uint16_t)(WriteProtectPage & OB_WRP_PAGES0TO31MASK);
mbed_official 124:6a4a5b7d7324 681 #endif /* OB_WRP_PAGES0TO31MASK */
mbed_official 124:6a4a5b7d7324 682
mbed_official 124:6a4a5b7d7324 683 #if defined(OB_WRP_PAGES16TO31MASK)
bogdanm 0:9b334a45a8ff 684 WRP1_Data = (uint16_t)((WriteProtectPage & OB_WRP_PAGES16TO31MASK) >> 8);
mbed_official 124:6a4a5b7d7324 685 #elif defined(OB_WRP_PAGES32TO63MASK)
mbed_official 124:6a4a5b7d7324 686 WRP1_Data = (uint16_t)((WriteProtectPage & OB_WRP_PAGES32TO63MASK) >> 8);
mbed_official 124:6a4a5b7d7324 687 #endif /* OB_WRP_PAGES32TO63MASK */
mbed_official 124:6a4a5b7d7324 688
mbed_official 124:6a4a5b7d7324 689 #if defined(OB_WRP_PAGES64TO95MASK)
mbed_official 124:6a4a5b7d7324 690 WRP2_Data = (uint16_t)((WriteProtectPage & OB_WRP_PAGES64TO95MASK) >> 16);
mbed_official 124:6a4a5b7d7324 691 #endif /* OB_WRP_PAGES64TO95MASK */
mbed_official 124:6a4a5b7d7324 692 #if defined(OB_WRP_PAGES32TO47MASK)
bogdanm 0:9b334a45a8ff 693 WRP2_Data = (uint16_t)((WriteProtectPage & OB_WRP_PAGES32TO47MASK) >> 16);
mbed_official 124:6a4a5b7d7324 694 #endif /* OB_WRP_PAGES32TO47MASK */
bogdanm 0:9b334a45a8ff 695
mbed_official 124:6a4a5b7d7324 696 #if defined(OB_WRP_PAGES96TO127MASK)
mbed_official 124:6a4a5b7d7324 697 WRP3_Data = (uint16_t)((WriteProtectPage & OB_WRP_PAGES96TO127MASK) >> 24);
mbed_official 124:6a4a5b7d7324 698 #elif defined(OB_WRP_PAGES48TO255MASK)
mbed_official 124:6a4a5b7d7324 699 WRP3_Data = (uint16_t)((WriteProtectPage & OB_WRP_PAGES48TO255MASK) >> 24);
mbed_official 124:6a4a5b7d7324 700 #elif defined(OB_WRP_PAGES48TO511MASK)
bogdanm 0:9b334a45a8ff 701 WRP3_Data = (uint16_t)((WriteProtectPage & OB_WRP_PAGES48TO511MASK) >> 24);
mbed_official 124:6a4a5b7d7324 702 #elif defined(OB_WRP_PAGES48TO127MASK)
bogdanm 0:9b334a45a8ff 703 WRP3_Data = (uint16_t)((WriteProtectPage & OB_WRP_PAGES48TO127MASK) >> 24);
mbed_official 124:6a4a5b7d7324 704 #endif /* OB_WRP_PAGES96TO127MASK */
mbed_official 124:6a4a5b7d7324 705
bogdanm 0:9b334a45a8ff 706 /* Wait for last operation to be completed */
bogdanm 0:9b334a45a8ff 707 status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE);
bogdanm 0:9b334a45a8ff 708
bogdanm 0:9b334a45a8ff 709 if(status == HAL_OK)
bogdanm 0:9b334a45a8ff 710 {
bogdanm 0:9b334a45a8ff 711 /* Clean the error context */
bogdanm 0:9b334a45a8ff 712 pFlash.ErrorCode = HAL_FLASH_ERROR_NONE;
bogdanm 0:9b334a45a8ff 713
mbed_official 124:6a4a5b7d7324 714 /* To be able to write again option byte, need to perform a option byte erase */
mbed_official 124:6a4a5b7d7324 715 status = HAL_FLASHEx_OBErase();
mbed_official 124:6a4a5b7d7324 716 if (status == HAL_OK)
bogdanm 0:9b334a45a8ff 717 {
mbed_official 124:6a4a5b7d7324 718 /* Enable write protection */
mbed_official 124:6a4a5b7d7324 719 SET_BIT(FLASH->CR, FLASH_CR_OPTPG);
bogdanm 0:9b334a45a8ff 720
mbed_official 124:6a4a5b7d7324 721 #if defined(FLASH_WRP0_WRP0)
mbed_official 124:6a4a5b7d7324 722 if(WRP0_Data != 0xFF)
mbed_official 124:6a4a5b7d7324 723 {
mbed_official 124:6a4a5b7d7324 724 OB->WRP0 &= WRP0_Data;
mbed_official 124:6a4a5b7d7324 725
mbed_official 124:6a4a5b7d7324 726 /* Wait for last operation to be completed */
mbed_official 124:6a4a5b7d7324 727 status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE);
mbed_official 124:6a4a5b7d7324 728 }
mbed_official 124:6a4a5b7d7324 729 #endif /* FLASH_WRP0_WRP0 */
bogdanm 0:9b334a45a8ff 730
mbed_official 124:6a4a5b7d7324 731 #if defined(FLASH_WRP1_WRP1)
mbed_official 124:6a4a5b7d7324 732 if((status == HAL_OK) && (WRP1_Data != 0xFF))
mbed_official 124:6a4a5b7d7324 733 {
mbed_official 124:6a4a5b7d7324 734 OB->WRP1 &= WRP1_Data;
mbed_official 124:6a4a5b7d7324 735
mbed_official 124:6a4a5b7d7324 736 /* Wait for last operation to be completed */
mbed_official 124:6a4a5b7d7324 737 status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE);
mbed_official 124:6a4a5b7d7324 738 }
mbed_official 124:6a4a5b7d7324 739 #endif /* FLASH_WRP1_WRP1 */
bogdanm 0:9b334a45a8ff 740
mbed_official 124:6a4a5b7d7324 741 #if defined(FLASH_WRP2_WRP2)
mbed_official 124:6a4a5b7d7324 742 if((status == HAL_OK) && (WRP2_Data != 0xFF))
mbed_official 124:6a4a5b7d7324 743 {
mbed_official 124:6a4a5b7d7324 744 OB->WRP2 &= WRP2_Data;
mbed_official 124:6a4a5b7d7324 745
mbed_official 124:6a4a5b7d7324 746 /* Wait for last operation to be completed */
mbed_official 124:6a4a5b7d7324 747 status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE);
mbed_official 124:6a4a5b7d7324 748 }
mbed_official 124:6a4a5b7d7324 749 #endif /* FLASH_WRP2_WRP2 */
mbed_official 124:6a4a5b7d7324 750
mbed_official 124:6a4a5b7d7324 751 #if defined(FLASH_WRP3_WRP3)
mbed_official 124:6a4a5b7d7324 752 if((status == HAL_OK) && (WRP3_Data != 0xFF))
mbed_official 124:6a4a5b7d7324 753 {
mbed_official 124:6a4a5b7d7324 754 OB->WRP3 &= WRP3_Data;
mbed_official 124:6a4a5b7d7324 755
mbed_official 124:6a4a5b7d7324 756 /* Wait for last operation to be completed */
mbed_official 124:6a4a5b7d7324 757 status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE);
mbed_official 124:6a4a5b7d7324 758 }
mbed_official 124:6a4a5b7d7324 759 #endif /* FLASH_WRP3_WRP3 */
mbed_official 124:6a4a5b7d7324 760
mbed_official 124:6a4a5b7d7324 761 /* if the program operation is completed, disable the OPTPG Bit */
mbed_official 124:6a4a5b7d7324 762 CLEAR_BIT(FLASH->CR, FLASH_CR_OPTPG);
bogdanm 0:9b334a45a8ff 763 }
bogdanm 0:9b334a45a8ff 764 }
bogdanm 0:9b334a45a8ff 765
bogdanm 0:9b334a45a8ff 766 return status;
bogdanm 0:9b334a45a8ff 767 }
bogdanm 0:9b334a45a8ff 768
bogdanm 0:9b334a45a8ff 769 /**
bogdanm 0:9b334a45a8ff 770 * @brief Disable the write protection of the desired pages
mbed_official 124:6a4a5b7d7324 771 * @note An option byte erase is done automatically in this function.
bogdanm 0:9b334a45a8ff 772 * @note When the memory read protection level is selected (RDP level = 1),
mbed_official 124:6a4a5b7d7324 773 * it is not possible to program or erase the flash page i if
bogdanm 0:9b334a45a8ff 774 * debug features are connected or boot code is executed in RAM, even if nWRPi = 1
bogdanm 0:9b334a45a8ff 775 *
mbed_official 124:6a4a5b7d7324 776 * @param WriteProtectPage specifies the page(s) to be write unprotected.
bogdanm 0:9b334a45a8ff 777 * The value of this parameter depend on device used within the same series
bogdanm 0:9b334a45a8ff 778 * @retval HAL status
bogdanm 0:9b334a45a8ff 779 */
bogdanm 0:9b334a45a8ff 780 static HAL_StatusTypeDef FLASH_OB_DisableWRP(uint32_t WriteProtectPage)
bogdanm 0:9b334a45a8ff 781 {
bogdanm 0:9b334a45a8ff 782 HAL_StatusTypeDef status = HAL_OK;
bogdanm 0:9b334a45a8ff 783 uint16_t WRP0_Data = 0xFFFF;
mbed_official 124:6a4a5b7d7324 784 #if defined(FLASH_WRP1_WRP1)
mbed_official 124:6a4a5b7d7324 785 uint16_t WRP1_Data = 0xFFFF;
mbed_official 124:6a4a5b7d7324 786 #endif /* FLASH_WRP1_WRP1 */
mbed_official 124:6a4a5b7d7324 787 #if defined(FLASH_WRP2_WRP2)
mbed_official 124:6a4a5b7d7324 788 uint16_t WRP2_Data = 0xFFFF;
mbed_official 124:6a4a5b7d7324 789 #endif /* FLASH_WRP2_WRP2 */
mbed_official 124:6a4a5b7d7324 790 #if defined(FLASH_WRP3_WRP3)
mbed_official 124:6a4a5b7d7324 791 uint16_t WRP3_Data = 0xFFFF;
mbed_official 124:6a4a5b7d7324 792 #endif /* FLASH_WRP3_WRP3 */
bogdanm 0:9b334a45a8ff 793
bogdanm 0:9b334a45a8ff 794 /* Check the parameters */
bogdanm 0:9b334a45a8ff 795 assert_param(IS_OB_WRP(WriteProtectPage));
bogdanm 0:9b334a45a8ff 796
mbed_official 124:6a4a5b7d7324 797 /* Get current write protected pages and the new pages to be unprotected ******/
mbed_official 124:6a4a5b7d7324 798 WriteProtectPage = (FLASH_OB_GetWRP() | WriteProtectPage);
mbed_official 124:6a4a5b7d7324 799
mbed_official 124:6a4a5b7d7324 800 #if defined(OB_WRP_PAGES0TO15MASK)
mbed_official 124:6a4a5b7d7324 801 WRP0_Data = (uint16_t)(WriteProtectPage & OB_WRP_PAGES0TO15MASK);
mbed_official 124:6a4a5b7d7324 802 #elif defined(OB_WRP_PAGES0TO31MASK)
bogdanm 0:9b334a45a8ff 803 WRP0_Data = (uint16_t)(WriteProtectPage & OB_WRP_PAGES0TO31MASK);
mbed_official 124:6a4a5b7d7324 804 #endif /* OB_WRP_PAGES0TO31MASK */
bogdanm 0:9b334a45a8ff 805
mbed_official 124:6a4a5b7d7324 806 #if defined(OB_WRP_PAGES16TO31MASK)
bogdanm 0:9b334a45a8ff 807 WRP1_Data = (uint16_t)((WriteProtectPage & OB_WRP_PAGES16TO31MASK) >> 8);
mbed_official 124:6a4a5b7d7324 808 #elif defined(OB_WRP_PAGES32TO63MASK)
mbed_official 124:6a4a5b7d7324 809 WRP1_Data = (uint16_t)((WriteProtectPage & OB_WRP_PAGES32TO63MASK) >> 8);
mbed_official 124:6a4a5b7d7324 810 #endif /* OB_WRP_PAGES32TO63MASK */
mbed_official 124:6a4a5b7d7324 811
mbed_official 124:6a4a5b7d7324 812 #if defined(OB_WRP_PAGES64TO95MASK)
mbed_official 124:6a4a5b7d7324 813 WRP2_Data = (uint16_t)((WriteProtectPage & OB_WRP_PAGES64TO95MASK) >> 16);
mbed_official 124:6a4a5b7d7324 814 #endif /* OB_WRP_PAGES64TO95MASK */
mbed_official 124:6a4a5b7d7324 815 #if defined(OB_WRP_PAGES32TO47MASK)
bogdanm 0:9b334a45a8ff 816 WRP2_Data = (uint16_t)((WriteProtectPage & OB_WRP_PAGES32TO47MASK) >> 16);
mbed_official 124:6a4a5b7d7324 817 #endif /* OB_WRP_PAGES32TO47MASK */
bogdanm 0:9b334a45a8ff 818
mbed_official 124:6a4a5b7d7324 819 #if defined(OB_WRP_PAGES96TO127MASK)
mbed_official 124:6a4a5b7d7324 820 WRP3_Data = (uint16_t)((WriteProtectPage & OB_WRP_PAGES96TO127MASK) >> 24);
mbed_official 124:6a4a5b7d7324 821 #elif defined(OB_WRP_PAGES48TO255MASK)
mbed_official 124:6a4a5b7d7324 822 WRP3_Data = (uint16_t)((WriteProtectPage & OB_WRP_PAGES48TO255MASK) >> 24);
mbed_official 124:6a4a5b7d7324 823 #elif defined(OB_WRP_PAGES48TO511MASK)
bogdanm 0:9b334a45a8ff 824 WRP3_Data = (uint16_t)((WriteProtectPage & OB_WRP_PAGES48TO511MASK) >> 24);
mbed_official 124:6a4a5b7d7324 825 #elif defined(OB_WRP_PAGES48TO127MASK)
bogdanm 0:9b334a45a8ff 826 WRP3_Data = (uint16_t)((WriteProtectPage & OB_WRP_PAGES48TO127MASK) >> 24);
mbed_official 124:6a4a5b7d7324 827 #endif /* OB_WRP_PAGES96TO127MASK */
mbed_official 124:6a4a5b7d7324 828
bogdanm 0:9b334a45a8ff 829
bogdanm 0:9b334a45a8ff 830 /* Wait for last operation to be completed */
bogdanm 0:9b334a45a8ff 831 status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE);
bogdanm 0:9b334a45a8ff 832
bogdanm 0:9b334a45a8ff 833 if(status == HAL_OK)
bogdanm 0:9b334a45a8ff 834 {
bogdanm 0:9b334a45a8ff 835 /* Clean the error context */
bogdanm 0:9b334a45a8ff 836 pFlash.ErrorCode = HAL_FLASH_ERROR_NONE;
bogdanm 0:9b334a45a8ff 837
mbed_official 124:6a4a5b7d7324 838 /* To be able to write again option byte, need to perform a option byte erase */
mbed_official 124:6a4a5b7d7324 839 status = HAL_FLASHEx_OBErase();
mbed_official 124:6a4a5b7d7324 840 if (status == HAL_OK)
bogdanm 0:9b334a45a8ff 841 {
mbed_official 124:6a4a5b7d7324 842 SET_BIT(FLASH->CR, FLASH_CR_OPTPG);
mbed_official 124:6a4a5b7d7324 843
mbed_official 124:6a4a5b7d7324 844 #if defined(FLASH_WRP0_WRP0)
mbed_official 124:6a4a5b7d7324 845 if(WRP0_Data != 0xFF)
mbed_official 124:6a4a5b7d7324 846 {
mbed_official 124:6a4a5b7d7324 847 OB->WRP0 |= WRP0_Data;
mbed_official 124:6a4a5b7d7324 848
mbed_official 124:6a4a5b7d7324 849 /* Wait for last operation to be completed */
mbed_official 124:6a4a5b7d7324 850 status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE);
mbed_official 124:6a4a5b7d7324 851 }
mbed_official 124:6a4a5b7d7324 852 #endif /* FLASH_WRP0_WRP0 */
bogdanm 0:9b334a45a8ff 853
mbed_official 124:6a4a5b7d7324 854 #if defined(FLASH_WRP1_WRP1)
mbed_official 124:6a4a5b7d7324 855 if((status == HAL_OK) && (WRP1_Data != 0xFF))
mbed_official 124:6a4a5b7d7324 856 {
mbed_official 124:6a4a5b7d7324 857 OB->WRP1 |= WRP1_Data;
mbed_official 124:6a4a5b7d7324 858
mbed_official 124:6a4a5b7d7324 859 /* Wait for last operation to be completed */
mbed_official 124:6a4a5b7d7324 860 status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE);
mbed_official 124:6a4a5b7d7324 861 }
mbed_official 124:6a4a5b7d7324 862 #endif /* FLASH_WRP1_WRP1 */
bogdanm 0:9b334a45a8ff 863
mbed_official 124:6a4a5b7d7324 864 #if defined(FLASH_WRP2_WRP2)
mbed_official 124:6a4a5b7d7324 865 if((status == HAL_OK) && (WRP2_Data != 0xFF))
mbed_official 124:6a4a5b7d7324 866 {
mbed_official 124:6a4a5b7d7324 867 OB->WRP2 |= WRP2_Data;
mbed_official 124:6a4a5b7d7324 868
mbed_official 124:6a4a5b7d7324 869 /* Wait for last operation to be completed */
mbed_official 124:6a4a5b7d7324 870 status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE);
mbed_official 124:6a4a5b7d7324 871 }
mbed_official 124:6a4a5b7d7324 872 #endif /* FLASH_WRP2_WRP2 */
mbed_official 124:6a4a5b7d7324 873
mbed_official 124:6a4a5b7d7324 874 #if defined(FLASH_WRP3_WRP3)
mbed_official 124:6a4a5b7d7324 875 if((status == HAL_OK) && (WRP3_Data != 0xFF))
mbed_official 124:6a4a5b7d7324 876 {
mbed_official 124:6a4a5b7d7324 877 OB->WRP3 |= WRP3_Data;
mbed_official 124:6a4a5b7d7324 878
mbed_official 124:6a4a5b7d7324 879 /* Wait for last operation to be completed */
mbed_official 124:6a4a5b7d7324 880 status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE);
mbed_official 124:6a4a5b7d7324 881 }
mbed_official 124:6a4a5b7d7324 882 #endif /* FLASH_WRP3_WRP3 */
mbed_official 124:6a4a5b7d7324 883
mbed_official 124:6a4a5b7d7324 884 /* if the program operation is completed, disable the OPTPG Bit */
mbed_official 124:6a4a5b7d7324 885 CLEAR_BIT(FLASH->CR, FLASH_CR_OPTPG);
bogdanm 0:9b334a45a8ff 886 }
bogdanm 0:9b334a45a8ff 887 }
bogdanm 0:9b334a45a8ff 888 return status;
bogdanm 0:9b334a45a8ff 889 }
bogdanm 0:9b334a45a8ff 890
bogdanm 0:9b334a45a8ff 891 /**
bogdanm 0:9b334a45a8ff 892 * @brief Set the read protection level.
mbed_official 124:6a4a5b7d7324 893 * @param ReadProtectLevel specifies the read protection level.
bogdanm 0:9b334a45a8ff 894 * This parameter can be one of the following values:
mbed_official 124:6a4a5b7d7324 895 * @arg @ref OB_RDP_LEVEL_0 No protection
mbed_official 124:6a4a5b7d7324 896 * @arg @ref OB_RDP_LEVEL_1 Read protection of the memory
bogdanm 0:9b334a45a8ff 897 * @retval HAL status
bogdanm 0:9b334a45a8ff 898 */
bogdanm 0:9b334a45a8ff 899 static HAL_StatusTypeDef FLASH_OB_RDP_LevelConfig(uint8_t ReadProtectLevel)
bogdanm 0:9b334a45a8ff 900 {
bogdanm 0:9b334a45a8ff 901 HAL_StatusTypeDef status = HAL_OK;
bogdanm 0:9b334a45a8ff 902
bogdanm 0:9b334a45a8ff 903 /* Check the parameters */
bogdanm 0:9b334a45a8ff 904 assert_param(IS_OB_RDP_LEVEL(ReadProtectLevel));
bogdanm 0:9b334a45a8ff 905
bogdanm 0:9b334a45a8ff 906 /* Wait for last operation to be completed */
bogdanm 0:9b334a45a8ff 907 status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE);
bogdanm 0:9b334a45a8ff 908
bogdanm 0:9b334a45a8ff 909 if(status == HAL_OK)
bogdanm 0:9b334a45a8ff 910 {
bogdanm 0:9b334a45a8ff 911 /* Clean the error context */
bogdanm 0:9b334a45a8ff 912 pFlash.ErrorCode = HAL_FLASH_ERROR_NONE;
bogdanm 0:9b334a45a8ff 913
mbed_official 124:6a4a5b7d7324 914 /* If the previous operation is completed, proceed to erase the option bytes */
mbed_official 124:6a4a5b7d7324 915 SET_BIT(FLASH->CR, FLASH_CR_OPTER);
mbed_official 124:6a4a5b7d7324 916 SET_BIT(FLASH->CR, FLASH_CR_STRT);
mbed_official 124:6a4a5b7d7324 917
bogdanm 0:9b334a45a8ff 918 /* Wait for last operation to be completed */
mbed_official 124:6a4a5b7d7324 919 status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE);
mbed_official 124:6a4a5b7d7324 920
mbed_official 124:6a4a5b7d7324 921 /* If the erase operation is completed, disable the OPTER Bit */
mbed_official 124:6a4a5b7d7324 922 CLEAR_BIT(FLASH->CR, FLASH_CR_OPTER);
mbed_official 124:6a4a5b7d7324 923
mbed_official 124:6a4a5b7d7324 924 if(status == HAL_OK)
mbed_official 124:6a4a5b7d7324 925 {
mbed_official 124:6a4a5b7d7324 926 /* Enable the Option Bytes Programming operation */
mbed_official 124:6a4a5b7d7324 927 SET_BIT(FLASH->CR, FLASH_CR_OPTPG);
mbed_official 124:6a4a5b7d7324 928
mbed_official 124:6a4a5b7d7324 929 WRITE_REG(OB->RDP, ReadProtectLevel);
mbed_official 124:6a4a5b7d7324 930
mbed_official 124:6a4a5b7d7324 931 /* Wait for last operation to be completed */
mbed_official 124:6a4a5b7d7324 932 status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE);
mbed_official 124:6a4a5b7d7324 933
mbed_official 124:6a4a5b7d7324 934 /* if the program operation is completed, disable the OPTPG Bit */
mbed_official 124:6a4a5b7d7324 935 CLEAR_BIT(FLASH->CR, FLASH_CR_OPTPG);
mbed_official 124:6a4a5b7d7324 936 }
bogdanm 0:9b334a45a8ff 937 }
bogdanm 0:9b334a45a8ff 938
bogdanm 0:9b334a45a8ff 939 return status;
bogdanm 0:9b334a45a8ff 940 }
bogdanm 0:9b334a45a8ff 941
bogdanm 0:9b334a45a8ff 942 /**
bogdanm 0:9b334a45a8ff 943 * @brief Program the FLASH User Option Byte.
bogdanm 0:9b334a45a8ff 944 * @note Programming of the OB should be performed only after an erase (otherwise PGERR occurs)
mbed_official 124:6a4a5b7d7324 945 * @param UserConfig The FLASH User Option Bytes values FLASH_OBR_IWDG_SW(Bit2),
bogdanm 0:9b334a45a8ff 946 * FLASH_OBR_nRST_STOP(Bit3),FLASH_OBR_nRST_STDBY(Bit4).
bogdanm 0:9b334a45a8ff 947 * And BFBF2(Bit5) for STM32F101xG and STM32F103xG .
bogdanm 0:9b334a45a8ff 948 * @retval HAL status
bogdanm 0:9b334a45a8ff 949 */
bogdanm 0:9b334a45a8ff 950 static HAL_StatusTypeDef FLASH_OB_UserConfig(uint8_t UserConfig)
bogdanm 0:9b334a45a8ff 951 {
bogdanm 0:9b334a45a8ff 952 HAL_StatusTypeDef status = HAL_OK;
bogdanm 0:9b334a45a8ff 953
bogdanm 0:9b334a45a8ff 954 /* Check the parameters */
bogdanm 0:9b334a45a8ff 955 assert_param(IS_OB_IWDG_SOURCE((UserConfig&OB_IWDG_SW)));
bogdanm 0:9b334a45a8ff 956 assert_param(IS_OB_STOP_SOURCE((UserConfig&OB_STOP_NO_RST)));
bogdanm 0:9b334a45a8ff 957 assert_param(IS_OB_STDBY_SOURCE((UserConfig&OB_STDBY_NO_RST)));
mbed_official 124:6a4a5b7d7324 958 #if defined(FLASH_BANK2_END)
bogdanm 0:9b334a45a8ff 959 assert_param(IS_OB_BOOT1((UserConfig&OB_BOOT1_SET)));
mbed_official 124:6a4a5b7d7324 960 #endif /* FLASH_BANK2_END */
bogdanm 0:9b334a45a8ff 961
bogdanm 0:9b334a45a8ff 962 /* Wait for last operation to be completed */
bogdanm 0:9b334a45a8ff 963 status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE);
bogdanm 0:9b334a45a8ff 964
bogdanm 0:9b334a45a8ff 965 if(status == HAL_OK)
bogdanm 0:9b334a45a8ff 966 {
bogdanm 0:9b334a45a8ff 967 /* Clean the error context */
bogdanm 0:9b334a45a8ff 968 pFlash.ErrorCode = HAL_FLASH_ERROR_NONE;
bogdanm 0:9b334a45a8ff 969
bogdanm 0:9b334a45a8ff 970 /* Enable the Option Bytes Programming operation */
bogdanm 0:9b334a45a8ff 971 SET_BIT(FLASH->CR, FLASH_CR_OPTPG);
bogdanm 0:9b334a45a8ff 972
mbed_official 124:6a4a5b7d7324 973 #if defined(FLASH_BANK2_END)
bogdanm 0:9b334a45a8ff 974 OB->USER = (UserConfig | 0xF0);
bogdanm 0:9b334a45a8ff 975 #else
mbed_official 124:6a4a5b7d7324 976 OB->USER = (UserConfig | 0x88);
mbed_official 124:6a4a5b7d7324 977 #endif /* FLASH_BANK2_END */
bogdanm 0:9b334a45a8ff 978
bogdanm 0:9b334a45a8ff 979 /* Wait for last operation to be completed */
bogdanm 0:9b334a45a8ff 980 status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE);
bogdanm 0:9b334a45a8ff 981
bogdanm 0:9b334a45a8ff 982 /* if the program operation is completed, disable the OPTPG Bit */
bogdanm 0:9b334a45a8ff 983 CLEAR_BIT(FLASH->CR, FLASH_CR_OPTPG);
bogdanm 0:9b334a45a8ff 984 }
bogdanm 0:9b334a45a8ff 985
bogdanm 0:9b334a45a8ff 986 return status;
bogdanm 0:9b334a45a8ff 987 }
bogdanm 0:9b334a45a8ff 988
bogdanm 0:9b334a45a8ff 989 /**
bogdanm 0:9b334a45a8ff 990 * @brief Programs a half word at a specified Option Byte Data address.
mbed_official 124:6a4a5b7d7324 991 * @note The function @ref HAL_FLASH_Unlock() should be called before to unlock the FLASH interface
mbed_official 124:6a4a5b7d7324 992 * The function @ref HAL_FLASH_OB_Unlock() should be called before to unlock the options bytes
mbed_official 124:6a4a5b7d7324 993 * The function @ref HAL_FLASH_OB_Launch() should be called after to force the reload of the options bytes
bogdanm 0:9b334a45a8ff 994 * (system reset will occur)
bogdanm 0:9b334a45a8ff 995 * Programming of the OB should be performed only after an erase (otherwise PGERR occurs)
mbed_official 124:6a4a5b7d7324 996 * @param Address specifies the address to be programmed.
bogdanm 0:9b334a45a8ff 997 * This parameter can be 0x1FFFF804 or 0x1FFFF806.
mbed_official 124:6a4a5b7d7324 998 * @param Data specifies the data to be programmed.
bogdanm 0:9b334a45a8ff 999 * @retval HAL status
bogdanm 0:9b334a45a8ff 1000 */
bogdanm 0:9b334a45a8ff 1001 static HAL_StatusTypeDef FLASH_OB_ProgramData(uint32_t Address, uint8_t Data)
bogdanm 0:9b334a45a8ff 1002 {
bogdanm 0:9b334a45a8ff 1003 HAL_StatusTypeDef status = HAL_ERROR;
bogdanm 0:9b334a45a8ff 1004
bogdanm 0:9b334a45a8ff 1005 /* Check the parameters */
bogdanm 0:9b334a45a8ff 1006 assert_param(IS_OB_DATA_ADDRESS(Address));
bogdanm 0:9b334a45a8ff 1007
bogdanm 0:9b334a45a8ff 1008 /* Wait for last operation to be completed */
bogdanm 0:9b334a45a8ff 1009 status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE);
bogdanm 0:9b334a45a8ff 1010
bogdanm 0:9b334a45a8ff 1011 if(status == HAL_OK)
bogdanm 0:9b334a45a8ff 1012 {
bogdanm 0:9b334a45a8ff 1013 /* Clean the error context */
bogdanm 0:9b334a45a8ff 1014 pFlash.ErrorCode = HAL_FLASH_ERROR_NONE;
bogdanm 0:9b334a45a8ff 1015
bogdanm 0:9b334a45a8ff 1016 /* Enables the Option Bytes Programming operation */
bogdanm 0:9b334a45a8ff 1017 SET_BIT(FLASH->CR, FLASH_CR_OPTPG);
bogdanm 0:9b334a45a8ff 1018 *(__IO uint16_t*)Address = Data;
bogdanm 0:9b334a45a8ff 1019
bogdanm 0:9b334a45a8ff 1020 /* Wait for last operation to be completed */
bogdanm 0:9b334a45a8ff 1021 status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE);
bogdanm 0:9b334a45a8ff 1022
bogdanm 0:9b334a45a8ff 1023 /* If the program operation is completed, disable the OPTPG Bit */
bogdanm 0:9b334a45a8ff 1024 CLEAR_BIT(FLASH->CR, FLASH_CR_OPTPG);
bogdanm 0:9b334a45a8ff 1025 }
bogdanm 0:9b334a45a8ff 1026 /* Return the Option Byte Data Program Status */
bogdanm 0:9b334a45a8ff 1027 return status;
bogdanm 0:9b334a45a8ff 1028 }
bogdanm 0:9b334a45a8ff 1029
bogdanm 0:9b334a45a8ff 1030 /**
bogdanm 0:9b334a45a8ff 1031 * @brief Return the FLASH Write Protection Option Bytes value.
bogdanm 0:9b334a45a8ff 1032 * @retval The FLASH Write Protection Option Bytes value
bogdanm 0:9b334a45a8ff 1033 */
bogdanm 0:9b334a45a8ff 1034 static uint32_t FLASH_OB_GetWRP(void)
bogdanm 0:9b334a45a8ff 1035 {
bogdanm 0:9b334a45a8ff 1036 /* Return the FLASH write protection Register value */
bogdanm 0:9b334a45a8ff 1037 return (uint32_t)(READ_REG(FLASH->WRPR));
bogdanm 0:9b334a45a8ff 1038 }
bogdanm 0:9b334a45a8ff 1039
bogdanm 0:9b334a45a8ff 1040 /**
bogdanm 0:9b334a45a8ff 1041 * @brief Returns the FLASH Read Protection level.
bogdanm 0:9b334a45a8ff 1042 * @retval FLASH ReadOut Protection Status:
mbed_official 124:6a4a5b7d7324 1043 * This parameter can be one of the following values:
mbed_official 124:6a4a5b7d7324 1044 * @arg @ref OB_RDP_LEVEL_0 No protection
mbed_official 124:6a4a5b7d7324 1045 * @arg @ref OB_RDP_LEVEL_1 Read protection of the memory
bogdanm 0:9b334a45a8ff 1046 */
mbed_official 124:6a4a5b7d7324 1047 static uint32_t FLASH_OB_GetRDP(void)
bogdanm 0:9b334a45a8ff 1048 {
mbed_official 124:6a4a5b7d7324 1049 uint32_t readstatus = OB_RDP_LEVEL_0;
mbed_official 124:6a4a5b7d7324 1050 uint32_t tmp_reg = 0;
mbed_official 124:6a4a5b7d7324 1051
mbed_official 124:6a4a5b7d7324 1052 /* Read RDP level bits */
mbed_official 124:6a4a5b7d7324 1053 tmp_reg = READ_BIT(FLASH->OBR, FLASH_OBR_RDPRT);
bogdanm 0:9b334a45a8ff 1054
mbed_official 124:6a4a5b7d7324 1055 if (tmp_reg == FLASH_OBR_RDPRT)
bogdanm 0:9b334a45a8ff 1056 {
mbed_official 124:6a4a5b7d7324 1057 readstatus = OB_RDP_LEVEL_1;
bogdanm 0:9b334a45a8ff 1058 }
mbed_official 124:6a4a5b7d7324 1059 else
bogdanm 0:9b334a45a8ff 1060 {
mbed_official 124:6a4a5b7d7324 1061 readstatus = OB_RDP_LEVEL_0;
bogdanm 0:9b334a45a8ff 1062 }
mbed_official 124:6a4a5b7d7324 1063
bogdanm 0:9b334a45a8ff 1064 return readstatus;
bogdanm 0:9b334a45a8ff 1065 }
bogdanm 0:9b334a45a8ff 1066
bogdanm 0:9b334a45a8ff 1067 /**
bogdanm 0:9b334a45a8ff 1068 * @brief Return the FLASH User Option Byte value.
bogdanm 0:9b334a45a8ff 1069 * @retval The FLASH User Option Bytes values: FLASH_OBR_IWDG_SW(Bit2),
bogdanm 0:9b334a45a8ff 1070 * FLASH_OBR_nRST_STOP(Bit3),FLASH_OBR_nRST_STDBY(Bit4).
bogdanm 0:9b334a45a8ff 1071 * And FLASH_OBR_BFB2(Bit5) for STM32F101xG and STM32F103xG .
bogdanm 0:9b334a45a8ff 1072 */
bogdanm 0:9b334a45a8ff 1073 static uint8_t FLASH_OB_GetUser(void)
bogdanm 0:9b334a45a8ff 1074 {
bogdanm 0:9b334a45a8ff 1075 /* Return the User Option Byte */
mbed_official 124:6a4a5b7d7324 1076 return (uint8_t)((READ_REG(FLASH->OBR) & FLASH_OBR_USER) >> FLASH_POSITION_IWDGSW_BIT);
bogdanm 0:9b334a45a8ff 1077 }
bogdanm 0:9b334a45a8ff 1078
bogdanm 0:9b334a45a8ff 1079 /**
bogdanm 0:9b334a45a8ff 1080 * @}
bogdanm 0:9b334a45a8ff 1081 */
bogdanm 0:9b334a45a8ff 1082
bogdanm 0:9b334a45a8ff 1083 /**
bogdanm 0:9b334a45a8ff 1084 * @}
bogdanm 0:9b334a45a8ff 1085 */
bogdanm 0:9b334a45a8ff 1086
bogdanm 0:9b334a45a8ff 1087 /** @addtogroup FLASH
bogdanm 0:9b334a45a8ff 1088 * @{
bogdanm 0:9b334a45a8ff 1089 */
bogdanm 0:9b334a45a8ff 1090
bogdanm 0:9b334a45a8ff 1091 /** @addtogroup FLASH_Private_Functions
bogdanm 0:9b334a45a8ff 1092 * @{
bogdanm 0:9b334a45a8ff 1093 */
bogdanm 0:9b334a45a8ff 1094
bogdanm 0:9b334a45a8ff 1095 /**
bogdanm 0:9b334a45a8ff 1096 * @brief Erase the specified FLASH memory page
mbed_official 124:6a4a5b7d7324 1097 * @param PageAddress FLASH page to erase
bogdanm 0:9b334a45a8ff 1098 * The value of this parameter depend on device used within the same series
bogdanm 0:9b334a45a8ff 1099 *
bogdanm 0:9b334a45a8ff 1100 * @retval None
bogdanm 0:9b334a45a8ff 1101 */
bogdanm 0:9b334a45a8ff 1102 void FLASH_PageErase(uint32_t PageAddress)
bogdanm 0:9b334a45a8ff 1103 {
bogdanm 0:9b334a45a8ff 1104 /* Clean the error context */
bogdanm 0:9b334a45a8ff 1105 pFlash.ErrorCode = HAL_FLASH_ERROR_NONE;
bogdanm 0:9b334a45a8ff 1106
mbed_official 124:6a4a5b7d7324 1107 #if defined(FLASH_BANK2_END)
bogdanm 0:9b334a45a8ff 1108 if(PageAddress > FLASH_BANK1_END)
bogdanm 0:9b334a45a8ff 1109 {
bogdanm 0:9b334a45a8ff 1110 /* Proceed to erase the page */
bogdanm 0:9b334a45a8ff 1111 SET_BIT(FLASH->CR2, FLASH_CR2_PER);
bogdanm 0:9b334a45a8ff 1112 WRITE_REG(FLASH->AR2, PageAddress);
bogdanm 0:9b334a45a8ff 1113 SET_BIT(FLASH->CR2, FLASH_CR2_STRT);
bogdanm 0:9b334a45a8ff 1114 }
bogdanm 0:9b334a45a8ff 1115 else
bogdanm 0:9b334a45a8ff 1116 {
mbed_official 124:6a4a5b7d7324 1117 #endif /* FLASH_BANK2_END */
bogdanm 0:9b334a45a8ff 1118 /* Proceed to erase the page */
bogdanm 0:9b334a45a8ff 1119 SET_BIT(FLASH->CR, FLASH_CR_PER);
bogdanm 0:9b334a45a8ff 1120 WRITE_REG(FLASH->AR, PageAddress);
bogdanm 0:9b334a45a8ff 1121 SET_BIT(FLASH->CR, FLASH_CR_STRT);
mbed_official 124:6a4a5b7d7324 1122 #if defined(FLASH_BANK2_END)
bogdanm 0:9b334a45a8ff 1123 }
mbed_official 124:6a4a5b7d7324 1124 #endif /* FLASH_BANK2_END */
bogdanm 0:9b334a45a8ff 1125 }
bogdanm 0:9b334a45a8ff 1126
bogdanm 0:9b334a45a8ff 1127 /**
bogdanm 0:9b334a45a8ff 1128 * @}
bogdanm 0:9b334a45a8ff 1129 */
bogdanm 0:9b334a45a8ff 1130
bogdanm 0:9b334a45a8ff 1131 /**
bogdanm 0:9b334a45a8ff 1132 * @}
bogdanm 0:9b334a45a8ff 1133 */
bogdanm 0:9b334a45a8ff 1134
bogdanm 0:9b334a45a8ff 1135 #endif /* HAL_FLASH_MODULE_ENABLED */
bogdanm 0:9b334a45a8ff 1136 /**
bogdanm 0:9b334a45a8ff 1137 * @}
bogdanm 0:9b334a45a8ff 1138 */
bogdanm 0:9b334a45a8ff 1139
bogdanm 0:9b334a45a8ff 1140 /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/