1 /**
2   ******************************************************************************
3   * @file    stm32f1xx_hal_flash.h
4   * @author  MCD Application Team
5   * @brief   Header file of Flash HAL module.
6   ******************************************************************************
7   * @attention
8   *
9   * <h2><center>&copy; Copyright (c) 2016 STMicroelectronics.
10   * All rights reserved.</center></h2>
11   *
12   * This software component is licensed by ST under BSD 3-Clause license,
13   * the "License"; You may not use this file except in compliance with the
14   * License. You may obtain a copy of the License at:
15   *                        opensource.org/licenses/BSD-3-Clause
16   *
17   ******************************************************************************
18   */
19 
20 /* Define to prevent recursive inclusion -------------------------------------*/
21 #ifndef __STM32F1xx_HAL_FLASH_H
22 #define __STM32F1xx_HAL_FLASH_H
23 
24 #ifdef __cplusplus
25  extern "C" {
26 #endif
27 
28 /* Includes ------------------------------------------------------------------*/
29 #include "stm32f1xx_hal_def.h"
30 
31 /** @addtogroup STM32F1xx_HAL_Driver
32   * @{
33   */
34 
35 /** @addtogroup FLASH
36   * @{
37   */
38 
39 /** @addtogroup FLASH_Private_Constants
40   * @{
41   */
42 #define FLASH_TIMEOUT_VALUE              50000U /* 50 s */
43 /**
44   * @}
45   */
46 
47 /** @addtogroup FLASH_Private_Macros
48   * @{
49   */
50 
51 #define IS_FLASH_TYPEPROGRAM(VALUE)  (((VALUE) == FLASH_TYPEPROGRAM_HALFWORD) || \
52                                       ((VALUE) == FLASH_TYPEPROGRAM_WORD)     || \
53                                       ((VALUE) == FLASH_TYPEPROGRAM_DOUBLEWORD))
54 
55 #if   defined(FLASH_ACR_LATENCY)
56 #define IS_FLASH_LATENCY(__LATENCY__) (((__LATENCY__) == FLASH_LATENCY_0) || \
57                                        ((__LATENCY__) == FLASH_LATENCY_1) || \
58                                        ((__LATENCY__) == FLASH_LATENCY_2))
59 
60 #else
61 #define IS_FLASH_LATENCY(__LATENCY__)   ((__LATENCY__) == FLASH_LATENCY_0)
62 #endif /* FLASH_ACR_LATENCY */
63 /**
64   * @}
65   */
66 
67 /* Exported types ------------------------------------------------------------*/
68 /** @defgroup FLASH_Exported_Types FLASH Exported Types
69   * @{
70   */
71 
72 /**
73   * @brief  FLASH Procedure structure definition
74   */
75 typedef enum
76 {
77   FLASH_PROC_NONE              = 0U,
78   FLASH_PROC_PAGEERASE         = 1U,
79   FLASH_PROC_MASSERASE         = 2U,
80   FLASH_PROC_PROGRAMHALFWORD   = 3U,
81   FLASH_PROC_PROGRAMWORD       = 4U,
82   FLASH_PROC_PROGRAMDOUBLEWORD = 5U
83 } FLASH_ProcedureTypeDef;
84 
85 /**
86   * @brief  FLASH handle Structure definition
87   */
88 typedef struct
89 {
90   __IO FLASH_ProcedureTypeDef ProcedureOnGoing; /*!< Internal variable to indicate which procedure is ongoing or not in IT context */
91 
92   __IO uint32_t               DataRemaining;    /*!< Internal variable to save the remaining pages to erase or half-word to program in IT context */
93 
94   __IO uint32_t               Address;          /*!< Internal variable to save address selected for program or erase */
95 
96   __IO uint64_t               Data;             /*!< Internal variable to save data to be programmed */
97 
98   HAL_LockTypeDef             Lock;             /*!< FLASH locking object                */
99 
100   __IO uint32_t               ErrorCode;        /*!< FLASH error code
101                                                      This parameter can be a value of @ref FLASH_Error_Codes  */
102 } FLASH_ProcessTypeDef;
103 
104 /**
105   * @}
106   */
107 
108 /* Exported constants --------------------------------------------------------*/
109 /** @defgroup FLASH_Exported_Constants FLASH Exported Constants
110   * @{
111   */
112 
113 /** @defgroup FLASH_Error_Codes FLASH Error Codes
114   * @{
115   */
116 
117 #define HAL_FLASH_ERROR_NONE      0x00U  /*!< No error */
118 #define HAL_FLASH_ERROR_PROG      0x01U  /*!< Programming error */
119 #define HAL_FLASH_ERROR_WRP       0x02U  /*!< Write protection error */
120 #define HAL_FLASH_ERROR_OPTV      0x04U  /*!< Option validity error */
121 
122 /**
123   * @}
124   */
125 
126 /** @defgroup FLASH_Type_Program FLASH Type Program
127   * @{
128   */
129 #define FLASH_TYPEPROGRAM_HALFWORD             0x01U  /*!<Program a half-word (16-bit) at a specified address.*/
130 #define FLASH_TYPEPROGRAM_WORD                 0x02U  /*!<Program a word (32-bit) at a specified address.*/
131 #define FLASH_TYPEPROGRAM_DOUBLEWORD           0x03U  /*!<Program a double word (64-bit) at a specified address*/
132 
133 /**
134   * @}
135   */
136 
137 #if   defined(FLASH_ACR_LATENCY)
138 /** @defgroup FLASH_Latency FLASH Latency
139   * @{
140   */
141 #define FLASH_LATENCY_0            0x00000000U               /*!< FLASH Zero Latency cycle */
142 #define FLASH_LATENCY_1            FLASH_ACR_LATENCY_0       /*!< FLASH One Latency cycle */
143 #define FLASH_LATENCY_2            FLASH_ACR_LATENCY_1       /*!< FLASH Two Latency cycles */
144 
145 /**
146   * @}
147   */
148 
149 #else
150 /** @defgroup FLASH_Latency FLASH Latency
151   * @{
152   */
153 #define FLASH_LATENCY_0            0x00000000U    /*!< FLASH Zero Latency cycle */
154 
155 /**
156   * @}
157   */
158 
159 #endif /* FLASH_ACR_LATENCY */
160 /**
161   * @}
162   */
163 
164 /* Exported macro ------------------------------------------------------------*/
165 
166 /** @defgroup FLASH_Exported_Macros FLASH Exported Macros
167  *  @brief macros to control FLASH features
168  *  @{
169  */
170 
171 /** @defgroup FLASH_Half_Cycle FLASH Half Cycle
172  *  @brief macros to handle FLASH half cycle
173  * @{
174  */
175 
176 /**
177   * @brief  Enable the FLASH half cycle access.
178   * @note   half cycle access can only be used with a low-frequency clock of less than
179             8 MHz that can be obtained with the use of HSI or HSE but not of PLL.
180   * @retval None
181   */
182 #define __HAL_FLASH_HALF_CYCLE_ACCESS_ENABLE()  (FLASH->ACR |= FLASH_ACR_HLFCYA)
183 
184 /**
185   * @brief  Disable the FLASH half cycle access.
186   * @note   half cycle access can only be used with a low-frequency clock of less than
187             8 MHz that can be obtained with the use of HSI or HSE but not of PLL.
188   * @retval None
189   */
190 #define __HAL_FLASH_HALF_CYCLE_ACCESS_DISABLE() (FLASH->ACR &= (~FLASH_ACR_HLFCYA))
191 
192 /**
193   * @}
194   */
195 
196 #if defined(FLASH_ACR_LATENCY)
197 /** @defgroup FLASH_EM_Latency FLASH Latency
198  *  @brief macros to handle FLASH Latency
199  * @{
200  */
201 
202 /**
203   * @brief  Set the FLASH Latency.
204   * @param  __LATENCY__ FLASH Latency
205   *         The value of this parameter depend on device used within the same series
206   * @retval None
207   */
208 #define __HAL_FLASH_SET_LATENCY(__LATENCY__)    (FLASH->ACR = (FLASH->ACR&(~FLASH_ACR_LATENCY)) | (__LATENCY__))
209 
210 
211 /**
212   * @brief  Get the FLASH Latency.
213   * @retval FLASH Latency
214   *         The value of this parameter depend on device used within the same series
215   */
216 #define __HAL_FLASH_GET_LATENCY()     (READ_BIT((FLASH->ACR), FLASH_ACR_LATENCY))
217 
218 /**
219   * @}
220   */
221 
222 #endif /* FLASH_ACR_LATENCY */
223 /** @defgroup FLASH_Prefetch FLASH Prefetch
224  *  @brief macros to handle FLASH Prefetch buffer
225  * @{
226  */
227 /**
228   * @brief  Enable the FLASH prefetch buffer.
229   * @retval None
230   */
231 #define __HAL_FLASH_PREFETCH_BUFFER_ENABLE()    (FLASH->ACR |= FLASH_ACR_PRFTBE)
232 
233 /**
234   * @brief  Disable the FLASH prefetch buffer.
235   * @retval None
236   */
237 #define __HAL_FLASH_PREFETCH_BUFFER_DISABLE()   (FLASH->ACR &= (~FLASH_ACR_PRFTBE))
238 
239 /**
240   * @}
241   */
242 
243 /**
244   * @}
245   */
246 
247 /* Include FLASH HAL Extended module */
248 #include "stm32f1xx_hal_flash_ex.h"
249 
250 /* Exported functions --------------------------------------------------------*/
251 /** @addtogroup FLASH_Exported_Functions
252   * @{
253   */
254 
255 /** @addtogroup FLASH_Exported_Functions_Group1
256   * @{
257   */
258 /* IO operation functions *****************************************************/
259 HAL_StatusTypeDef HAL_FLASH_Program(uint32_t TypeProgram, uint32_t Address, uint64_t Data);
260 HAL_StatusTypeDef HAL_FLASH_Program_IT(uint32_t TypeProgram, uint32_t Address, uint64_t Data);
261 
262 /* FLASH IRQ handler function */
263 void       HAL_FLASH_IRQHandler(void);
264 /* Callbacks in non blocking modes */
265 void       HAL_FLASH_EndOfOperationCallback(uint32_t ReturnValue);
266 void       HAL_FLASH_OperationErrorCallback(uint32_t ReturnValue);
267 
268 /**
269   * @}
270   */
271 
272 /** @addtogroup FLASH_Exported_Functions_Group2
273   * @{
274   */
275 /* Peripheral Control functions ***********************************************/
276 HAL_StatusTypeDef HAL_FLASH_Unlock(void);
277 HAL_StatusTypeDef HAL_FLASH_Lock(void);
278 HAL_StatusTypeDef HAL_FLASH_OB_Unlock(void);
279 HAL_StatusTypeDef HAL_FLASH_OB_Lock(void);
280 void HAL_FLASH_OB_Launch(void);
281 
282 /**
283   * @}
284   */
285 
286 /** @addtogroup FLASH_Exported_Functions_Group3
287   * @{
288   */
289 /* Peripheral State and Error functions ***************************************/
290 uint32_t HAL_FLASH_GetError(void);
291 
292 /**
293   * @}
294   */
295 
296 /**
297   * @}
298   */
299 
300 /* Private function -------------------------------------------------*/
301 /** @addtogroup FLASH_Private_Functions
302  * @{
303  */
304 HAL_StatusTypeDef       FLASH_WaitForLastOperation(uint32_t Timeout);
305 #if defined(FLASH_BANK2_END)
306 HAL_StatusTypeDef       FLASH_WaitForLastOperationBank2(uint32_t Timeout);
307 #endif /* FLASH_BANK2_END */
308 
309 /**
310   * @}
311   */
312 
313 /**
314   * @}
315   */
316 
317 /**
318   * @}
319   */
320 
321 #ifdef __cplusplus
322 }
323 #endif
324 
325 #endif /* __STM32F1xx_HAL_FLASH_H */
326 
327 /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
328 
329