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