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