Rev 2 | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
| Rev 2 | Rev 28 | ||
|---|---|---|---|
| Line 1... | Line 1... | ||
| 1 | /** |
1 | /** |
| 2 | ****************************************************************************** |
2 | ****************************************************************************** |
| 3 | * @file stm32l1xx_hal_flash_ramfunc.c |
3 | * @file stm32l1xx_hal_flash_ramfunc.c |
| 4 | * @author MCD Application Team |
4 | * @author MCD Application Team |
| 5 | * @version V1.2.0 |
- | |
| 6 | * @date 01-July-2016 |
- | |
| 7 | * @brief FLASH RAMFUNC driver. |
5 | * @brief FLASH RAMFUNC driver. |
| 8 | * This file provides a Flash firmware functions which should be |
6 | * This file provides a Flash firmware functions which should be |
| 9 | * executed from internal SRAM |
7 | * executed from internal SRAM |
| 10 | * |
8 | * |
| 11 | * @verbatim |
9 | * @verbatim |
| Line 30... | Line 28... | ||
| 30 | 28 | ||
| 31 | @endverbatim |
29 | @endverbatim |
| 32 | ****************************************************************************** |
30 | ****************************************************************************** |
| 33 | * @attention |
31 | * @attention |
| 34 | * |
32 | * |
| 35 | * <h2><center>© COPYRIGHT(c) 2016 STMicroelectronics</center></h2> |
33 | * <h2><center>© Copyright (c) 2017 STMicroelectronics. |
| - | 34 | * All rights reserved.</center></h2> |
|
| 36 | * |
35 | * |
| 37 | * Redistribution and use in source and binary forms, with or without modification, |
36 | * This software component is licensed by ST under BSD 3-Clause license, |
| 38 | * are permitted provided that the following conditions are met: |
37 | * the "License"; You may not use this file except in compliance with the |
| 39 | * 1. Redistributions of source code must retain the above copyright notice, |
- | |
| 40 | * this list of conditions and the following disclaimer. |
- | |
| 41 | * 2. Redistributions in binary form must reproduce the above copyright notice, |
- | |
| 42 | * this list of conditions and the following disclaimer in the documentation |
- | |
| 43 | * and/or other materials provided with the distribution. |
38 | * License. You may obtain a copy of the License at: |
| 44 | * 3. Neither the name of STMicroelectronics nor the names of its contributors |
- | |
| 45 | * may be used to endorse or promote products derived from this software |
39 | * opensource.org/licenses/BSD-3-Clause |
| 46 | * without specific prior written permission. |
- | |
| 47 | * |
- | |
| 48 | * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" |
- | |
| 49 | * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
- | |
| 50 | * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE |
- | |
| 51 | * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE |
- | |
| 52 | * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL |
- | |
| 53 | * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR |
- | |
| 54 | * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER |
- | |
| 55 | * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, |
- | |
| 56 | * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
- | |
| 57 | * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
- | |
| 58 | * |
40 | * |
| 59 | ****************************************************************************** |
41 | ****************************************************************************** |
| 60 | */ |
42 | */ |
| 61 | 43 | ||
| 62 | /* Includes ------------------------------------------------------------------*/ |
44 | /* Includes ------------------------------------------------------------------*/ |
| Line 96... | Line 78... | ||
| 96 | /* Private function prototypes -----------------------------------------------*/ |
78 | /* Private function prototypes -----------------------------------------------*/ |
| 97 | /** @defgroup FLASH_RAMFUNC_Private_Functions FLASH RAM Private Functions |
79 | /** @defgroup FLASH_RAMFUNC_Private_Functions FLASH RAM Private Functions |
| 98 | * @{ |
80 | * @{ |
| 99 | */ |
81 | */ |
| 100 | 82 | ||
| 101 | static __RAM_FUNC FLASHRAM_WaitForLastOperation(uint32_t Timeout); |
83 | static __RAM_FUNC HAL_StatusTypeDef FLASHRAM_WaitForLastOperation(uint32_t Timeout); |
| 102 | static __RAM_FUNC FLASHRAM_SetErrorCode(void); |
84 | static __RAM_FUNC HAL_StatusTypeDef FLASHRAM_SetErrorCode(void); |
| 103 | 85 | ||
| 104 | /** |
86 | /** |
| 105 | * @} |
87 | * @} |
| 106 | */ |
88 | */ |
| 107 | 89 | ||
| Line 128... | Line 110... | ||
| 128 | /** |
110 | /** |
| 129 | * @brief Enable the power down mode during RUN mode. |
111 | * @brief Enable the power down mode during RUN mode. |
| 130 | * @note This function can be used only when the user code is running from Internal SRAM. |
112 | * @note This function can be used only when the user code is running from Internal SRAM. |
| 131 | * @retval HAL status |
113 | * @retval HAL status |
| 132 | */ |
114 | */ |
| 133 | __RAM_FUNC HAL_FLASHEx_EnableRunPowerDown(void) |
115 | __RAM_FUNC HAL_StatusTypeDef HAL_FLASHEx_EnableRunPowerDown(void) |
| 134 | { |
116 | { |
| 135 | /* Enable the Power Down in Run mode*/ |
117 | /* Enable the Power Down in Run mode*/ |
| 136 | __HAL_FLASH_POWER_DOWN_ENABLE(); |
118 | __HAL_FLASH_POWER_DOWN_ENABLE(); |
| 137 | 119 | ||
| 138 | return HAL_OK; |
120 | return HAL_OK; |
| Line 141... | Line 123... | ||
| 141 | /** |
123 | /** |
| 142 | * @brief Disable the power down mode during RUN mode. |
124 | * @brief Disable the power down mode during RUN mode. |
| 143 | * @note This function can be used only when the user code is running from Internal SRAM. |
125 | * @note This function can be used only when the user code is running from Internal SRAM. |
| 144 | * @retval HAL status |
126 | * @retval HAL status |
| 145 | */ |
127 | */ |
| 146 | __RAM_FUNC HAL_FLASHEx_DisableRunPowerDown(void) |
128 | __RAM_FUNC HAL_StatusTypeDef HAL_FLASHEx_DisableRunPowerDown(void) |
| 147 | { |
129 | { |
| 148 | /* Disable the Power Down in Run mode*/ |
130 | /* Disable the Power Down in Run mode*/ |
| 149 | __HAL_FLASH_POWER_DOWN_DISABLE(); |
131 | __HAL_FLASH_POWER_DOWN_DISABLE(); |
| 150 | 132 | ||
| 151 | return HAL_OK; |
133 | return HAL_OK; |
| Line 178... | Line 160... | ||
| 178 | * and FLASH_BANK2_END. |
160 | * and FLASH_BANK2_END. |
| 179 | * @note A Page is erased in the Program memory only if the address to load |
161 | * @note A Page is erased in the Program memory only if the address to load |
| 180 | * is the start address of a page (multiple of @ref FLASH_PAGE_SIZE bytes). |
162 | * is the start address of a page (multiple of @ref FLASH_PAGE_SIZE bytes). |
| 181 | * @retval HAL status |
163 | * @retval HAL status |
| 182 | */ |
164 | */ |
| 183 | __RAM_FUNC HAL_FLASHEx_EraseParallelPage(uint32_t Page_Address1, uint32_t Page_Address2) |
165 | __RAM_FUNC HAL_StatusTypeDef HAL_FLASHEx_EraseParallelPage(uint32_t Page_Address1, uint32_t Page_Address2) |
| 184 | { |
166 | { |
| 185 | HAL_StatusTypeDef status = HAL_OK; |
167 | HAL_StatusTypeDef status = HAL_OK; |
| 186 | 168 | ||
| 187 | /* Wait for last operation to be completed */ |
169 | /* Wait for last operation to be completed */ |
| 188 | status = FLASHRAM_WaitForLastOperation(FLASH_TIMEOUT_VALUE); |
170 | status = FLASHRAM_WaitForLastOperation(FLASH_TIMEOUT_VALUE); |
| Line 193... | Line 175... | ||
| 193 | SET_BIT(FLASH->PECR, FLASH_PECR_PARALLBANK); |
175 | SET_BIT(FLASH->PECR, FLASH_PECR_PARALLBANK); |
| 194 | SET_BIT(FLASH->PECR, FLASH_PECR_ERASE); |
176 | SET_BIT(FLASH->PECR, FLASH_PECR_ERASE); |
| 195 | SET_BIT(FLASH->PECR, FLASH_PECR_PROG); |
177 | SET_BIT(FLASH->PECR, FLASH_PECR_PROG); |
| 196 | 178 | ||
| 197 | /* Write 00000000h to the first word of the first program page to erase */ |
179 | /* Write 00000000h to the first word of the first program page to erase */ |
| 198 | *(__IO uint32_t *)Page_Address1 = 0x00000000; |
180 | *(__IO uint32_t *)Page_Address1 = 0x00000000U; |
| 199 | /* Write 00000000h to the first word of the second program page to erase */ |
181 | /* Write 00000000h to the first word of the second program page to erase */ |
| 200 | *(__IO uint32_t *)Page_Address2 = 0x00000000; |
182 | *(__IO uint32_t *)Page_Address2 = 0x00000000U; |
| 201 | 183 | ||
| 202 | /* Wait for last operation to be completed */ |
184 | /* Wait for last operation to be completed */ |
| 203 | status = FLASHRAM_WaitForLastOperation(FLASH_TIMEOUT_VALUE); |
185 | status = FLASHRAM_WaitForLastOperation(FLASH_TIMEOUT_VALUE); |
| 204 | 186 | ||
| 205 | /* If the erase operation is completed, disable the ERASE, PROG and PARALLBANK bits */ |
187 | /* If the erase operation is completed, disable the ERASE, PROG and PARALLBANK bits */ |
| Line 239... | Line 221... | ||
| 239 | * complete write operation is aborted. Software should then reset the |
221 | * complete write operation is aborted. Software should then reset the |
| 240 | * FPRG and PROG/DATA bits and restart the write operation from the |
222 | * FPRG and PROG/DATA bits and restart the write operation from the |
| 241 | * beginning. |
223 | * beginning. |
| 242 | * @retval HAL status |
224 | * @retval HAL status |
| 243 | */ |
225 | */ |
| 244 | __RAM_FUNC HAL_FLASHEx_ProgramParallelHalfPage(uint32_t Address1, uint32_t* pBuffer1, uint32_t Address2, uint32_t* pBuffer2) |
226 | __RAM_FUNC HAL_StatusTypeDef HAL_FLASHEx_ProgramParallelHalfPage(uint32_t Address1, uint32_t* pBuffer1, uint32_t Address2, uint32_t* pBuffer2) |
| 245 | { |
227 | { |
| - | 228 | uint32_t primask_bit; |
|
| 246 | uint32_t count = 0; |
229 | uint32_t count = 0U; |
| 247 | HAL_StatusTypeDef status = HAL_OK; |
230 | HAL_StatusTypeDef status = HAL_OK; |
| 248 | 231 | ||
| 249 | /* Set the DISMCYCINT[0] bit in the Auxillary Control Register (0xE000E008) |
- | |
| 250 | This bit prevents the interruption of multicycle instructions and therefore |
- | |
| 251 | will increase the interrupt latency. of Cortex-M3. */ |
- | |
| 252 | SET_BIT(SCnSCB->ACTLR, SCnSCB_ACTLR_DISMCYCINT_Msk); |
- | |
| 253 | - | ||
| 254 | /* Wait for last operation to be completed */ |
232 | /* Wait for last operation to be completed */ |
| 255 | status = FLASHRAM_WaitForLastOperation(FLASH_TIMEOUT_VALUE); |
233 | status = FLASHRAM_WaitForLastOperation(FLASH_TIMEOUT_VALUE); |
| 256 | 234 | ||
| 257 | if(status == HAL_OK) |
235 | if(status == HAL_OK) |
| 258 | { |
236 | { |
| - | 237 | /* Disable all IRQs */ |
|
| - | 238 | primask_bit = __get_PRIMASK(); |
|
| - | 239 | __disable_irq(); |
|
| - | 240 | ||
| 259 | /* Proceed to program the new half page */ |
241 | /* Proceed to program the new half page */ |
| 260 | SET_BIT(FLASH->PECR, FLASH_PECR_PARALLBANK); |
242 | SET_BIT(FLASH->PECR, FLASH_PECR_PARALLBANK); |
| 261 | SET_BIT(FLASH->PECR, FLASH_PECR_FPRG); |
243 | SET_BIT(FLASH->PECR, FLASH_PECR_FPRG); |
| 262 | SET_BIT(FLASH->PECR, FLASH_PECR_PROG); |
244 | SET_BIT(FLASH->PECR, FLASH_PECR_PROG); |
| 263 | 245 | ||
| 264 | /* Wait for last operation to be completed */ |
246 | /* Write the first half page directly with 32 different words */ |
| 265 | status = FLASHRAM_WaitForLastOperation(FLASH_TIMEOUT_VALUE); |
- | |
| 266 | if(status == HAL_OK) |
247 | while(count < 32U) |
| 267 | { |
248 | { |
| 268 | /* Disable all IRQs */ |
- | |
| 269 | __disable_irq(); |
- | |
| 270 | - | ||
| 271 | /* Write the first half page directly with 32 different words */ |
- | |
| 272 | while(count < 32) |
- | |
| 273 | { |
- | |
| 274 | *(__IO uint32_t*) ((uint32_t)(Address1 + (4 * count))) = *pBuffer1; |
249 | *(__IO uint32_t*) ((uint32_t)(Address1 + (4 * count))) = *pBuffer1; |
| 275 | pBuffer1++; |
250 | pBuffer1++; |
| 276 | count ++; |
- | |
| 277 | } |
- | |
| 278 | - | ||
| 279 | /* Write the second half page directly with 32 different words */ |
- | |
| 280 | count = 0; |
- | |
| 281 | while(count < 32) |
- | |
| 282 | { |
- | |
| 283 | *(__IO uint32_t*) ((uint32_t)(Address2 + (4 * count))) = *pBuffer2; |
- | |
| 284 | pBuffer2++; |
- | |
| 285 | count ++; |
251 | count ++; |
| 286 | } |
- | |
| 287 | - | ||
| 288 | /* Enable IRQs */ |
- | |
| 289 | __enable_irq(); |
- | |
| 290 | - | ||
| 291 | /* Wait for last operation to be completed */ |
- | |
| 292 | status = FLASHRAM_WaitForLastOperation(FLASH_TIMEOUT_VALUE); |
- | |
| 293 | } |
252 | } |
| 294 | 253 | ||
| - | 254 | /* Write the second half page directly with 32 different words */ |
|
| - | 255 | count = 0U; |
|
| - | 256 | while(count < 32U) |
|
| - | 257 | { |
|
| - | 258 | *(__IO uint32_t*) ((uint32_t)(Address2 + (4 * count))) = *pBuffer2; |
|
| - | 259 | pBuffer2++; |
|
| - | 260 | count ++; |
|
| - | 261 | } |
|
| - | 262 | ||
| - | 263 | /* Wait for last operation to be completed */ |
|
| - | 264 | status = FLASHRAM_WaitForLastOperation(FLASH_TIMEOUT_VALUE); |
|
| - | 265 | ||
| 295 | /* if the write operation is completed, disable the PROG, FPRG and PARALLBANK bits */ |
266 | /* if the write operation is completed, disable the PROG, FPRG and PARALLBANK bits */ |
| 296 | CLEAR_BIT(FLASH->PECR, FLASH_PECR_PROG); |
267 | CLEAR_BIT(FLASH->PECR, FLASH_PECR_PROG); |
| 297 | CLEAR_BIT(FLASH->PECR, FLASH_PECR_FPRG); |
268 | CLEAR_BIT(FLASH->PECR, FLASH_PECR_FPRG); |
| 298 | CLEAR_BIT(FLASH->PECR, FLASH_PECR_PARALLBANK); |
269 | CLEAR_BIT(FLASH->PECR, FLASH_PECR_PARALLBANK); |
| - | 270 | ||
| - | 271 | /* Enable IRQs */ |
|
| - | 272 | __set_PRIMASK(primask_bit); |
|
| 299 | } |
273 | } |
| 300 | 274 | ||
| 301 | CLEAR_BIT(SCnSCB->ACTLR, SCnSCB_ACTLR_DISMCYCINT_Msk); |
- | |
| 302 | - | ||
| 303 | /* Return the Write Status */ |
275 | /* Return the Write Status */ |
| 304 | return status; |
276 | return status; |
| 305 | } |
277 | } |
| 306 | #endif /* FLASH_PECR_PARALLBANK */ |
278 | #endif /* FLASH_PECR_PARALLBANK */ |
| 307 | 279 | ||
| 308 | /** |
280 | /** |
| 309 | * @brief Program a half page in program memory. |
281 | * @brief Program a half page in program memory. |
| 310 | * @param Address: specifies the address to be written. |
282 | * @param Address specifies the address to be written. |
| 311 | * @param pBuffer: pointer to the buffer containing the data to be written to |
283 | * @param pBuffer pointer to the buffer containing the data to be written to |
| 312 | * the half page. |
284 | * the half page. |
| 313 | * @note To correctly run this function, the @ref HAL_FLASH_Unlock() function |
285 | * @note To correctly run this function, the @ref HAL_FLASH_Unlock() function |
| 314 | * must be called before. |
286 | * must be called before. |
| 315 | * Call the @ref HAL_FLASH_Lock() to disable the flash memory access |
287 | * Call the @ref HAL_FLASH_Lock() to disable the flash memory access |
| 316 | * (recommended to protect the FLASH memory against possible unwanted operation) |
288 | * (recommended to protect the FLASH memory against possible unwanted operation) |
| Line 327... | Line 299... | ||
| 327 | * complete write operation is aborted. Software should then reset the |
299 | * complete write operation is aborted. Software should then reset the |
| 328 | * FPRG and PROG/DATA bits and restart the write operation from the |
300 | * FPRG and PROG/DATA bits and restart the write operation from the |
| 329 | * beginning. |
301 | * beginning. |
| 330 | * @retval HAL status |
302 | * @retval HAL status |
| 331 | */ |
303 | */ |
| 332 | __RAM_FUNC HAL_FLASHEx_HalfPageProgram(uint32_t Address, uint32_t* pBuffer) |
304 | __RAM_FUNC HAL_StatusTypeDef HAL_FLASHEx_HalfPageProgram(uint32_t Address, uint32_t* pBuffer) |
| 333 | { |
305 | { |
| - | 306 | uint32_t primask_bit; |
|
| 334 | uint32_t count = 0; |
307 | uint32_t count = 0U; |
| 335 | HAL_StatusTypeDef status = HAL_OK; |
308 | HAL_StatusTypeDef status = HAL_OK; |
| 336 | 309 | ||
| 337 | /* Set the DISMCYCINT[0] bit in the Auxillary Control Register (0xE000E008) |
- | |
| 338 | This bit prevents the interruption of multicycle instructions and therefore |
- | |
| 339 | will increase the interrupt latency. of Cortex-M3. */ |
- | |
| 340 | SET_BIT(SCnSCB->ACTLR, SCnSCB_ACTLR_DISMCYCINT_Msk); |
- | |
| 341 | - | ||
| 342 | /* Wait for last operation to be completed */ |
310 | /* Wait for last operation to be completed */ |
| 343 | status = FLASHRAM_WaitForLastOperation(FLASH_TIMEOUT_VALUE); |
311 | status = FLASHRAM_WaitForLastOperation(FLASH_TIMEOUT_VALUE); |
| 344 | 312 | ||
| 345 | if(status == HAL_OK) |
313 | if(status == HAL_OK) |
| 346 | { |
314 | { |
| - | 315 | /* Disable all IRQs */ |
|
| - | 316 | primask_bit = __get_PRIMASK(); |
|
| - | 317 | __disable_irq(); |
|
| - | 318 | ||
| 347 | /* Proceed to program the new half page */ |
319 | /* Proceed to program the new half page */ |
| 348 | SET_BIT(FLASH->PECR, FLASH_PECR_FPRG); |
320 | SET_BIT(FLASH->PECR, FLASH_PECR_FPRG); |
| 349 | SET_BIT(FLASH->PECR, FLASH_PECR_PROG); |
321 | SET_BIT(FLASH->PECR, FLASH_PECR_PROG); |
| 350 | 322 | ||
| 351 | /* Disable all IRQs */ |
- | |
| 352 | __disable_irq(); |
- | |
| 353 | - | ||
| 354 | /* Write one half page directly with 32 different words */ |
323 | /* Write one half page directly with 32 different words */ |
| 355 | while(count < 32) |
324 | while(count < 32U) |
| 356 | { |
325 | { |
| 357 | *(__IO uint32_t*) ((uint32_t)(Address + (4 * count))) = *pBuffer; |
326 | *(__IO uint32_t*) ((uint32_t)(Address + (4 * count))) = *pBuffer; |
| 358 | pBuffer++; |
327 | pBuffer++; |
| 359 | count ++; |
328 | count ++; |
| 360 | } |
329 | } |
| 361 | 330 | ||
| 362 | /* Enable IRQs */ |
- | |
| 363 | __enable_irq(); |
- | |
| 364 | - | ||
| 365 | /* Wait for last operation to be completed */ |
331 | /* Wait for last operation to be completed */ |
| 366 | status = FLASHRAM_WaitForLastOperation(FLASH_TIMEOUT_VALUE); |
332 | status = FLASHRAM_WaitForLastOperation(FLASH_TIMEOUT_VALUE); |
| 367 | 333 | ||
| 368 | /* If the write operation is completed, disable the PROG and FPRG bits */ |
334 | /* If the write operation is completed, disable the PROG and FPRG bits */ |
| 369 | CLEAR_BIT(FLASH->PECR, FLASH_PECR_PROG); |
335 | CLEAR_BIT(FLASH->PECR, FLASH_PECR_PROG); |
| 370 | CLEAR_BIT(FLASH->PECR, FLASH_PECR_FPRG); |
336 | CLEAR_BIT(FLASH->PECR, FLASH_PECR_FPRG); |
| 371 | } |
- | |
| 372 | 337 | ||
| - | 338 | /* Enable IRQs */ |
|
| 373 | CLEAR_BIT(SCnSCB->ACTLR, SCnSCB_ACTLR_DISMCYCINT_Msk); |
339 | __set_PRIMASK(primask_bit); |
| - | 340 | } |
|
| 374 | 341 | ||
| 375 | /* Return the Write Status */ |
342 | /* Return the Write Status */ |
| 376 | return status; |
343 | return status; |
| 377 | } |
344 | } |
| 378 | 345 | ||
| 379 | /** |
346 | /** |
| Line 424... | Line 391... | ||
| 424 | * @arg @ref HAL_FLASH_ERROR_PGA FLASH Programming Alignment error flag |
391 | * @arg @ref HAL_FLASH_ERROR_PGA FLASH Programming Alignment error flag |
| 425 | * @arg @ref HAL_FLASH_ERROR_WRP FLASH Write protected error flag |
392 | * @arg @ref HAL_FLASH_ERROR_WRP FLASH Write protected error flag |
| 426 | * @arg @ref HAL_FLASH_ERROR_OPTV FLASH Option valid error flag |
393 | * @arg @ref HAL_FLASH_ERROR_OPTV FLASH Option valid error flag |
| 427 | * @retval HAL Status |
394 | * @retval HAL Status |
| 428 | */ |
395 | */ |
| 429 | __RAM_FUNC HAL_FLASHEx_GetError(uint32_t * Error) |
396 | __RAM_FUNC HAL_StatusTypeDef HAL_FLASHEx_GetError(uint32_t * Error) |
| 430 | { |
397 | { |
| 431 | *Error = pFlash.ErrorCode; |
398 | *Error = pFlash.ErrorCode; |
| 432 | return HAL_OK; |
399 | return HAL_OK; |
| 433 | } |
400 | } |
| 434 | 401 | ||
| Line 441... | Line 408... | ||
| 441 | * @{ |
408 | * @{ |
| 442 | */ |
409 | */ |
| 443 | 410 | ||
| 444 | /** |
411 | /** |
| 445 | * @brief Erase a double word in data memory. |
412 | * @brief Erase a double word in data memory. |
| 446 | * @param Address: specifies the address to be erased. |
413 | * @param Address specifies the address to be erased. |
| 447 | * @note To correctly run this function, the HAL_FLASH_EEPROM_Unlock() function |
414 | * @note To correctly run this function, the HAL_FLASH_EEPROM_Unlock() function |
| 448 | * must be called before. |
415 | * must be called before. |
| 449 | * Call the HAL_FLASH_EEPROM_Lock() to he data EEPROM access |
416 | * Call the HAL_FLASH_EEPROM_Lock() to he data EEPROM access |
| 450 | * and Flash program erase control register access(recommended to protect |
417 | * and Flash program erase control register access(recommended to protect |
| 451 | * the DATA_EEPROM against possible unwanted operation). |
418 | * the DATA_EEPROM against possible unwanted operation). |
| Line 456... | Line 423... | ||
| 456 | * forbidden (this includes DMA read operations and debugger read |
423 | * forbidden (this includes DMA read operations and debugger read |
| 457 | * operations such as breakpoints, periodic updates, etc.). |
424 | * operations such as breakpoints, periodic updates, etc.). |
| 458 | * @retval HAL status |
425 | * @retval HAL status |
| 459 | */ |
426 | */ |
| 460 | 427 | ||
| 461 | __RAM_FUNC HAL_FLASHEx_DATAEEPROM_EraseDoubleWord(uint32_t Address) |
428 | __RAM_FUNC HAL_StatusTypeDef HAL_FLASHEx_DATAEEPROM_EraseDoubleWord(uint32_t Address) |
| 462 | { |
429 | { |
| - | 430 | uint32_t primask_bit; |
|
| 463 | HAL_StatusTypeDef status = HAL_OK; |
431 | HAL_StatusTypeDef status = HAL_OK; |
| 464 | 432 | ||
| 465 | /* Set the DISMCYCINT[0] bit in the Auxillary Control Register (0xE000E008) |
- | |
| 466 | This bit prevents the interruption of multicycle instructions and therefore |
- | |
| 467 | will increase the interrupt latency. of Cortex-M3. */ |
- | |
| 468 | SET_BIT(SCnSCB->ACTLR, SCnSCB_ACTLR_DISMCYCINT_Msk); |
- | |
| 469 | - | ||
| 470 | /* Wait for last operation to be completed */ |
433 | /* Wait for last operation to be completed */ |
| 471 | status = FLASHRAM_WaitForLastOperation(FLASH_TIMEOUT_VALUE); |
434 | status = FLASHRAM_WaitForLastOperation(FLASH_TIMEOUT_VALUE); |
| 472 | 435 | ||
| 473 | if(status == HAL_OK) |
436 | if(status == HAL_OK) |
| 474 | { |
437 | { |
| - | 438 | /* Disable all IRQs */ |
|
| - | 439 | primask_bit = __get_PRIMASK(); |
|
| - | 440 | __disable_irq(); |
|
| - | 441 | ||
| 475 | /* If the previous operation is completed, proceed to erase the next double word */ |
442 | /* If the previous operation is completed, proceed to erase the next double word */ |
| 476 | /* Set the ERASE bit */ |
443 | /* Set the ERASE bit */ |
| 477 | SET_BIT(FLASH->PECR, FLASH_PECR_ERASE); |
444 | SET_BIT(FLASH->PECR, FLASH_PECR_ERASE); |
| 478 | 445 | ||
| 479 | /* Set DATA bit */ |
446 | /* Set DATA bit */ |
| 480 | SET_BIT(FLASH->PECR, FLASH_PECR_DATA); |
447 | SET_BIT(FLASH->PECR, FLASH_PECR_DATA); |
| 481 | 448 | ||
| 482 | /* Write 00000000h to the 2 words to erase */ |
449 | /* Write 00000000h to the 2 words to erase */ |
| 483 | *(__IO uint32_t *)Address = 0x00000000; |
450 | *(__IO uint32_t *)Address = 0x00000000U; |
| 484 | Address += 4; |
451 | Address += 4U; |
| 485 | *(__IO uint32_t *)Address = 0x00000000; |
452 | *(__IO uint32_t *)Address = 0x00000000U; |
| 486 | 453 | ||
| 487 | /* Wait for last operation to be completed */ |
454 | /* Wait for last operation to be completed */ |
| 488 | status = FLASHRAM_WaitForLastOperation(FLASH_TIMEOUT_VALUE); |
455 | status = FLASHRAM_WaitForLastOperation(FLASH_TIMEOUT_VALUE); |
| 489 | 456 | ||
| 490 | /* If the erase operation is completed, disable the ERASE and DATA bits */ |
457 | /* If the erase operation is completed, disable the ERASE and DATA bits */ |
| 491 | CLEAR_BIT(FLASH->PECR, FLASH_PECR_ERASE); |
458 | CLEAR_BIT(FLASH->PECR, FLASH_PECR_ERASE); |
| 492 | CLEAR_BIT(FLASH->PECR, FLASH_PECR_DATA); |
459 | CLEAR_BIT(FLASH->PECR, FLASH_PECR_DATA); |
| - | 460 | ||
| - | 461 | /* Enable IRQs */ |
|
| - | 462 | __set_PRIMASK(primask_bit); |
|
| - | 463 | ||
| 493 | } |
464 | } |
| 494 | - | ||
| 495 | CLEAR_BIT(SCnSCB->ACTLR, SCnSCB_ACTLR_DISMCYCINT_Msk); |
- | |
| 496 | 465 | ||
| 497 | /* Return the erase status */ |
466 | /* Return the erase status */ |
| 498 | return status; |
467 | return status; |
| 499 | } |
468 | } |
| 500 | 469 | ||
| 501 | /** |
470 | /** |
| 502 | * @brief Write a double word in data memory without erase. |
471 | * @brief Write a double word in data memory without erase. |
| 503 | * @param Address: specifies the address to be written. |
472 | * @param Address specifies the address to be written. |
| 504 | * @param Data: specifies the data to be written. |
473 | * @param Data specifies the data to be written. |
| 505 | * @note To correctly run this function, the HAL_FLASH_EEPROM_Unlock() function |
474 | * @note To correctly run this function, the HAL_FLASH_EEPROM_Unlock() function |
| 506 | * must be called before. |
475 | * must be called before. |
| 507 | * Call the HAL_FLASH_EEPROM_Lock() to he data EEPROM access |
476 | * Call the HAL_FLASH_EEPROM_Lock() to he data EEPROM access |
| 508 | * and Flash program erase control register access(recommended to protect |
477 | * and Flash program erase control register access(recommended to protect |
| 509 | * the DATA_EEPROM against possible unwanted operation). |
478 | * the DATA_EEPROM against possible unwanted operation). |
| Line 514... | Line 483... | ||
| 514 | * @note During the Data memory double word write, all read operations are |
483 | * @note During the Data memory double word write, all read operations are |
| 515 | * forbidden (this includes DMA read operations and debugger read |
484 | * forbidden (this includes DMA read operations and debugger read |
| 516 | * operations such as breakpoints, periodic updates, etc.). |
485 | * operations such as breakpoints, periodic updates, etc.). |
| 517 | * @retval HAL status |
486 | * @retval HAL status |
| 518 | */ |
487 | */ |
| 519 | __RAM_FUNC HAL_FLASHEx_DATAEEPROM_ProgramDoubleWord(uint32_t Address, uint64_t Data) |
488 | __RAM_FUNC HAL_StatusTypeDef HAL_FLASHEx_DATAEEPROM_ProgramDoubleWord(uint32_t Address, uint64_t Data) |
| 520 | { |
489 | { |
| - | 490 | uint32_t primask_bit; |
|
| 521 | HAL_StatusTypeDef status = HAL_OK; |
491 | HAL_StatusTypeDef status = HAL_OK; |
| 522 | 492 | ||
| 523 | /* Set the DISMCYCINT[0] bit in the Auxillary Control Register (0xE000E008) |
- | |
| 524 | This bit prevents the interruption of multicycle instructions and therefore |
- | |
| 525 | will increase the interrupt latency. of Cortex-M3. */ |
- | |
| 526 | SET_BIT(SCnSCB->ACTLR, SCnSCB_ACTLR_DISMCYCINT_Msk); |
- | |
| 527 | - | ||
| 528 | /* Wait for last operation to be completed */ |
493 | /* Wait for last operation to be completed */ |
| 529 | status = FLASHRAM_WaitForLastOperation(FLASH_TIMEOUT_VALUE); |
494 | status = FLASHRAM_WaitForLastOperation(FLASH_TIMEOUT_VALUE); |
| 530 | 495 | ||
| 531 | if(status == HAL_OK) |
496 | if(status == HAL_OK) |
| 532 | { |
497 | { |
| - | 498 | /* Disable all IRQs */ |
|
| - | 499 | primask_bit = __get_PRIMASK(); |
|
| - | 500 | __disable_irq(); |
|
| - | 501 | ||
| 533 | /* If the previous operation is completed, proceed to program the new data*/ |
502 | /* If the previous operation is completed, proceed to program the new data*/ |
| 534 | SET_BIT(FLASH->PECR, FLASH_PECR_FPRG); |
503 | SET_BIT(FLASH->PECR, FLASH_PECR_FPRG); |
| 535 | SET_BIT(FLASH->PECR, FLASH_PECR_DATA); |
504 | SET_BIT(FLASH->PECR, FLASH_PECR_DATA); |
| 536 | 505 | ||
| 537 | /* Write the 2 words */ |
506 | /* Write the 2 words */ |
| 538 | *(__IO uint32_t *)Address = (uint32_t) Data; |
507 | *(__IO uint32_t *)Address = (uint32_t) Data; |
| 539 | Address += 4; |
508 | Address += 4U; |
| 540 | *(__IO uint32_t *)Address = (uint32_t) (Data >> 32); |
509 | *(__IO uint32_t *)Address = (uint32_t) (Data >> 32); |
| 541 | 510 | ||
| 542 | /* Wait for last operation to be completed */ |
511 | /* Wait for last operation to be completed */ |
| 543 | status = FLASHRAM_WaitForLastOperation(FLASH_TIMEOUT_VALUE); |
512 | status = FLASHRAM_WaitForLastOperation(FLASH_TIMEOUT_VALUE); |
| 544 | 513 | ||
| 545 | /* If the write operation is completed, disable the FPRG and DATA bits */ |
514 | /* If the write operation is completed, disable the FPRG and DATA bits */ |
| 546 | CLEAR_BIT(FLASH->PECR, FLASH_PECR_FPRG); |
515 | CLEAR_BIT(FLASH->PECR, FLASH_PECR_FPRG); |
| 547 | CLEAR_BIT(FLASH->PECR, FLASH_PECR_DATA); |
516 | CLEAR_BIT(FLASH->PECR, FLASH_PECR_DATA); |
| - | 517 | ||
| - | 518 | /* Enable IRQs */ |
|
| - | 519 | __set_PRIMASK(primask_bit); |
|
| 548 | } |
520 | } |
| 549 | - | ||
| 550 | CLEAR_BIT(SCnSCB->ACTLR, SCnSCB_ACTLR_DISMCYCINT_Msk); |
- | |
| 551 | 521 | ||
| 552 | /* Return the Write Status */ |
522 | /* Return the Write Status */ |
| 553 | return status; |
523 | return status; |
| 554 | } |
524 | } |
| 555 | 525 | ||
| 556 | /** |
526 | /** |
| Line 567... | Line 537... | ||
| 567 | 537 | ||
| 568 | /** |
538 | /** |
| 569 | * @brief Set the specific FLASH error flag. |
539 | * @brief Set the specific FLASH error flag. |
| 570 | * @retval HAL Status |
540 | * @retval HAL Status |
| 571 | */ |
541 | */ |
| 572 | static __RAM_FUNC FLASHRAM_SetErrorCode(void) |
542 | static __RAM_FUNC HAL_StatusTypeDef FLASHRAM_SetErrorCode(void) |
| 573 | { |
543 | { |
| 574 | uint32_t flags = 0; |
544 | uint32_t flags = 0U; |
| 575 | 545 | ||
| 576 | if(__HAL_FLASH_GET_FLAG(FLASH_FLAG_WRPERR)) |
546 | if(__HAL_FLASH_GET_FLAG(FLASH_FLAG_WRPERR)) |
| 577 | { |
547 | { |
| 578 | pFlash.ErrorCode |= HAL_FLASH_ERROR_WRP; |
548 | pFlash.ErrorCode |= HAL_FLASH_ERROR_WRP; |
| 579 | flags |= FLASH_FLAG_WRPERR; |
549 | flags |= FLASH_FLAG_WRPERR; |
| Line 610... | Line 580... | ||
| 610 | return HAL_OK; |
580 | return HAL_OK; |
| 611 | } |
581 | } |
| 612 | 582 | ||
| 613 | /** |
583 | /** |
| 614 | * @brief Wait for a FLASH operation to complete. |
584 | * @brief Wait for a FLASH operation to complete. |
| 615 | * @param Timeout: maximum flash operationtimeout |
585 | * @param Timeout maximum flash operationtimeout |
| 616 | * @retval HAL status |
586 | * @retval HAL status |
| 617 | */ |
587 | */ |
| 618 | static __RAM_FUNC FLASHRAM_WaitForLastOperation(uint32_t Timeout) |
588 | static __RAM_FUNC HAL_StatusTypeDef FLASHRAM_WaitForLastOperation(uint32_t Timeout) |
| 619 | { |
589 | { |
| 620 | /* Wait for the FLASH operation to complete by polling on BUSY flag to be reset. |
590 | /* Wait for the FLASH operation to complete by polling on BUSY flag to be reset. |
| 621 | Even if the FLASH operation fails, the BUSY flag will be reset and an error |
591 | Even if the FLASH operation fails, the BUSY flag will be reset and an error |
| 622 | flag will be set */ |
592 | flag will be set */ |
| 623 | 593 | ||
| 624 | while(__HAL_FLASH_GET_FLAG(FLASH_FLAG_BSY) && (Timeout != 0x00)) |
594 | while(__HAL_FLASH_GET_FLAG(FLASH_FLAG_BSY) && (Timeout != 0x00U)) |
| 625 | { |
595 | { |
| 626 | Timeout--; |
596 | Timeout--; |
| 627 | } |
597 | } |
| 628 | 598 | ||
| 629 | if(Timeout == 0x00 ) |
599 | if(Timeout == 0x00U) |
| 630 | { |
600 | { |
| 631 | return HAL_TIMEOUT; |
601 | return HAL_TIMEOUT; |
| 632 | } |
602 | } |
| 633 | 603 | ||
| 634 | /* Check FLASH End of Operation flag */ |
604 | /* Check FLASH End of Operation flag */ |