stm32f4xx_hal_flash_ex.c 51.6 KB
Newer Older
Dave Hylands's avatar
Dave Hylands committed
1
2
3
4
/**
  ******************************************************************************
  * @file    stm32f4xx_hal_flash_ex.c
  * @author  MCD Application Team
5
6
  * @version V1.5.1
  * @date    01-July-2016
Dave Hylands's avatar
Dave Hylands committed
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
  * @brief   Extended FLASH HAL module driver.
  *          This file provides firmware functions to manage the following 
  *          functionalities of the FLASH extension peripheral:
  *           + Extended programming operations functions
  *  
  @verbatim
  ==============================================================================
                   ##### Flash Extension features #####
  ==============================================================================
           
  [..] Comparing to other previous devices, the FLASH interface for STM32F427xx/437xx and 
       STM32F429xx/439xx devices contains the following additional features 
       
       (+) Capacity up to 2 Mbyte with dual bank architecture supporting read-while-write
           capability (RWW)
       (+) Dual bank memory organization       
       (+) PCROP protection for all banks
   
                      ##### How to use this driver #####
  ==============================================================================
  [..] This driver provides functions to configure and program the FLASH memory 
28
29
       of all STM32F427xx/437xx, STM32F429xx/439xx, STM32F469xx/479xx and STM32F446xx 
       devices. It includes
Dave Hylands's avatar
Dave Hylands committed
30
31
32
33
      (#) FLASH Memory Erase functions: 
           (++) Lock and Unlock the FLASH interface using HAL_FLASH_Unlock() and 
                HAL_FLASH_Lock() functions
           (++) Erase function: Erase sector, erase all sectors
34
           (++) There are two modes of erase :
Dave Hylands's avatar
Dave Hylands committed
35
36
37
38
39
40
41
42
43
44
45
             (+++) Polling Mode using HAL_FLASHEx_Erase()
             (+++) Interrupt Mode using HAL_FLASHEx_Erase_IT()
             
      (#) Option Bytes Programming functions: Use HAL_FLASHEx_OBProgram() to :
           (++) Set/Reset the write protection
           (++) Set the Read protection Level
           (++) Set the BOR level
           (++) Program the user Option Bytes
      (#) Advanced Option Bytes Programming functions: Use HAL_FLASHEx_AdvOBProgram() to :  
       (++) Extended space (bank 2) erase function
       (++) Full FLASH space (2 Mo) erase (bank 1 and bank 2)
46
       (++) Dual Boot activation
Dave Hylands's avatar
Dave Hylands committed
47
48
49
50
51
52
53
       (++) Write protection configuration for bank 2
       (++) PCROP protection configuration and control for both banks
  
  @endverbatim
  ******************************************************************************
  * @attention
  *
54
  * <h2><center>&copy; COPYRIGHT(c) 2016 STMicroelectronics</center></h2>
Dave Hylands's avatar
Dave Hylands committed
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
  *
  * Redistribution and use in source and binary forms, with or without modification,
  * are permitted provided that the following conditions are met:
  *   1. Redistributions of source code must retain the above copyright notice,
  *      this list of conditions and the following disclaimer.
  *   2. Redistributions in binary form must reproduce the above copyright notice,
  *      this list of conditions and the following disclaimer in the documentation
  *      and/or other materials provided with the distribution.
  *   3. Neither the name of STMicroelectronics nor the names of its contributors
  *      may be used to endorse or promote products derived from this software
  *      without specific prior written permission.
  *
  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
  * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
  * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
  * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  *
  ******************************************************************************
  */ 

/* Includes ------------------------------------------------------------------*/
#include "stm32f4xx_hal.h"

/** @addtogroup STM32F4xx_HAL_Driver
  * @{
  */

88
/** @defgroup FLASHEx FLASHEx
Dave Hylands's avatar
Dave Hylands committed
89
90
91
92
93
94
95
96
  * @brief FLASH HAL Extension module driver
  * @{
  */

#ifdef HAL_FLASH_MODULE_ENABLED

/* Private typedef -----------------------------------------------------------*/
/* Private define ------------------------------------------------------------*/
97
98
99
100
101
102
103
104
/** @addtogroup FLASHEx_Private_Constants
  * @{
  */    
#define FLASH_TIMEOUT_VALUE       ((uint32_t)50000U)/* 50 s */
/**
  * @}
  */
    
Dave Hylands's avatar
Dave Hylands committed
105
106
/* Private macro -------------------------------------------------------------*/
/* Private variables ---------------------------------------------------------*/
107
108
109
/** @addtogroup FLASHEx_Private_Variables
  * @{
  */    
Dave Hylands's avatar
Dave Hylands committed
110
extern FLASH_ProcessTypeDef pFlash;
111
112
113
/**
  * @}
  */
Dave Hylands's avatar
Dave Hylands committed
114
115

/* Private function prototypes -----------------------------------------------*/
116
117
118
/** @addtogroup FLASHEx_Private_Functions
  * @{
  */
Dave Hylands's avatar
Dave Hylands committed
119
120
121
122
123
124
125
126
127
/* Option bytes control */
static void               FLASH_MassErase(uint8_t VoltageRange, uint32_t Banks);
static HAL_StatusTypeDef  FLASH_OB_EnableWRP(uint32_t WRPSector, uint32_t Banks);
static HAL_StatusTypeDef  FLASH_OB_DisableWRP(uint32_t WRPSector, uint32_t Banks);
static HAL_StatusTypeDef  FLASH_OB_RDP_LevelConfig(uint8_t Level);
static HAL_StatusTypeDef  FLASH_OB_UserConfig(uint8_t Iwdg, uint8_t Stop, uint8_t Stdby);
static HAL_StatusTypeDef  FLASH_OB_BOR_LevelConfig(uint8_t Level);
static uint8_t            FLASH_OB_GetUser(void);
static uint16_t           FLASH_OB_GetWRP(void);
128
static uint8_t            FLASH_OB_GetRDP(void);
Dave Hylands's avatar
Dave Hylands committed
129
130
static uint8_t            FLASH_OB_GetBOR(void);

131
132
#if defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) || defined(STM32F411xE) ||\
    defined(STM32F446xx) || defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F412Cx)
Dave Hylands's avatar
Dave Hylands committed
133
134
static HAL_StatusTypeDef  FLASH_OB_EnablePCROP(uint32_t Sector);
static HAL_StatusTypeDef  FLASH_OB_DisablePCROP(uint32_t Sector);
135
#endif /* STM32F401xC || STM32F401xE || STM32F410xx || STM32F411xE || STM32F446xx || STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx */
Dave Hylands's avatar
Dave Hylands committed
136

137
#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx)|| defined(STM32F439xx) || defined(STM32F469xx) || defined(STM32F479xx) 
Dave Hylands's avatar
Dave Hylands committed
138
139
static HAL_StatusTypeDef FLASH_OB_EnablePCROP(uint32_t SectorBank1, uint32_t SectorBank2, uint32_t Banks);
static HAL_StatusTypeDef FLASH_OB_DisablePCROP(uint32_t SectorBank1, uint32_t SectorBank2, uint32_t Banks);
140
141
static HAL_StatusTypeDef FLASH_OB_BootConfig(uint8_t BootConfig);
#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F469xx || STM32F479xx */
Dave Hylands's avatar
Dave Hylands committed
142
143

extern HAL_StatusTypeDef         FLASH_WaitForLastOperation(uint32_t Timeout);
144
145
146
/**
  * @}
  */
Dave Hylands's avatar
Dave Hylands committed
147

148
149
/* Exported functions --------------------------------------------------------*/
/** @defgroup FLASHEx_Exported_Functions FLASHEx Exported Functions
Dave Hylands's avatar
Dave Hylands committed
150
151
152
  * @{
  */

153
/** @defgroup FLASHEx_Exported_Functions_Group1 Extended IO operation functions
Dave Hylands's avatar
Dave Hylands committed
154
155
156
157
158
159
160
161
 *  @brief   Extended IO operation functions 
 *
@verbatim   
 ===============================================================================
                ##### Extended programming operation functions #####
 ===============================================================================  
    [..]
    This subsection provides a set of functions allowing to manage the Extension FLASH 
162
    programming operations.
Dave Hylands's avatar
Dave Hylands committed
163
164
165
166
167
168
169
170
171
172
173

@endverbatim
  * @{
  */
/**
  * @brief  Perform a mass erase or erase the specified FLASH memory sectors 
  * @param[in]  pEraseInit: pointer to an FLASH_EraseInitTypeDef structure that
  *         contains the configuration information for the erasing.
  * 
  * @param[out]  SectorError: pointer to variable  that
  *         contains the configuration information on faulty sector in case of error 
174
  *         (0xFFFFFFFFU means that all the sectors have been correctly erased)
Dave Hylands's avatar
Dave Hylands committed
175
  * 
176
  * @retval HAL Status
Dave Hylands's avatar
Dave Hylands committed
177
178
179
180
  */
HAL_StatusTypeDef HAL_FLASHEx_Erase(FLASH_EraseInitTypeDef *pEraseInit, uint32_t *SectorError)
{
  HAL_StatusTypeDef status = HAL_ERROR;
181
  uint32_t index = 0U;
Dave Hylands's avatar
Dave Hylands committed
182
183
184
185
186
  
  /* Process Locked */
  __HAL_LOCK(&pFlash);

  /* Check the parameters */
187
  assert_param(IS_FLASH_TYPEERASE(pEraseInit->TypeErase));
Dave Hylands's avatar
Dave Hylands committed
188
189

  /* Wait for last operation to be completed */
190
  status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE);
Dave Hylands's avatar
Dave Hylands committed
191

192
  if(status == HAL_OK)
Dave Hylands's avatar
Dave Hylands committed
193
194
  {
    /*Initialization of SectorError variable*/
195
    *SectorError = 0xFFFFFFFFU;
Dave Hylands's avatar
Dave Hylands committed
196
    
197
    if(pEraseInit->TypeErase == FLASH_TYPEERASE_MASSERASE)
Dave Hylands's avatar
Dave Hylands committed
198
199
200
201
202
    {
      /*Mass erase to be done*/
      FLASH_MassErase((uint8_t) pEraseInit->VoltageRange, pEraseInit->Banks);

      /* Wait for last operation to be completed */
203
      status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE);
Dave Hylands's avatar
Dave Hylands committed
204
205
206
207
208
209
210
      
      /* if the erase operation is completed, disable the MER Bit */
      FLASH->CR &= (~FLASH_MER_BIT);
    }
    else
    {
      /* Check the parameters */
211
      assert_param(IS_FLASH_NBSECTORS(pEraseInit->NbSectors + pEraseInit->Sector));
Dave Hylands's avatar
Dave Hylands committed
212
213
214
215
216
217
218

      /* Erase by sector by sector to be done*/
      for(index = pEraseInit->Sector; index < (pEraseInit->NbSectors + pEraseInit->Sector); index++)
      {
        FLASH_Erase_Sector(index, (uint8_t) pEraseInit->VoltageRange);

        /* Wait for last operation to be completed */
219
        status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE);
Dave Hylands's avatar
Dave Hylands committed
220
        
221
222
        /* If the erase operation is completed, disable the SER and SNB Bits */
        CLEAR_BIT(FLASH->CR, (FLASH_CR_SER | FLASH_CR_SNB));
Dave Hylands's avatar
Dave Hylands committed
223

224
        if(status != HAL_OK) 
Dave Hylands's avatar
Dave Hylands committed
225
226
227
228
229
230
231
        {
          /* In case of error, stop erase procedure and return the faulty sector*/
          *SectorError = index;
          break;
        }
      }
    }
232
233
    /* Flush the caches to be sure of the data consistency */
    FLASH_FlushCaches();    
Dave Hylands's avatar
Dave Hylands committed
234
235
236
237
238
239
240
241
242
243
244
245
246
  }

  /* Process Unlocked */
  __HAL_UNLOCK(&pFlash);

  return status;
}

/**
  * @brief  Perform a mass erase or erase the specified FLASH memory sectors  with interrupt enabled
  * @param  pEraseInit: pointer to an FLASH_EraseInitTypeDef structure that
  *         contains the configuration information for the erasing.
  * 
247
  * @retval HAL Status
Dave Hylands's avatar
Dave Hylands committed
248
249
250
251
252
253
254
255
256
  */
HAL_StatusTypeDef HAL_FLASHEx_Erase_IT(FLASH_EraseInitTypeDef *pEraseInit)
{
  HAL_StatusTypeDef status = HAL_OK;

  /* Process Locked */
  __HAL_LOCK(&pFlash);

  /* Check the parameters */
257
  assert_param(IS_FLASH_TYPEERASE(pEraseInit->TypeErase));
Dave Hylands's avatar
Dave Hylands committed
258
259
260
261
262
263
264
265
266
267
268

  /* Enable End of FLASH Operation interrupt */
  __HAL_FLASH_ENABLE_IT(FLASH_IT_EOP);
  
  /* Enable Error source interrupt */
  __HAL_FLASH_ENABLE_IT(FLASH_IT_ERR);
  
  /* Clear pending flags (if any) */  
  __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_EOP    | FLASH_FLAG_OPERR | FLASH_FLAG_WRPERR |\
                         FLASH_FLAG_PGAERR | FLASH_FLAG_PGPERR| FLASH_FLAG_PGSERR);  
  
269
  if(pEraseInit->TypeErase == FLASH_TYPEERASE_MASSERASE)
Dave Hylands's avatar
Dave Hylands committed
270
271
272
273
274
275
276
277
278
279
280
  {
    /*Mass erase to be done*/
    pFlash.ProcedureOnGoing = FLASH_PROC_MASSERASE;
    pFlash.Bank = pEraseInit->Banks;
    FLASH_MassErase((uint8_t) pEraseInit->VoltageRange, pEraseInit->Banks);
  }
  else
  {
    /* Erase by sector to be done*/

    /* Check the parameters */
281
    assert_param(IS_FLASH_NBSECTORS(pEraseInit->NbSectors + pEraseInit->Sector));
Dave Hylands's avatar
Dave Hylands committed
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299

    pFlash.ProcedureOnGoing = FLASH_PROC_SECTERASE;
    pFlash.NbSectorsToErase = pEraseInit->NbSectors;
    pFlash.Sector = pEraseInit->Sector;
    pFlash.VoltageForErase = (uint8_t)pEraseInit->VoltageRange;

    /*Erase 1st sector and wait for IT*/
    FLASH_Erase_Sector(pEraseInit->Sector, pEraseInit->VoltageRange);
  }

  return status;
}

/**
  * @brief   Program option bytes
  * @param  pOBInit: pointer to an FLASH_OBInitStruct structure that
  *         contains the configuration information for the programming.
  * 
300
  * @retval HAL Status
Dave Hylands's avatar
Dave Hylands committed
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
  */
HAL_StatusTypeDef HAL_FLASHEx_OBProgram(FLASH_OBProgramInitTypeDef *pOBInit)
{
  HAL_StatusTypeDef status = HAL_ERROR;
  
  /* Process Locked */
  __HAL_LOCK(&pFlash);

  /* Check the parameters */
  assert_param(IS_OPTIONBYTE(pOBInit->OptionType));

  /*Write protection configuration*/
  if((pOBInit->OptionType & OPTIONBYTE_WRP) == OPTIONBYTE_WRP)
  {
    assert_param(IS_WRPSTATE(pOBInit->WRPState));
316
    if(pOBInit->WRPState == OB_WRPSTATE_ENABLE)
Dave Hylands's avatar
Dave Hylands committed
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
    {
      /*Enable of Write protection on the selected Sector*/
      status = FLASH_OB_EnableWRP(pOBInit->WRPSector, pOBInit->Banks);
    }
    else
    {
      /*Disable of Write protection on the selected Sector*/
      status = FLASH_OB_DisableWRP(pOBInit->WRPSector, pOBInit->Banks);
    }
  }

  /*Read protection configuration*/
  if((pOBInit->OptionType & OPTIONBYTE_RDP) == OPTIONBYTE_RDP)
  {
    status = FLASH_OB_RDP_LevelConfig(pOBInit->RDPLevel);
  }

  /*USER  configuration*/
  if((pOBInit->OptionType & OPTIONBYTE_USER) == OPTIONBYTE_USER)
  {
    status = FLASH_OB_UserConfig(pOBInit->USERConfig&OB_IWDG_SW, 
                                     pOBInit->USERConfig&OB_STOP_NO_RST,
                                     pOBInit->USERConfig&OB_STDBY_NO_RST);
  }

  /*BOR Level  configuration*/
  if((pOBInit->OptionType & OPTIONBYTE_BOR) == OPTIONBYTE_BOR)
  {
    status = FLASH_OB_BOR_LevelConfig(pOBInit->BORLevel);
  }

  /* Process Unlocked */
  __HAL_UNLOCK(&pFlash);

  return status;
}

/**
  * @brief   Get the Option byte configuration
  * @param  pOBInit: pointer to an FLASH_OBInitStruct structure that
  *         contains the configuration information for the programming.
  * 
  * @retval None
  */
void HAL_FLASHEx_OBGetConfig(FLASH_OBProgramInitTypeDef *pOBInit)
{
  pOBInit->OptionType = OPTIONBYTE_WRP | OPTIONBYTE_RDP | OPTIONBYTE_USER | OPTIONBYTE_BOR;

  /*Get WRP*/
366
  pOBInit->WRPSector = (uint32_t)FLASH_OB_GetWRP();
Dave Hylands's avatar
Dave Hylands committed
367
368

  /*Get RDP Level*/
369
  pOBInit->RDPLevel = (uint32_t)FLASH_OB_GetRDP();
Dave Hylands's avatar
Dave Hylands committed
370
371

  /*Get USER*/
372
  pOBInit->USERConfig = (uint8_t)FLASH_OB_GetUser();
Dave Hylands's avatar
Dave Hylands committed
373
374

  /*Get BOR Level*/
375
  pOBInit->BORLevel = (uint32_t)FLASH_OB_GetBOR();
Dave Hylands's avatar
Dave Hylands committed
376
377
}

378
379
380
381
382
#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) ||\
    defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F410Tx) || defined(STM32F410Cx) ||\
    defined(STM32F410Rx) || defined(STM32F411xE) || defined(STM32F446xx) || defined(STM32F469xx) ||\
    defined(STM32F479xx) || defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) ||\
    defined(STM32F412Cx)
Dave Hylands's avatar
Dave Hylands committed
383
384
385
386
387
/**
  * @brief   Program option bytes
  * @param  pAdvOBInit: pointer to an FLASH_AdvOBProgramInitTypeDef structure that
  *         contains the configuration information for the programming.
  * 
388
  * @retval HAL Status
Dave Hylands's avatar
Dave Hylands committed
389
390
391
392
393
394
395
396
397
  */
HAL_StatusTypeDef HAL_FLASHEx_AdvOBProgram (FLASH_AdvOBProgramInitTypeDef *pAdvOBInit)
{
  HAL_StatusTypeDef status = HAL_ERROR;
  
  /* Check the parameters */
  assert_param(IS_OBEX(pAdvOBInit->OptionType));

  /*Program PCROP option byte*/
398
  if(((pAdvOBInit->OptionType) & OPTIONBYTE_PCROP) == OPTIONBYTE_PCROP)
Dave Hylands's avatar
Dave Hylands committed
399
400
401
  {
    /* Check the parameters */
    assert_param(IS_PCROPSTATE(pAdvOBInit->PCROPState));
402
    if((pAdvOBInit->PCROPState) == OB_PCROP_STATE_ENABLE)
Dave Hylands's avatar
Dave Hylands committed
403
404
    {
      /*Enable of Write protection on the selected Sector*/
405
406
407
#if defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) ||\
    defined(STM32F411xE) || defined(STM32F446xx) || defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) ||\
    defined(STM32F412Cx)
Dave Hylands's avatar
Dave Hylands committed
408
      status = FLASH_OB_EnablePCROP(pAdvOBInit->Sectors);
409
#else  /* STM32F427xx || STM32F437xx || STM32F429xx|| STM32F439xx || STM32F469xx || STM32F479xx */
Dave Hylands's avatar
Dave Hylands committed
410
      status = FLASH_OB_EnablePCROP(pAdvOBInit->SectorsBank1, pAdvOBInit->SectorsBank2, pAdvOBInit->Banks);
411
#endif /* STM32F401xC || STM32F401xE || STM32F410xx || STM32F411xE || STM32F446xx || STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx */
Dave Hylands's avatar
Dave Hylands committed
412
413
414
415
    }
    else
    {
      /*Disable of Write protection on the selected Sector*/
416
417
418
#if defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) ||\
    defined(STM32F411xE) || defined(STM32F446xx) || defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) ||\
    defined(STM32F412Cx) 
Dave Hylands's avatar
Dave Hylands committed
419
      status = FLASH_OB_DisablePCROP(pAdvOBInit->Sectors);
420
#else /* STM32F427xx || STM32F437xx || STM32F429xx|| STM32F439xx || STM32F469xx || STM32F479xx */
Dave Hylands's avatar
Dave Hylands committed
421
      status = FLASH_OB_DisablePCROP(pAdvOBInit->SectorsBank1, pAdvOBInit->SectorsBank2, pAdvOBInit->Banks);
422
#endif /* STM32F401xC || STM32F401xE || STM32F410xx || STM32F411xE || STM32F446xx || STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx */
Dave Hylands's avatar
Dave Hylands committed
423
424
425
    }
  }
   
426
#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) || defined(STM32F469xx) || defined(STM32F479xx)
Dave Hylands's avatar
Dave Hylands committed
427
  /*Program BOOT config option byte*/
428
  if(((pAdvOBInit->OptionType) & OPTIONBYTE_BOOTCONFIG) == OPTIONBYTE_BOOTCONFIG)
Dave Hylands's avatar
Dave Hylands committed
429
430
431
  {
    status = FLASH_OB_BootConfig(pAdvOBInit->BootConfig);
  }
432
#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F469xx || STM32F479xx */
Dave Hylands's avatar
Dave Hylands committed
433
434
435
436
437
438
439
440
441
442
443
444
445

  return status;
}

/**
  * @brief   Get the OBEX byte configuration
  * @param  pAdvOBInit: pointer to an FLASH_AdvOBProgramInitTypeDef structure that
  *         contains the configuration information for the programming.
  * 
  * @retval None
  */
void HAL_FLASHEx_AdvOBGetConfig(FLASH_AdvOBProgramInitTypeDef *pAdvOBInit)
{
446
447
448
#if defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) ||\
    defined(STM32F411xE) || defined(STM32F446xx) || defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) ||\
    defined(STM32F412Cx)
Dave Hylands's avatar
Dave Hylands committed
449
450
  /*Get Sector*/
  pAdvOBInit->Sectors = (*(__IO uint16_t *)(OPTCR_BYTE2_ADDRESS));
451
#else  /* STM32F427xx || STM32F437xx || STM32F429xx|| STM32F439xx || STM32F469xx || STM32F479xx */
Dave Hylands's avatar
Dave Hylands committed
452
453
454
455
456
457
458
459
  /*Get Sector for Bank1*/
  pAdvOBInit->SectorsBank1 = (*(__IO uint16_t *)(OPTCR_BYTE2_ADDRESS));

  /*Get Sector for Bank2*/
  pAdvOBInit->SectorsBank2 = (*(__IO uint16_t *)(OPTCR1_BYTE2_ADDRESS));

  /*Get Boot config OB*/
  pAdvOBInit->BootConfig = *(__IO uint8_t *)OPTCR_BYTE0_ADDRESS;
460
#endif /* STM32F401xC || STM32F401xE || STM32F410xx || STM32F411xE || STM32F446xx || STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx */
Dave Hylands's avatar
Dave Hylands committed
461
462
463
464
465
466
467
468
}

/**
  * @brief  Select the Protection Mode 
  * 
  * @note   After PCROP activated Option Byte modification NOT POSSIBLE! excepted 
  *         Global Read Out Protection modification (from level1 to level0) 
  * @note   Once SPRMOD bit is active unprotection of a protected sector is not possible 
469
470
471
  * @note   Read a protected sector will set RDERR Flag and write a protected sector will set WRPERR Flag
  * @note   This function can be used only for STM32F42xxx/STM32F43xxx/STM32F401xx/STM32F411xx/STM32F446xx/
  *         STM32F469xx/STM32F479xx/STM32F412Zx/STM32F412Vx/STM32F412Rx/STM32F412Cx devices.
Dave Hylands's avatar
Dave Hylands committed
472
  * 
473
  * @retval HAL Status
Dave Hylands's avatar
Dave Hylands committed
474
475
476
  */
HAL_StatusTypeDef HAL_FLASHEx_OB_SelectPCROP(void)
{
477
  uint8_t optiontmp = 0xFFU;
Dave Hylands's avatar
Dave Hylands committed
478
479

  /* Mask SPRMOD bit */
480
  optiontmp =  (uint8_t)((*(__IO uint8_t *)OPTCR_BYTE3_ADDRESS) & (uint8_t)0x7FU); 
Dave Hylands's avatar
Dave Hylands committed
481
482
483
484
485
486
487
488
489
490
491
492
493
  
  /* Update Option Byte */
  *(__IO uint8_t *)OPTCR_BYTE3_ADDRESS = (uint8_t)(OB_PCROP_SELECTED | optiontmp); 
  
  return HAL_OK;
}

/**
  * @brief  Deselect the Protection Mode 
  * 
  * @note   After PCROP activated Option Byte modification NOT POSSIBLE! excepted 
  *         Global Read Out Protection modification (from level1 to level0) 
  * @note   Once SPRMOD bit is active unprotection of a protected sector is not possible 
494
495
496
  * @note   Read a protected sector will set RDERR Flag and write a protected sector will set WRPERR Flag
  * @note   This function can be used only for STM32F42xxx/STM32F43xxx/STM32F401xx/STM32F411xx/STM32F446xx/
  *         STM32F469xx/STM32F479xx/STM32F412Zx/STM32F412Vx/STM32F412Rx/STM32F412Cx devices.
Dave Hylands's avatar
Dave Hylands committed
497
  * 
498
  * @retval HAL Status
Dave Hylands's avatar
Dave Hylands committed
499
500
501
  */
HAL_StatusTypeDef HAL_FLASHEx_OB_DeSelectPCROP(void)
{
502
  uint8_t optiontmp = 0xFFU;
Dave Hylands's avatar
Dave Hylands committed
503
504
  
  /* Mask SPRMOD bit */
505
  optiontmp =  (uint8_t)((*(__IO uint8_t *)OPTCR_BYTE3_ADDRESS) & (uint8_t)0x7FU); 
Dave Hylands's avatar
Dave Hylands committed
506
507
508
509
510
511
  
  /* Update Option Byte */
  *(__IO uint8_t *)OPTCR_BYTE3_ADDRESS = (uint8_t)(OB_PCROP_DESELECTED | optiontmp);  
  
  return HAL_OK;
}
512
513
#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F401xC || STM32F401xE || STM32F410xx ||\
          STM32F411xE || STM32F469xx || STM32F479xx || STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx */
Dave Hylands's avatar
Dave Hylands committed
514

515
#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx)|| defined(STM32F439xx) || defined(STM32F469xx) || defined(STM32F479xx)
Dave Hylands's avatar
Dave Hylands committed
516
517
/**
  * @brief  Returns the FLASH Write Protection Option Bytes value for Bank 2
518
  * @note   This function can be used only for STM32F42xxx/STM32F43xxx/STM32F469xx/STM32F479xx devices.  
Dave Hylands's avatar
Dave Hylands committed
519
520
521
522
523
524
525
  * @retval The FLASH Write Protection  Option Bytes value
  */
uint16_t HAL_FLASHEx_OB_GetBank2WRP(void)
{                            
  /* Return the FLASH write protection Register value */
  return (*(__IO uint16_t *)(OPTCR1_BYTE2_ADDRESS));
}
526
#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F469xx || STM32F479xx */
Dave Hylands's avatar
Dave Hylands committed
527
528
529
530
531

/**
  * @}
  */
  
532
#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) || defined(STM32F469xx) || defined(STM32F479xx)
Dave Hylands's avatar
Dave Hylands committed
533
534
535
536
/**
  * @brief  Full erase of FLASH memory sectors 
  * @param  VoltageRange: The device voltage range which defines the erase parallelism.  
  *          This parameter can be one of the following values:
537
  *            @arg FLASH_VOLTAGE_RANGE_1: when the device voltage range is 1.8V to 2.1V, 
Dave Hylands's avatar
Dave Hylands committed
538
  *                                  the operation will be done by byte (8-bit) 
539
  *            @arg FLASH_VOLTAGE_RANGE_2: when the device voltage range is 2.1V to 2.7V,
Dave Hylands's avatar
Dave Hylands committed
540
  *                                  the operation will be done by half word (16-bit)
541
  *            @arg FLASH_VOLTAGE_RANGE_3: when the device voltage range is 2.7V to 3.6V,
Dave Hylands's avatar
Dave Hylands committed
542
  *                                  the operation will be done by word (32-bit)
543
  *            @arg FLASH_VOLTAGE_RANGE_4: when the device voltage range is 2.7V to 3.6V + External Vpp, 
Dave Hylands's avatar
Dave Hylands committed
544
545
546
547
548
549
550
551
  *                                  the operation will be done by double word (64-bit)
  * 
  * @param  Banks: Banks to be erased
  *          This parameter can be one of the following values:
  *            @arg FLASH_BANK_1: Bank1 to be erased
  *            @arg FLASH_BANK_2: Bank2 to be erased
  *            @arg FLASH_BANK_BOTH: Bank1 and Bank2 to be erased
  *
552
  * @retval HAL Status
Dave Hylands's avatar
Dave Hylands committed
553
554
555
556
557
558
559
560
  */
static void FLASH_MassErase(uint8_t VoltageRange, uint32_t Banks)
{
  /* Check the parameters */
  assert_param(IS_VOLTAGERANGE(VoltageRange));
  assert_param(IS_FLASH_BANK(Banks));

  /* if the previous operation is completed, proceed to erase all sectors */
561
562
  CLEAR_BIT(FLASH->CR, FLASH_CR_PSIZE);

Dave Hylands's avatar
Dave Hylands committed
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
  if(Banks == FLASH_BANK_BOTH)
  {
    /* bank1 & bank2 will be erased*/
    FLASH->CR |= FLASH_MER_BIT;
  }
  else if(Banks == FLASH_BANK_1)
  {
    /*Only bank1 will be erased*/
    FLASH->CR |= FLASH_CR_MER1;
  }
  else
  {
    /*Only bank2 will be erased*/
    FLASH->CR |= FLASH_CR_MER2;
  }
578
  FLASH->CR |= FLASH_CR_STRT | ((uint32_t)VoltageRange <<8U);
Dave Hylands's avatar
Dave Hylands committed
579
580
581
582
583
584
585
586
}

/**
  * @brief  Erase the specified FLASH memory sector
  * @param  Sector: FLASH sector to erase
  *         The value of this parameter depend on device used within the same series      
  * @param  VoltageRange: The device voltage range which defines the erase parallelism.  
  *          This parameter can be one of the following values:
587
  *            @arg FLASH_VOLTAGE_RANGE_1: when the device voltage range is 1.8V to 2.1V, 
Dave Hylands's avatar
Dave Hylands committed
588
  *                                  the operation will be done by byte (8-bit) 
589
  *            @arg FLASH_VOLTAGE_RANGE_2: when the device voltage range is 2.1V to 2.7V,
Dave Hylands's avatar
Dave Hylands committed
590
  *                                  the operation will be done by half word (16-bit)
591
  *            @arg FLASH_VOLTAGE_RANGE_3: when the device voltage range is 2.7V to 3.6V,
Dave Hylands's avatar
Dave Hylands committed
592
  *                                  the operation will be done by word (32-bit)
593
  *            @arg FLASH_VOLTAGE_RANGE_4: when the device voltage range is 2.7V to 3.6V + External Vpp, 
Dave Hylands's avatar
Dave Hylands committed
594
595
596
597
598
599
  *                                  the operation will be done by double word (64-bit)
  * 
  * @retval None
  */
void FLASH_Erase_Sector(uint32_t Sector, uint8_t VoltageRange)
{
600
  uint32_t tmp_psize = 0U;
Dave Hylands's avatar
Dave Hylands committed
601
602
603
604
605

  /* Check the parameters */
  assert_param(IS_FLASH_SECTOR(Sector));
  assert_param(IS_VOLTAGERANGE(VoltageRange));
  
606
  if(VoltageRange == FLASH_VOLTAGE_RANGE_1)
Dave Hylands's avatar
Dave Hylands committed
607
608
609
  {
     tmp_psize = FLASH_PSIZE_BYTE;
  }
610
  else if(VoltageRange == FLASH_VOLTAGE_RANGE_2)
Dave Hylands's avatar
Dave Hylands committed
611
612
613
  {
    tmp_psize = FLASH_PSIZE_HALF_WORD;
  }
614
  else if(VoltageRange == FLASH_VOLTAGE_RANGE_3)
Dave Hylands's avatar
Dave Hylands committed
615
616
617
618
619
620
621
622
623
  {
    tmp_psize = FLASH_PSIZE_WORD;
  }
  else
  {
    tmp_psize = FLASH_PSIZE_DOUBLE_WORD;
  }

  /* Need to add offset of 4 when sector higher than FLASH_SECTOR_11 */
624
  if(Sector > FLASH_SECTOR_11) 
Dave Hylands's avatar
Dave Hylands committed
625
  {
626
    Sector += 4U;
Dave Hylands's avatar
Dave Hylands committed
627
628
  }
  /* If the previous operation is completed, proceed to erase the sector */
629
  CLEAR_BIT(FLASH->CR, FLASH_CR_PSIZE);
Dave Hylands's avatar
Dave Hylands committed
630
  FLASH->CR |= tmp_psize;
631
  CLEAR_BIT(FLASH->CR, FLASH_CR_SNB);
Dave Hylands's avatar
Dave Hylands committed
632
633
634
635
636
637
638
639
640
641
642
643
644
645
  FLASH->CR |= FLASH_CR_SER | (Sector << POSITION_VAL(FLASH_CR_SNB));
  FLASH->CR |= FLASH_CR_STRT;
}

/**
  * @brief  Enable the write protection of the desired bank1 or bank 2 sectors
  *
  * @note   When the memory read protection level is selected (RDP level = 1), 
  *         it is not possible to program or erase the flash sector i if CortexM4  
  *         debug features are connected or boot code is executed in RAM, even if nWRPi = 1 
  * @note   Active value of nWRPi bits is inverted when PCROP mode is active (SPRMOD =1).   
  * 
  * @param  WRPSector: specifies the sector(s) to be write protected.
  *          This parameter can be one of the following values:
646
  *            @arg WRPSector: A value between OB_WRP_SECTOR_0 and OB_WRP_SECTOR_23
Dave Hylands's avatar
Dave Hylands committed
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
  *            @arg OB_WRP_SECTOR_All
  * @note   BANK2 starts from OB_WRP_SECTOR_12
  *
  * @param  Banks: Enable write protection on all the sectors for the specific bank
  *          This parameter can be one of the following values:
  *            @arg FLASH_BANK_1: WRP on all sectors of bank1
  *            @arg FLASH_BANK_2: WRP on all sectors of bank2
  *            @arg FLASH_BANK_BOTH: WRP on all sectors of bank1 & bank2
  *
  * @retval HAL FLASH State   
  */
static HAL_StatusTypeDef FLASH_OB_EnableWRP(uint32_t WRPSector, uint32_t Banks)
{
  HAL_StatusTypeDef status = HAL_OK;
  
  /* Check the parameters */
  assert_param(IS_OB_WRP_SECTOR(WRPSector));
  assert_param(IS_FLASH_BANK(Banks));
    
  /* Wait for last operation to be completed */
667
  status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE);
Dave Hylands's avatar
Dave Hylands committed
668
669
670

  if(status == HAL_OK)
  {
671
    if(((WRPSector == OB_WRP_SECTOR_All) && ((Banks == FLASH_BANK_1) || (Banks == FLASH_BANK_BOTH))) ||
Dave Hylands's avatar
Dave Hylands committed
672
673
         (WRPSector < OB_WRP_SECTOR_12))
    {
674
       if(WRPSector == OB_WRP_SECTOR_All)
Dave Hylands's avatar
Dave Hylands committed
675
676
       {
          /*Write protection on all sector of BANK1*/
677
          *(__IO uint16_t*)OPTCR_BYTE2_ADDRESS &= (~(WRPSector>>12U));  
Dave Hylands's avatar
Dave Hylands committed
678
679
680
681
682
683
684
685
686
687
       }
       else
       {
          /*Write protection done on sectors of BANK1*/
          *(__IO uint16_t*)OPTCR_BYTE2_ADDRESS &= (~WRPSector);  
       }
    }
    else 
    {
      /*Write protection done on sectors of BANK2*/
688
      *(__IO uint16_t*)OPTCR1_BYTE2_ADDRESS &= (~(WRPSector>>12U));  
Dave Hylands's avatar
Dave Hylands committed
689
690
691
    }

    /*Write protection on all sector of BANK2*/
692
    if((WRPSector == OB_WRP_SECTOR_All) && (Banks == FLASH_BANK_BOTH))
Dave Hylands's avatar
Dave Hylands committed
693
694
    {
      /* Wait for last operation to be completed */
695
      status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE);
Dave Hylands's avatar
Dave Hylands committed
696
697
698
      
      if(status == HAL_OK)
      { 
699
        *(__IO uint16_t*)OPTCR1_BYTE2_ADDRESS &= (~(WRPSector>>12U));  
Dave Hylands's avatar
Dave Hylands committed
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
      }
    }
    
  }
  return status;
}

/**
  * @brief  Disable the write protection of the desired bank1 or bank 2 sectors
  *
  * @note   When the memory read protection level is selected (RDP level = 1), 
  *         it is not possible to program or erase the flash sector i if CortexM4  
  *         debug features are connected or boot code is executed in RAM, even if nWRPi = 1 
  * @note   Active value of nWRPi bits is inverted when PCROP mode is active (SPRMOD =1).   
  * 
  * @param  WRPSector: specifies the sector(s) to be write protected.
  *          This parameter can be one of the following values:
717
  *            @arg WRPSector: A value between OB_WRP_SECTOR_0 and OB_WRP_SECTOR_23
Dave Hylands's avatar
Dave Hylands committed
718
719
720
721
722
723
724
725
726
  *            @arg OB_WRP_Sector_All
  * @note   BANK2 starts from OB_WRP_SECTOR_12
  *
  * @param  Banks: Disable write protection on all the sectors for the specific bank
  *          This parameter can be one of the following values:
  *            @arg FLASH_BANK_1: Bank1 to be erased
  *            @arg FLASH_BANK_2: Bank2 to be erased
  *            @arg FLASH_BANK_BOTH: Bank1 and Bank2 to be erased
  *
727
  * @retval HAL Status   
Dave Hylands's avatar
Dave Hylands committed
728
729
730
731
732
733
734
735
736
737
  */
static HAL_StatusTypeDef FLASH_OB_DisableWRP(uint32_t WRPSector, uint32_t Banks)
{
  HAL_StatusTypeDef status = HAL_OK;
  
  /* Check the parameters */
  assert_param(IS_OB_WRP_SECTOR(WRPSector));
  assert_param(IS_FLASH_BANK(Banks));
    
  /* Wait for last operation to be completed */
738
  status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE);
Dave Hylands's avatar
Dave Hylands committed
739
740
741

  if(status == HAL_OK)
  {
742
    if(((WRPSector == OB_WRP_SECTOR_All) && ((Banks == FLASH_BANK_1) || (Banks == FLASH_BANK_BOTH))) ||
Dave Hylands's avatar
Dave Hylands committed
743
744
         (WRPSector < OB_WRP_SECTOR_12))
    {
745
       if(WRPSector == OB_WRP_SECTOR_All)
Dave Hylands's avatar
Dave Hylands committed
746
747
       {
          /*Write protection on all sector of BANK1*/
748
          *(__IO uint16_t*)OPTCR_BYTE2_ADDRESS |= (uint16_t)(WRPSector>>12U); 
Dave Hylands's avatar
Dave Hylands committed
749
750
751
752
753
754
755
756
757
758
       }
       else
       {
          /*Write protection done on sectors of BANK1*/
          *(__IO uint16_t*)OPTCR_BYTE2_ADDRESS |= (uint16_t)WRPSector; 
       }
    }
    else 
    {
      /*Write protection done on sectors of BANK2*/
759
      *(__IO uint16_t*)OPTCR1_BYTE2_ADDRESS |= (uint16_t)(WRPSector>>12U); 
Dave Hylands's avatar
Dave Hylands committed
760
761
762
    }

    /*Write protection on all sector  of BANK2*/
763
    if((WRPSector == OB_WRP_SECTOR_All) && (Banks == FLASH_BANK_BOTH))
Dave Hylands's avatar
Dave Hylands committed
764
765
    {
      /* Wait for last operation to be completed */
766
      status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE);
Dave Hylands's avatar
Dave Hylands committed
767
768
769
      
      if(status == HAL_OK)
      { 
770
        *(__IO uint16_t*)OPTCR1_BYTE2_ADDRESS |= (uint16_t)(WRPSector>>12U); 
Dave Hylands's avatar
Dave Hylands committed
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
      }
    }
    
  }

  return status;
}

/**
  * @brief  Configure the Dual Bank Boot.
  *   
  * @note   This function can be used only for STM32F42xxx/43xxx devices.
  *      
  * @param  BootConfig specifies the Dual Bank Boot Option byte.
  *          This parameter can be one of the following values:
  *            @arg OB_Dual_BootEnabled: Dual Bank Boot Enable
  *            @arg OB_Dual_BootDisabled: Dual Bank Boot Disabled
  * @retval None
  */
static HAL_StatusTypeDef FLASH_OB_BootConfig(uint8_t BootConfig)
{
  HAL_StatusTypeDef status = HAL_OK;

  /* Check the parameters */
  assert_param(IS_OB_BOOT(BootConfig));

  /* Wait for last operation to be completed */  
798
  status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE);
Dave Hylands's avatar
Dave Hylands committed
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827

  if(status == HAL_OK)
  { 
    /* Set Dual Bank Boot */
    *(__IO uint8_t *)OPTCR_BYTE0_ADDRESS &= (~FLASH_OPTCR_BFB2);
    *(__IO uint8_t *)OPTCR_BYTE0_ADDRESS |= BootConfig;
  }
  
  return status;
}

/**
  * @brief  Enable the read/write protection (PCROP) of the desired 
  *         sectors of Bank 1 and/or Bank 2.
  * @note   This function can be used only for STM32F42xxx/43xxx devices.
  * @param  SectorBank1 Specifies the sector(s) to be read/write protected or unprotected for bank1.
  *          This parameter can be one of the following values:
  *            @arg OB_PCROP: A value between OB_PCROP_SECTOR_0 and OB_PCROP_SECTOR_11
  *            @arg OB_PCROP_SECTOR__All                         
  * @param  SectorBank2 Specifies the sector(s) to be read/write protected or unprotected for bank2.
  *          This parameter can be one of the following values:
  *            @arg OB_PCROP: A value between OB_PCROP_SECTOR_12 and OB_PCROP_SECTOR_23
  *            @arg OB_PCROP_SECTOR__All                         
  * @param  Banks Enable PCROP protection on all the sectors for the specific bank
  *          This parameter can be one of the following values:
  *            @arg FLASH_BANK_1: WRP on all sectors of bank1
  *            @arg FLASH_BANK_2: WRP on all sectors of bank2
  *            @arg FLASH_BANK_BOTH: WRP on all sectors of bank1 & bank2
  *
828
  * @retval HAL Status  
Dave Hylands's avatar
Dave Hylands committed
829
830
831
832
833
834
835
836
  */
static HAL_StatusTypeDef FLASH_OB_EnablePCROP(uint32_t SectorBank1, uint32_t SectorBank2, uint32_t Banks)
{
  HAL_StatusTypeDef status = HAL_OK;
  
  assert_param(IS_FLASH_BANK(Banks));
    
  /* Wait for last operation to be completed */
837
  status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE);
Dave Hylands's avatar
Dave Hylands committed
838
839
840

  if(status == HAL_OK)
  {
841
    if((Banks == FLASH_BANK_1) || (Banks == FLASH_BANK_BOTH))
Dave Hylands's avatar
Dave Hylands committed
842
843
844
845
846
847
848
849
850
851
852
853
854
    {
      assert_param(IS_OB_PCROP(SectorBank1));
      /*Write protection done on sectors of BANK1*/
      *(__IO uint16_t*)OPTCR_BYTE2_ADDRESS |= (uint16_t)SectorBank1; 
    }
    else 
    {
      assert_param(IS_OB_PCROP(SectorBank2));
      /*Write protection done on sectors of BANK2*/
      *(__IO uint16_t*)OPTCR1_BYTE2_ADDRESS |= (uint16_t)SectorBank2; 
    }

    /*Write protection on all sector  of BANK2*/
855
    if(Banks == FLASH_BANK_BOTH)
Dave Hylands's avatar
Dave Hylands committed
856
857
858
    {
      assert_param(IS_OB_PCROP(SectorBank2));
      /* Wait for last operation to be completed */
859
      status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE);
Dave Hylands's avatar
Dave Hylands committed
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
      
      if(status == HAL_OK)
      { 
        /*Write protection done on sectors of BANK2*/
        *(__IO uint16_t*)OPTCR1_BYTE2_ADDRESS |= (uint16_t)SectorBank2; 
      }
    }
    
  }

  return status;
}


/**
  * @brief  Disable the read/write protection (PCROP) of the desired 
  *         sectors  of Bank 1 and/or Bank 2.
  * @note   This function can be used only for STM32F42xxx/43xxx devices.
  * @param  SectorBank1 specifies the sector(s) to be read/write protected or unprotected for bank1.
  *          This parameter can be one of the following values:
  *            @arg OB_PCROP: A value between OB_PCROP_SECTOR_0 and OB_PCROP_SECTOR_11
  *            @arg OB_PCROP_SECTOR__All                         
  * @param  SectorBank2 Specifies the sector(s) to be read/write protected or unprotected for bank2.
  *          This parameter can be one of the following values:
  *            @arg OB_PCROP: A value between OB_PCROP_SECTOR_12 and OB_PCROP_SECTOR_23
  *            @arg OB_PCROP_SECTOR__All                         
  * @param  Banks Disable PCROP protection on all the sectors for the specific bank
  *          This parameter can be one of the following values:
  *            @arg FLASH_BANK_1: WRP on all sectors of bank1
  *            @arg FLASH_BANK_2: WRP on all sectors of bank2
  *            @arg FLASH_BANK_BOTH: WRP on all sectors of bank1 & bank2
  *
892
  * @retval HAL Status  
Dave Hylands's avatar
Dave Hylands committed
893
894
895
896
897
898
899
900
901
  */
static HAL_StatusTypeDef FLASH_OB_DisablePCROP(uint32_t SectorBank1, uint32_t SectorBank2, uint32_t Banks)
{  
  HAL_StatusTypeDef status = HAL_OK;
  
  /* Check the parameters */
  assert_param(IS_FLASH_BANK(Banks));
    
  /* Wait for last operation to be completed */
902
  status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE);
Dave Hylands's avatar
Dave Hylands committed
903
904
905

  if(status == HAL_OK)
  {
906
    if((Banks == FLASH_BANK_1) || (Banks == FLASH_BANK_BOTH))
Dave Hylands's avatar
Dave Hylands committed
907
908
909
910
911
912
913
914
915
916
917
918
919
    {
      assert_param(IS_OB_PCROP(SectorBank1));
      /*Write protection done on sectors of BANK1*/
      *(__IO uint16_t*)OPTCR_BYTE2_ADDRESS &= (~SectorBank1); 
    }
    else 
    {
      /*Write protection done on sectors of BANK2*/
      assert_param(IS_OB_PCROP(SectorBank2));
      *(__IO uint16_t*)OPTCR1_BYTE2_ADDRESS &= (~SectorBank2); 
    }

    /*Write protection on all sector  of BANK2*/
920
    if(Banks == FLASH_BANK_BOTH)
Dave Hylands's avatar
Dave Hylands committed
921
922
923
    {
      assert_param(IS_OB_PCROP(SectorBank2));
     /* Wait for last operation to be completed */
924
      status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE);
Dave Hylands's avatar
Dave Hylands committed
925
926
927
928
929
930
931
932
933
934
935
936
937
938
      
      if(status == HAL_OK)
      { 
        /*Write protection done on sectors of BANK2*/
        *(__IO uint16_t*)OPTCR1_BYTE2_ADDRESS &= (~SectorBank2); 
      }
    }
    
  }
  
  return status;

}

939
#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F469xx || STM32F479xx */
Dave Hylands's avatar
Dave Hylands committed
940

941
942
943
944
#if defined(STM32F405xx) || defined(STM32F415xx) || defined(STM32F407xx) || defined(STM32F417xx) ||\
    defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F410Tx) || defined(STM32F410Cx) ||\
    defined(STM32F410Rx) || defined(STM32F411xE) || defined(STM32F446xx) || defined(STM32F412Zx) ||\
    defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F412Cx)
Dave Hylands's avatar
Dave Hylands committed
945
946
947
948
/**
  * @brief  Mass erase of FLASH memory
  * @param  VoltageRange: The device voltage range which defines the erase parallelism.  
  *          This parameter can be one of the following values:
949
  *            @arg FLASH_VOLTAGE_RANGE_1: when the device voltage range is 1.8V to 2.1V, 
Dave Hylands's avatar
Dave Hylands committed
950
  *                                  the operation will be done by byte (8-bit) 
951
  *            @arg FLASH_VOLTAGE_RANGE_2: when the device voltage range is 2.1V to 2.7V,
Dave Hylands's avatar
Dave Hylands committed
952
  *                                  the operation will be done by half word (16-bit)
953
  *            @arg FLASH_VOLTAGE_RANGE_3: when the device voltage range is 2.7V to 3.6V,
Dave Hylands's avatar
Dave Hylands committed
954
  *                                  the operation will be done by word (32-bit)
955
  *            @arg FLASH_VOLTAGE_RANGE_4: when the device voltage range is 2.7V to 3.6V + External Vpp, 
Dave Hylands's avatar
Dave Hylands committed
956
957
958
959
960
961
962
963
964
965
966
967
968
  *                                  the operation will be done by double word (64-bit)
  * 
  * @param  Banks: Banks to be erased
  *          This parameter can be one of the following values:
  *            @arg FLASH_BANK_1: Bank1 to be erased
  *
  * @retval None
  */
static void FLASH_MassErase(uint8_t VoltageRange, uint32_t Banks)
{
  /* Check the parameters */
  assert_param(IS_VOLTAGERANGE(VoltageRange));
  assert_param(IS_FLASH_BANK(Banks));
969
  
Dave Hylands's avatar
Dave Hylands committed
970
  /* If the previous operation is completed, proceed to erase all sectors */
971
972
973
  CLEAR_BIT(FLASH->CR, FLASH_CR_PSIZE);
  FLASH->CR |= FLASH_CR_MER;
  FLASH->CR |= FLASH_CR_STRT | ((uint32_t)VoltageRange <<8U);
Dave Hylands's avatar
Dave Hylands committed
974
975
976
977
978
979
980
981
}

/**
  * @brief  Erase the specified FLASH memory sector
  * @param  Sector: FLASH sector to erase
  *         The value of this parameter depend on device used within the same series      
  * @param  VoltageRange: The device voltage range which defines the erase parallelism.  
  *          This parameter can be one of the following values:
982
  *            @arg FLASH_VOLTAGE_RANGE_1: when the device voltage range is 1.8V to 2.1V, 
Dave Hylands's avatar
Dave Hylands committed
983
  *                                  the operation will be done by byte (8-bit) 
984
  *            @arg FLASH_VOLTAGE_RANGE_2: when the device voltage range is 2.1V to 2.7V,
Dave Hylands's avatar
Dave Hylands committed
985
  *                                  the operation will be done by half word (16-bit)
986
  *            @arg FLASH_VOLTAGE_RANGE_3: when the device voltage range is 2.7V to 3.6V,
Dave Hylands's avatar
Dave Hylands committed
987
  *                                  the operation will be done by word (32-bit)
988
  *            @arg FLASH_VOLTAGE_RANGE_4: when the device voltage range is 2.7V to 3.6V + External Vpp, 
Dave Hylands's avatar
Dave Hylands committed
989
990
991
992
993
994
  *                                  the operation will be done by double word (64-bit)
  * 
  * @retval None
  */
void FLASH_Erase_Sector(uint32_t Sector, uint8_t VoltageRange)
{
995
  uint32_t tmp_psize = 0U;
Dave Hylands's avatar
Dave Hylands committed
996
997
998
999
1000

  /* Check the parameters */
  assert_param(IS_FLASH_SECTOR(Sector));
  assert_param(IS_VOLTAGERANGE(VoltageRange));
  
For faster browsing, not all history is shown. View entire blame