fix LPC812 PWM

Dependents:   IR_LED_Send

Fork of mbed-dev by mbed official

Committer:
nameless129
Date:
Mon May 16 16:50:30 2016 +0000
Revision:
129:2e517c56bcfb
Parent:
0:9b334a45a8ff
PWM Fix:Duty 0%??H???????????????

Who changed what in which revision?

UserRevisionLine numberNew contents of line
bogdanm 0:9b334a45a8ff 1 /**
bogdanm 0:9b334a45a8ff 2 ******************************************************************************
bogdanm 0:9b334a45a8ff 3 * @file stm32l1xx_hal_flash_ex.c
bogdanm 0:9b334a45a8ff 4 * @author MCD Application Team
bogdanm 0:9b334a45a8ff 5 * @version V1.0.0
bogdanm 0:9b334a45a8ff 6 * @date 5-September-2014
bogdanm 0:9b334a45a8ff 7 * @brief FLASH HAL module driver.
bogdanm 0:9b334a45a8ff 8 * This file provides firmware functions to manage the following
bogdanm 0:9b334a45a8ff 9 * functionalities of the internal FLASH memory:
bogdanm 0:9b334a45a8ff 10 * + FLASH Interface configuration
bogdanm 0:9b334a45a8ff 11 * + FLASH Memory Erasing
bogdanm 0:9b334a45a8ff 12 * + DATA EEPROM Programming/Erasing
bogdanm 0:9b334a45a8ff 13 * + Option Bytes Programming
bogdanm 0:9b334a45a8ff 14 * + Interrupts management
bogdanm 0:9b334a45a8ff 15 *
bogdanm 0:9b334a45a8ff 16 * @verbatim
bogdanm 0:9b334a45a8ff 17 ==============================================================================
bogdanm 0:9b334a45a8ff 18 ##### Flash peripheral Extended features #####
bogdanm 0:9b334a45a8ff 19 ==============================================================================
bogdanm 0:9b334a45a8ff 20
bogdanm 0:9b334a45a8ff 21 [..] Comparing to other products, the FLASH interface for STM32L1xx
bogdanm 0:9b334a45a8ff 22 devices contains the following additional features
bogdanm 0:9b334a45a8ff 23 (+) Erase functions
bogdanm 0:9b334a45a8ff 24 (+) DATA_EEPROM memory management
bogdanm 0:9b334a45a8ff 25 (+) BOOT option bit configuration
bogdanm 0:9b334a45a8ff 26 (+) PCROP protection for all sectors
bogdanm 0:9b334a45a8ff 27
bogdanm 0:9b334a45a8ff 28 ##### How to use this driver #####
bogdanm 0:9b334a45a8ff 29 ==============================================================================
bogdanm 0:9b334a45a8ff 30 [..] This driver provides functions to configure and program the FLASH memory
bogdanm 0:9b334a45a8ff 31 of all STM32L1xx. It includes:
bogdanm 0:9b334a45a8ff 32 (+) Full DATA_EEPROM erase and program management
bogdanm 0:9b334a45a8ff 33 (+) Boot activation
bogdanm 0:9b334a45a8ff 34 (+) PCROP protection configuration and control for all pages
bogdanm 0:9b334a45a8ff 35
bogdanm 0:9b334a45a8ff 36 @endverbatim
bogdanm 0:9b334a45a8ff 37 ******************************************************************************
bogdanm 0:9b334a45a8ff 38 * @attention
bogdanm 0:9b334a45a8ff 39 *
bogdanm 0:9b334a45a8ff 40 * <h2><center>&copy; COPYRIGHT(c) 2014 STMicroelectronics</center></h2>
bogdanm 0:9b334a45a8ff 41 *
bogdanm 0:9b334a45a8ff 42 * Redistribution and use in source and binary forms, with or without modification,
bogdanm 0:9b334a45a8ff 43 * are permitted provided that the following conditions are met:
bogdanm 0:9b334a45a8ff 44 * 1. Redistributions of source code must retain the above copyright notice,
bogdanm 0:9b334a45a8ff 45 * this list of conditions and the following disclaimer.
bogdanm 0:9b334a45a8ff 46 * 2. Redistributions in binary form must reproduce the above copyright notice,
bogdanm 0:9b334a45a8ff 47 * this list of conditions and the following disclaimer in the documentation
bogdanm 0:9b334a45a8ff 48 * and/or other materials provided with the distribution.
bogdanm 0:9b334a45a8ff 49 * 3. Neither the name of STMicroelectronics nor the names of its contributors
bogdanm 0:9b334a45a8ff 50 * may be used to endorse or promote products derived from this software
bogdanm 0:9b334a45a8ff 51 * without specific prior written permission.
bogdanm 0:9b334a45a8ff 52 *
bogdanm 0:9b334a45a8ff 53 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
bogdanm 0:9b334a45a8ff 54 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
bogdanm 0:9b334a45a8ff 55 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
bogdanm 0:9b334a45a8ff 56 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
bogdanm 0:9b334a45a8ff 57 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
bogdanm 0:9b334a45a8ff 58 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
bogdanm 0:9b334a45a8ff 59 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
bogdanm 0:9b334a45a8ff 60 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
bogdanm 0:9b334a45a8ff 61 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
bogdanm 0:9b334a45a8ff 62 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
bogdanm 0:9b334a45a8ff 63 *
bogdanm 0:9b334a45a8ff 64 ******************************************************************************
bogdanm 0:9b334a45a8ff 65 */
bogdanm 0:9b334a45a8ff 66
bogdanm 0:9b334a45a8ff 67 /* Includes ------------------------------------------------------------------*/
bogdanm 0:9b334a45a8ff 68 #include "stm32l1xx_hal.h"
bogdanm 0:9b334a45a8ff 69
bogdanm 0:9b334a45a8ff 70 /** @addtogroup STM32L1xx_HAL_Driver
bogdanm 0:9b334a45a8ff 71 * @{
bogdanm 0:9b334a45a8ff 72 */
bogdanm 0:9b334a45a8ff 73
bogdanm 0:9b334a45a8ff 74 /** @defgroup FLASHEx FLASHEx
bogdanm 0:9b334a45a8ff 75 * @brief FLASH HAL Extension module driver
bogdanm 0:9b334a45a8ff 76 * @{
bogdanm 0:9b334a45a8ff 77 */
bogdanm 0:9b334a45a8ff 78
bogdanm 0:9b334a45a8ff 79 #ifdef HAL_FLASH_MODULE_ENABLED
bogdanm 0:9b334a45a8ff 80
bogdanm 0:9b334a45a8ff 81 /* Private typedef -----------------------------------------------------------*/
bogdanm 0:9b334a45a8ff 82 /* Private define ------------------------------------------------------------*/
bogdanm 0:9b334a45a8ff 83 /* Private macro -------------------------------------------------------------*/
bogdanm 0:9b334a45a8ff 84 /* Private variables ---------------------------------------------------------*/
bogdanm 0:9b334a45a8ff 85 /* Private function prototypes -----------------------------------------------*/
bogdanm 0:9b334a45a8ff 86 static void FLASH_SetErrorCode(void);
bogdanm 0:9b334a45a8ff 87 static void FLASH_ErasePage(uint32_t PageAddress);
bogdanm 0:9b334a45a8ff 88
bogdanm 0:9b334a45a8ff 89 static HAL_StatusTypeDef FLASH_OB_WRPConfig(FLASH_OBProgramInitTypeDef *pOBInit, FunctionalState NewState);
bogdanm 0:9b334a45a8ff 90 static void FLASH_OB_WRPConfigWRP1OrPCROP1(uint32_t WRP1OrPCROP1, FunctionalState NewState);
bogdanm 0:9b334a45a8ff 91 #if defined(STM32L100xC) || defined (STM32L151xC) || defined (STM32L152xC) || defined (STM32L162xC) || \
bogdanm 0:9b334a45a8ff 92 defined(STM32L151xCA) || defined (STM32L151xD) || defined (STM32L152xCA) || defined (STM32L152xD) || defined (STM32L162xCA) || defined (STM32L162xD) || \
bogdanm 0:9b334a45a8ff 93 defined(STM32L151xE) || defined (STM32L152xE) || defined (STM32L162xE)
bogdanm 0:9b334a45a8ff 94 static void FLASH_OB_WRPConfigWRP2OrPCROP2(uint32_t WRP2OrPCROP2, FunctionalState NewState);
bogdanm 0:9b334a45a8ff 95 #endif /* STM32L100xC || STM32L151xC || STM32L152xC || STM32L162xC || STM32L151xCA || STM32L151xD || STM32L152xCA || STM32L152xD || STM32L162xCA || STM32L162xD || STM32L151xE || STM32L152xE || STM32L162xE */
bogdanm 0:9b334a45a8ff 96 #if defined (STM32L151xD) || defined (STM32L152xD) || defined (STM32L162xD) || \
bogdanm 0:9b334a45a8ff 97 defined(STM32L151xE) || defined (STM32L152xE) || defined (STM32L162xE)
bogdanm 0:9b334a45a8ff 98 static void FLASH_OB_WRPConfigWRP3(uint32_t WRP3, FunctionalState NewState);
bogdanm 0:9b334a45a8ff 99 #endif /* STM32L151xD || STM32L152xD || STM32L162xD || STM32L151xE || STM32L152xE || STM32L162xE */
bogdanm 0:9b334a45a8ff 100 #if defined(STM32L151xE) || defined (STM32L152xE) || defined (STM32L162xE)
bogdanm 0:9b334a45a8ff 101 static void FLASH_OB_WRPConfigWRP4(uint32_t WRP4, FunctionalState NewState);
bogdanm 0:9b334a45a8ff 102 #endif /* STM32L151xE || STM32L152xE || STM32L162xE */
bogdanm 0:9b334a45a8ff 103 static HAL_StatusTypeDef FLASH_OB_RDPConfig(uint8_t OB_RDP);
bogdanm 0:9b334a45a8ff 104 static HAL_StatusTypeDef FLASH_OB_UserConfig(uint8_t OB_IWDG, uint8_t OB_STOP, uint8_t OB_STDBY);
bogdanm 0:9b334a45a8ff 105 static HAL_StatusTypeDef FLASH_OB_BORConfig(uint8_t OB_BOR);
bogdanm 0:9b334a45a8ff 106 static uint8_t FLASH_OB_GetRDP(void);
bogdanm 0:9b334a45a8ff 107 static uint8_t FLASH_OB_GetUser(void);
bogdanm 0:9b334a45a8ff 108 static uint8_t FLASH_OB_GetBOR(void);
bogdanm 0:9b334a45a8ff 109 #if defined (STM32L151xBA) || defined (STM32L152xBA) || \
bogdanm 0:9b334a45a8ff 110 defined (STM32L151xC) || defined (STM32L152xC) || defined (STM32L162xC)
bogdanm 0:9b334a45a8ff 111 static HAL_StatusTypeDef FLASH_OB_PCROPConfig(FLASH_AdvOBProgramInitTypeDef *pAdvOBInit, FunctionalState NewState);
bogdanm 0:9b334a45a8ff 112 #endif /* STM32L151xBA || STM32L152xBA || STM32L151xC || STM32L152xC || STM32L162xC */
bogdanm 0:9b334a45a8ff 113 #if defined (STM32L151xD) || defined (STM32L152xD) || defined (STM32L162xD) || \
bogdanm 0:9b334a45a8ff 114 defined(STM32L151xE) || defined (STM32L152xE) || defined (STM32L162xE)
bogdanm 0:9b334a45a8ff 115 static HAL_StatusTypeDef FLASH_OB_BootConfig(uint8_t OB_BOOT);
bogdanm 0:9b334a45a8ff 116 #endif /* STM32L151xD || STM32L152xD || STM32L162xD || STM32L151xE || STM32L152xE || STM32L162xE */
bogdanm 0:9b334a45a8ff 117
bogdanm 0:9b334a45a8ff 118 static HAL_StatusTypeDef FLASH_DATAEEPROM_FastProgramByte(uint32_t Address, uint8_t Data);
bogdanm 0:9b334a45a8ff 119 static HAL_StatusTypeDef FLASH_DATAEEPROM_FastProgramHalfWord(uint32_t Address, uint16_t Data);
bogdanm 0:9b334a45a8ff 120 static HAL_StatusTypeDef FLASH_DATAEEPROM_FastProgramWord(uint32_t Address, uint32_t Data);
bogdanm 0:9b334a45a8ff 121 static HAL_StatusTypeDef FLASH_DATAEEPROM_ProgramWord(uint32_t Address, uint32_t Data);
bogdanm 0:9b334a45a8ff 122 static HAL_StatusTypeDef FLASH_DATAEEPROM_ProgramHalfWord(uint32_t Address, uint16_t Data);
bogdanm 0:9b334a45a8ff 123 static HAL_StatusTypeDef FLASH_DATAEEPROM_ProgramByte(uint32_t Address, uint8_t Data);
bogdanm 0:9b334a45a8ff 124
bogdanm 0:9b334a45a8ff 125 /* Exported functions ---------------------------------------------------------*/
bogdanm 0:9b334a45a8ff 126
bogdanm 0:9b334a45a8ff 127 /** @defgroup FLASHEx_Exported_Functions FLASHEx Exported functions
bogdanm 0:9b334a45a8ff 128 * @{
bogdanm 0:9b334a45a8ff 129 */
bogdanm 0:9b334a45a8ff 130
bogdanm 0:9b334a45a8ff 131 /** @defgroup FLASHEx_Exported_Functions_Group1 FLASH Memory Erasing functions
bogdanm 0:9b334a45a8ff 132 * @brief FLASH Memory Erasing functions
bogdanm 0:9b334a45a8ff 133 *
bogdanm 0:9b334a45a8ff 134 @verbatim
bogdanm 0:9b334a45a8ff 135 ==============================================================================
bogdanm 0:9b334a45a8ff 136 ##### FLASH Erasing Programming functions #####
bogdanm 0:9b334a45a8ff 137 ==============================================================================
bogdanm 0:9b334a45a8ff 138
bogdanm 0:9b334a45a8ff 139 [..] The FLASH Memory Erasing functions, includes the following functions:
bogdanm 0:9b334a45a8ff 140 (+) HAL_FLASHEx_Erase: return only when erase has been done
bogdanm 0:9b334a45a8ff 141 (+) HAL_FLASHEx_Erase_IT: end of erase is done when HAL_FLASH_EndOfOperationCallback is called with parameter
bogdanm 0:9b334a45a8ff 142 0xFFFFFFFF
bogdanm 0:9b334a45a8ff 143
bogdanm 0:9b334a45a8ff 144 [..] Any operation of erase should follow these steps:
bogdanm 0:9b334a45a8ff 145 (#) Call the HAL_FLASH_Unlock() function to enable the flash control register and
bogdanm 0:9b334a45a8ff 146 program memory access.
bogdanm 0:9b334a45a8ff 147 (#) Call the desired function to erase page.
bogdanm 0:9b334a45a8ff 148 (#) Call the HAL_FLASH_Lock() to disable the flash program memory access
bogdanm 0:9b334a45a8ff 149 (recommended to protect the FLASH memory against possible unwanted operation).
bogdanm 0:9b334a45a8ff 150
bogdanm 0:9b334a45a8ff 151 @endverbatim
bogdanm 0:9b334a45a8ff 152 * @{
bogdanm 0:9b334a45a8ff 153 */
bogdanm 0:9b334a45a8ff 154
bogdanm 0:9b334a45a8ff 155 /**
bogdanm 0:9b334a45a8ff 156 * @brief Erase the specified FLASH memory Pages
bogdanm 0:9b334a45a8ff 157 * @note To correctly run this function, the HAL_FLASH_Unlock() function
bogdanm 0:9b334a45a8ff 158 * must be called before.
bogdanm 0:9b334a45a8ff 159 * Call the HAL_FLASH_Lock() to disable the flash memory access
bogdanm 0:9b334a45a8ff 160 * (recommended to protect the FLASH memory against possible unwanted operation)
bogdanm 0:9b334a45a8ff 161 * @param[in] pEraseInit: pointer to an FLASH_EraseInitTypeDef structure that
bogdanm 0:9b334a45a8ff 162 * contains the configuration information for the erasing.
bogdanm 0:9b334a45a8ff 163 *
bogdanm 0:9b334a45a8ff 164 * @param[out] PageError: pointer to variable that
bogdanm 0:9b334a45a8ff 165 * contains the configuration information on faulty sector in case of error
bogdanm 0:9b334a45a8ff 166 * (0xFFFFFFFF means that all the sectors have been correctly erased)
bogdanm 0:9b334a45a8ff 167 *
bogdanm 0:9b334a45a8ff 168 * @retval HAL_StatusTypeDef HAL Status
bogdanm 0:9b334a45a8ff 169 */
bogdanm 0:9b334a45a8ff 170 HAL_StatusTypeDef HAL_FLASHEx_Erase(FLASH_EraseInitTypeDef *pEraseInit, uint32_t *PageError)
bogdanm 0:9b334a45a8ff 171 {
bogdanm 0:9b334a45a8ff 172 HAL_StatusTypeDef status = HAL_ERROR;
bogdanm 0:9b334a45a8ff 173 uint32_t index = 0;
bogdanm 0:9b334a45a8ff 174
bogdanm 0:9b334a45a8ff 175 /* Process Locked */
bogdanm 0:9b334a45a8ff 176 __HAL_LOCK(&ProcFlash);
bogdanm 0:9b334a45a8ff 177
bogdanm 0:9b334a45a8ff 178 /* Wait for last operation to be completed */
bogdanm 0:9b334a45a8ff 179 status = FLASH_WaitForLastOperation((uint32_t)HAL_FLASH_TIMEOUT_VALUE);
bogdanm 0:9b334a45a8ff 180
bogdanm 0:9b334a45a8ff 181 if (status == HAL_OK)
bogdanm 0:9b334a45a8ff 182 {
bogdanm 0:9b334a45a8ff 183 /*Initialization of PageError variable*/
bogdanm 0:9b334a45a8ff 184 *PageError = 0xFFFFFFFF;
bogdanm 0:9b334a45a8ff 185
bogdanm 0:9b334a45a8ff 186 /* Check the parameters */
bogdanm 0:9b334a45a8ff 187 assert_param(IS_NBPAGES(pEraseInit->NbPages));
bogdanm 0:9b334a45a8ff 188 assert_param(IS_TYPEERASE(pEraseInit->TypeErase));
bogdanm 0:9b334a45a8ff 189 assert_param(IS_FLASH_PROGRAM_ADDRESS(pEraseInit->PageAddress));
bogdanm 0:9b334a45a8ff 190 assert_param(IS_FLASH_PROGRAM_ADDRESS(pEraseInit->PageAddress + pEraseInit->NbPages * FLASH_PAGE_SIZE - 1));
bogdanm 0:9b334a45a8ff 191
bogdanm 0:9b334a45a8ff 192 /* Erase by sector by sector to be done*/
bogdanm 0:9b334a45a8ff 193 for(index = pEraseInit->PageAddress; index < ((pEraseInit->NbPages * FLASH_PAGE_SIZE)+ pEraseInit->PageAddress); index += FLASH_PAGE_SIZE)
bogdanm 0:9b334a45a8ff 194 {
bogdanm 0:9b334a45a8ff 195 FLASH_ErasePage(index);
bogdanm 0:9b334a45a8ff 196
bogdanm 0:9b334a45a8ff 197 /* Wait for last operation to be completed */
bogdanm 0:9b334a45a8ff 198 status = FLASH_WaitForLastOperation((uint32_t)HAL_FLASH_TIMEOUT_VALUE);
bogdanm 0:9b334a45a8ff 199
bogdanm 0:9b334a45a8ff 200 /* If the erase operation is completed, disable the ERASE Bit */
bogdanm 0:9b334a45a8ff 201 CLEAR_BIT(FLASH->PECR, FLASH_PECR_PROG);
bogdanm 0:9b334a45a8ff 202 CLEAR_BIT(FLASH->PECR, FLASH_PECR_ERASE);
bogdanm 0:9b334a45a8ff 203
bogdanm 0:9b334a45a8ff 204 if (status != HAL_OK)
bogdanm 0:9b334a45a8ff 205 {
bogdanm 0:9b334a45a8ff 206 /* In case of error, stop erase procedure and return the faulty sector*/
bogdanm 0:9b334a45a8ff 207 *PageError = index;
bogdanm 0:9b334a45a8ff 208 break;
bogdanm 0:9b334a45a8ff 209 }
bogdanm 0:9b334a45a8ff 210 }
bogdanm 0:9b334a45a8ff 211 }
bogdanm 0:9b334a45a8ff 212
bogdanm 0:9b334a45a8ff 213 /* Process Unlocked */
bogdanm 0:9b334a45a8ff 214 __HAL_UNLOCK(&ProcFlash);
bogdanm 0:9b334a45a8ff 215
bogdanm 0:9b334a45a8ff 216 return status;
bogdanm 0:9b334a45a8ff 217 }
bogdanm 0:9b334a45a8ff 218
bogdanm 0:9b334a45a8ff 219 /**
bogdanm 0:9b334a45a8ff 220 * @brief Perform a page erase of the specified FLASH memory pages with interrupt enabled
bogdanm 0:9b334a45a8ff 221 * @note To correctly run this function, the HAL_FLASH_Unlock() function
bogdanm 0:9b334a45a8ff 222 * must be called before.
bogdanm 0:9b334a45a8ff 223 * Call the HAL_FLASH_Lock() to disable the flash memory access
bogdanm 0:9b334a45a8ff 224 * (recommended to protect the FLASH memory against possible unwanted operation)
bogdanm 0:9b334a45a8ff 225 * @param pEraseInit: pointer to an FLASH_EraseInitTypeDef structure that
bogdanm 0:9b334a45a8ff 226 * contains the configuration information for the erasing.
bogdanm 0:9b334a45a8ff 227 *
bogdanm 0:9b334a45a8ff 228 * @retval HAL_StatusTypeDef HAL Status
bogdanm 0:9b334a45a8ff 229 */
bogdanm 0:9b334a45a8ff 230 HAL_StatusTypeDef HAL_FLASHEx_Erase_IT(FLASH_EraseInitTypeDef *pEraseInit)
bogdanm 0:9b334a45a8ff 231 {
bogdanm 0:9b334a45a8ff 232 HAL_StatusTypeDef status = HAL_OK;
bogdanm 0:9b334a45a8ff 233
bogdanm 0:9b334a45a8ff 234 /* Process Locked */
bogdanm 0:9b334a45a8ff 235 __HAL_LOCK(&ProcFlash);
bogdanm 0:9b334a45a8ff 236
bogdanm 0:9b334a45a8ff 237 /* Enable End of FLASH Operation interrupt */
bogdanm 0:9b334a45a8ff 238 __HAL_FLASH_ENABLE_IT(FLASH_IT_EOP);
bogdanm 0:9b334a45a8ff 239
bogdanm 0:9b334a45a8ff 240 /* Enable Error source interrupt */
bogdanm 0:9b334a45a8ff 241 __HAL_FLASH_ENABLE_IT(FLASH_IT_ERR);
bogdanm 0:9b334a45a8ff 242
bogdanm 0:9b334a45a8ff 243 /* Clear pending flags (if any) */
bogdanm 0:9b334a45a8ff 244 __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_MASK);
bogdanm 0:9b334a45a8ff 245
bogdanm 0:9b334a45a8ff 246 /* Check the parameters */
bogdanm 0:9b334a45a8ff 247 assert_param(IS_NBPAGES(pEraseInit->NbPages));
bogdanm 0:9b334a45a8ff 248 assert_param(IS_TYPEERASE(pEraseInit->TypeErase));
bogdanm 0:9b334a45a8ff 249 assert_param(IS_FLASH_PROGRAM_ADDRESS(pEraseInit->PageAddress));
bogdanm 0:9b334a45a8ff 250 assert_param(IS_FLASH_PROGRAM_ADDRESS(pEraseInit->PageAddress + pEraseInit->NbPages * FLASH_PAGE_SIZE - 1));
bogdanm 0:9b334a45a8ff 251
bogdanm 0:9b334a45a8ff 252 ProcFlash.ProcedureOnGoing = FLASH_PROC_PAGEERASE;
bogdanm 0:9b334a45a8ff 253 ProcFlash.NbPagesToErase = pEraseInit->NbPages;
bogdanm 0:9b334a45a8ff 254 ProcFlash.Page = pEraseInit->PageAddress;
bogdanm 0:9b334a45a8ff 255
bogdanm 0:9b334a45a8ff 256 /*Erase 1st page and wait for IT*/
bogdanm 0:9b334a45a8ff 257 FLASH_ErasePage(pEraseInit->PageAddress);
bogdanm 0:9b334a45a8ff 258
bogdanm 0:9b334a45a8ff 259 return status;
bogdanm 0:9b334a45a8ff 260 }
bogdanm 0:9b334a45a8ff 261
bogdanm 0:9b334a45a8ff 262 /**
bogdanm 0:9b334a45a8ff 263 * @}
bogdanm 0:9b334a45a8ff 264 */
bogdanm 0:9b334a45a8ff 265
bogdanm 0:9b334a45a8ff 266
bogdanm 0:9b334a45a8ff 267 /** @defgroup FLASHEx_Exported_Functions_Group2 Option Bytes Programming functions
bogdanm 0:9b334a45a8ff 268 * @brief Option Bytes Programming functions
bogdanm 0:9b334a45a8ff 269 *
bogdanm 0:9b334a45a8ff 270 @verbatim
bogdanm 0:9b334a45a8ff 271 ==============================================================================
bogdanm 0:9b334a45a8ff 272 ##### Option Bytes Programming functions #####
bogdanm 0:9b334a45a8ff 273 ==============================================================================
bogdanm 0:9b334a45a8ff 274
bogdanm 0:9b334a45a8ff 275 [..] Any operation of erase or program should follow these steps:
bogdanm 0:9b334a45a8ff 276 (#) Call the HAL_FLASH_OB_Unlock() function to enable the Flash option control
bogdanm 0:9b334a45a8ff 277 register access.
bogdanm 0:9b334a45a8ff 278 (#) Call following function to program the desired option bytes.
bogdanm 0:9b334a45a8ff 279 (++) HAL_FLASHEx_OBProgram:
bogdanm 0:9b334a45a8ff 280 - To Enable/Disable the desired sector write protection.
bogdanm 0:9b334a45a8ff 281 - To set the desired read Protection Level.
bogdanm 0:9b334a45a8ff 282 - To configure the user option Bytes: IWDG, STOP and the Standby.
bogdanm 0:9b334a45a8ff 283 - To Set the BOR level.
bogdanm 0:9b334a45a8ff 284 (#) Once all needed option bytes to be programmed are correctly written, call the
bogdanm 0:9b334a45a8ff 285 HAL_FLASH_OB_Launch(void) function to launch the Option Bytes programming process.
bogdanm 0:9b334a45a8ff 286 (#) Call the HAL_FLASH_OB_Lock() to disable the Flash option control register access (recommended
bogdanm 0:9b334a45a8ff 287 to protect the option Bytes against possible unwanted operations).
bogdanm 0:9b334a45a8ff 288
bogdanm 0:9b334a45a8ff 289 [..] Proprietary code Read Out Protection (PcROP):
bogdanm 0:9b334a45a8ff 290 (#) The PcROP sector is selected by using the same option bytes as the Write
bogdanm 0:9b334a45a8ff 291 protection (nWRPi bits). As a result, these 2 options are exclusive each other.
bogdanm 0:9b334a45a8ff 292 (#) In order to activate the PcROP (change the function of the nWRPi option bits),
bogdanm 0:9b334a45a8ff 293 the SPRMOD option bit must be activated.
bogdanm 0:9b334a45a8ff 294 (#) The active value of nWRPi bits is inverted when PCROP mode is active, this
bogdanm 0:9b334a45a8ff 295 means: if SPRMOD = 1 and nWRPi = 1 (default value), then the user sector "i"
bogdanm 0:9b334a45a8ff 296 is read/write protected.
bogdanm 0:9b334a45a8ff 297 (#) To activate PCROP mode for Flash sector(s), you need to call the following function:
bogdanm 0:9b334a45a8ff 298 (++) HAL_FLASHEx_AdvOBProgram in selecting sectors to be read/write protected
bogdanm 0:9b334a45a8ff 299 (++) HAL_FLASHEx_OB_SelectPCROP to enable the read/write protection
bogdanm 0:9b334a45a8ff 300 (#) PcROP is available only in STM32L151xBA, STM32L152xBA, STM32L151xC, STM32L152xC & STM32L162xC devices.
bogdanm 0:9b334a45a8ff 301
bogdanm 0:9b334a45a8ff 302 @endverbatim
bogdanm 0:9b334a45a8ff 303 * @{
bogdanm 0:9b334a45a8ff 304 */
bogdanm 0:9b334a45a8ff 305
bogdanm 0:9b334a45a8ff 306 /**
bogdanm 0:9b334a45a8ff 307 * @brief Program option bytes
bogdanm 0:9b334a45a8ff 308 * @param pOBInit: pointer to an FLASH_OBInitStruct structure that
bogdanm 0:9b334a45a8ff 309 * contains the configuration information for the programming.
bogdanm 0:9b334a45a8ff 310 *
bogdanm 0:9b334a45a8ff 311 * @retval HAL_StatusTypeDef HAL Status
bogdanm 0:9b334a45a8ff 312 */
bogdanm 0:9b334a45a8ff 313 HAL_StatusTypeDef HAL_FLASHEx_OBProgram(FLASH_OBProgramInitTypeDef *pOBInit)
bogdanm 0:9b334a45a8ff 314 {
bogdanm 0:9b334a45a8ff 315 HAL_StatusTypeDef status = HAL_ERROR;
bogdanm 0:9b334a45a8ff 316
bogdanm 0:9b334a45a8ff 317 /* Process Locked */
bogdanm 0:9b334a45a8ff 318 __HAL_LOCK(&ProcFlash);
bogdanm 0:9b334a45a8ff 319
bogdanm 0:9b334a45a8ff 320 /* Check the parameters */
bogdanm 0:9b334a45a8ff 321 assert_param(IS_OPTIONBYTE(pOBInit->OptionType));
bogdanm 0:9b334a45a8ff 322
bogdanm 0:9b334a45a8ff 323 /*Write protection configuration*/
bogdanm 0:9b334a45a8ff 324 if((pOBInit->OptionType & OPTIONBYTE_WRP) == OPTIONBYTE_WRP)
bogdanm 0:9b334a45a8ff 325 {
bogdanm 0:9b334a45a8ff 326 assert_param(IS_WRPSTATE(pOBInit->WRPState));
bogdanm 0:9b334a45a8ff 327 if (pOBInit->WRPState == WRPSTATE_ENABLE)
bogdanm 0:9b334a45a8ff 328 {
bogdanm 0:9b334a45a8ff 329 /* Enable of Write protection on the selected Sector*/
bogdanm 0:9b334a45a8ff 330 status = FLASH_OB_WRPConfig(pOBInit, ENABLE);
bogdanm 0:9b334a45a8ff 331 }
bogdanm 0:9b334a45a8ff 332 else
bogdanm 0:9b334a45a8ff 333 {
bogdanm 0:9b334a45a8ff 334 /* Disable of Write protection on the selected Sector*/
bogdanm 0:9b334a45a8ff 335 status = FLASH_OB_WRPConfig(pOBInit, DISABLE);
bogdanm 0:9b334a45a8ff 336 }
bogdanm 0:9b334a45a8ff 337 if (status != HAL_OK)
bogdanm 0:9b334a45a8ff 338 {
bogdanm 0:9b334a45a8ff 339 /* Process Unlocked */
bogdanm 0:9b334a45a8ff 340 __HAL_UNLOCK(&ProcFlash);
bogdanm 0:9b334a45a8ff 341 return status;
bogdanm 0:9b334a45a8ff 342 }
bogdanm 0:9b334a45a8ff 343 }
bogdanm 0:9b334a45a8ff 344
bogdanm 0:9b334a45a8ff 345 /* Read protection configuration*/
bogdanm 0:9b334a45a8ff 346 if((pOBInit->OptionType & OPTIONBYTE_RDP) == OPTIONBYTE_RDP)
bogdanm 0:9b334a45a8ff 347 {
bogdanm 0:9b334a45a8ff 348 status = FLASH_OB_RDPConfig(pOBInit->RDPLevel);
bogdanm 0:9b334a45a8ff 349 if (status != HAL_OK)
bogdanm 0:9b334a45a8ff 350 {
bogdanm 0:9b334a45a8ff 351 /* Process Unlocked */
bogdanm 0:9b334a45a8ff 352 __HAL_UNLOCK(&ProcFlash);
bogdanm 0:9b334a45a8ff 353 return status;
bogdanm 0:9b334a45a8ff 354 }
bogdanm 0:9b334a45a8ff 355 }
bogdanm 0:9b334a45a8ff 356
bogdanm 0:9b334a45a8ff 357 /* USER configuration*/
bogdanm 0:9b334a45a8ff 358 if((pOBInit->OptionType & OPTIONBYTE_USER) == OPTIONBYTE_USER)
bogdanm 0:9b334a45a8ff 359 {
bogdanm 0:9b334a45a8ff 360 status = FLASH_OB_UserConfig(pOBInit->USERConfig & OB_IWDG_SW,
bogdanm 0:9b334a45a8ff 361 pOBInit->USERConfig & OB_STOP_NORST,
bogdanm 0:9b334a45a8ff 362 pOBInit->USERConfig & OB_STDBY_NORST);
bogdanm 0:9b334a45a8ff 363 if (status != HAL_OK)
bogdanm 0:9b334a45a8ff 364 {
bogdanm 0:9b334a45a8ff 365 /* Process Unlocked */
bogdanm 0:9b334a45a8ff 366 __HAL_UNLOCK(&ProcFlash);
bogdanm 0:9b334a45a8ff 367 return status;
bogdanm 0:9b334a45a8ff 368 }
bogdanm 0:9b334a45a8ff 369 }
bogdanm 0:9b334a45a8ff 370
bogdanm 0:9b334a45a8ff 371 /* BOR Level configuration*/
bogdanm 0:9b334a45a8ff 372 if((pOBInit->OptionType & OPTIONBYTE_BOR) == OPTIONBYTE_BOR)
bogdanm 0:9b334a45a8ff 373 {
bogdanm 0:9b334a45a8ff 374 status = FLASH_OB_BORConfig(pOBInit->BORLevel);
bogdanm 0:9b334a45a8ff 375 }
bogdanm 0:9b334a45a8ff 376 /* Process Unlocked */
bogdanm 0:9b334a45a8ff 377 __HAL_UNLOCK(&ProcFlash);
bogdanm 0:9b334a45a8ff 378
bogdanm 0:9b334a45a8ff 379 return status;
bogdanm 0:9b334a45a8ff 380 }
bogdanm 0:9b334a45a8ff 381
bogdanm 0:9b334a45a8ff 382 /**
bogdanm 0:9b334a45a8ff 383 * @brief Get the Option byte configuration
bogdanm 0:9b334a45a8ff 384 * @param pOBInit: pointer to an FLASH_OBInitStruct structure that
bogdanm 0:9b334a45a8ff 385 * contains the configuration information for the programming.
bogdanm 0:9b334a45a8ff 386 *
bogdanm 0:9b334a45a8ff 387 * @retval None
bogdanm 0:9b334a45a8ff 388 */
bogdanm 0:9b334a45a8ff 389 void HAL_FLASHEx_OBGetConfig(FLASH_OBProgramInitTypeDef *pOBInit)
bogdanm 0:9b334a45a8ff 390 {
bogdanm 0:9b334a45a8ff 391 pOBInit->OptionType = OPTIONBYTE_WRP | OPTIONBYTE_RDP | OPTIONBYTE_USER | OPTIONBYTE_BOR;
bogdanm 0:9b334a45a8ff 392
bogdanm 0:9b334a45a8ff 393 /*Get WRP1*/
bogdanm 0:9b334a45a8ff 394 pOBInit->WRPSector0To31 = (uint32_t)(FLASH->WRPR1);
bogdanm 0:9b334a45a8ff 395
bogdanm 0:9b334a45a8ff 396 #if defined(STM32L100xC) || defined (STM32L151xC) || defined (STM32L152xC) || defined (STM32L162xC) || \
bogdanm 0:9b334a45a8ff 397 defined(STM32L151xCA) || defined (STM32L151xD) || defined (STM32L152xCA) || defined (STM32L152xD) || defined (STM32L162xCA) || defined (STM32L162xD) || \
bogdanm 0:9b334a45a8ff 398 defined(STM32L151xE) || defined (STM32L152xE) || defined (STM32L162xE)
bogdanm 0:9b334a45a8ff 399
bogdanm 0:9b334a45a8ff 400 /*Get WRP2*/
bogdanm 0:9b334a45a8ff 401 pOBInit->WRPSector32To63 = (uint32_t)(FLASH->WRPR2);
bogdanm 0:9b334a45a8ff 402
bogdanm 0:9b334a45a8ff 403 #endif /* STM32L100xC || STM32L151xC || STM32L152xC || STM32L162xC || STM32L151xCA || STM32L151xD || STM32L152xCA || STM32L152xD || STM32L162xCA || STM32L162xD || STM32L151xE || STM32L152xE || STM32L162xE */
bogdanm 0:9b334a45a8ff 404
bogdanm 0:9b334a45a8ff 405 #if defined (STM32L151xD) || defined (STM32L152xD) || defined (STM32L162xD) || \
bogdanm 0:9b334a45a8ff 406 defined(STM32L151xE) || defined (STM32L152xE) || defined (STM32L162xE)
bogdanm 0:9b334a45a8ff 407
bogdanm 0:9b334a45a8ff 408 /*Get WRP3*/
bogdanm 0:9b334a45a8ff 409 pOBInit->WRPSector64To95 = (uint32_t)(FLASH->WRPR3);
bogdanm 0:9b334a45a8ff 410
bogdanm 0:9b334a45a8ff 411 #endif /* STM32L151xD || STM32L152xD || STM32L162xD || STM32L151xE || STM32L152xE || STM32L162xE */
bogdanm 0:9b334a45a8ff 412
bogdanm 0:9b334a45a8ff 413 #if defined(STM32L151xE) || defined (STM32L152xE) || defined (STM32L162xE)
bogdanm 0:9b334a45a8ff 414
bogdanm 0:9b334a45a8ff 415 /*Get WRP4*/
bogdanm 0:9b334a45a8ff 416 pOBInit->WRPSector96To127 = (uint32_t)(FLASH->WRPR4);
bogdanm 0:9b334a45a8ff 417
bogdanm 0:9b334a45a8ff 418 #endif /* STM32L151xE || STM32L152xE || STM32L162xE */
bogdanm 0:9b334a45a8ff 419
bogdanm 0:9b334a45a8ff 420 /*Get RDP Level*/
bogdanm 0:9b334a45a8ff 421 pOBInit->RDPLevel = FLASH_OB_GetRDP();
bogdanm 0:9b334a45a8ff 422
bogdanm 0:9b334a45a8ff 423 /*Get USER*/
bogdanm 0:9b334a45a8ff 424 pOBInit->USERConfig = FLASH_OB_GetUser();
bogdanm 0:9b334a45a8ff 425
bogdanm 0:9b334a45a8ff 426 /*Get BOR Level*/
bogdanm 0:9b334a45a8ff 427 pOBInit->BORLevel = FLASH_OB_GetBOR();
bogdanm 0:9b334a45a8ff 428
bogdanm 0:9b334a45a8ff 429 }
bogdanm 0:9b334a45a8ff 430
bogdanm 0:9b334a45a8ff 431 #if defined (STM32L151xBA) || defined (STM32L152xBA) || \
bogdanm 0:9b334a45a8ff 432 defined (STM32L151xC) || defined (STM32L152xC) || defined (STM32L162xC) || \
bogdanm 0:9b334a45a8ff 433 defined (STM32L151xD) || defined (STM32L152xD) || defined (STM32L162xD) || \
bogdanm 0:9b334a45a8ff 434 defined(STM32L151xE) || defined (STM32L152xE) || defined (STM32L162xE)
bogdanm 0:9b334a45a8ff 435
bogdanm 0:9b334a45a8ff 436 /**
bogdanm 0:9b334a45a8ff 437 * @brief Program option bytes
bogdanm 0:9b334a45a8ff 438 * @note This function can be used only for Cat2 & Cat3 devices for PCROP and Cat4 & Cat5 for BFB2.
bogdanm 0:9b334a45a8ff 439 * @param pAdvOBInit: pointer to an FLASH_AdvOBProgramInitTypeDef structure that
bogdanm 0:9b334a45a8ff 440 * contains the configuration information for the programming.
bogdanm 0:9b334a45a8ff 441 *
bogdanm 0:9b334a45a8ff 442 * @retval HAL_StatusTypeDef HAL Status
bogdanm 0:9b334a45a8ff 443 */
bogdanm 0:9b334a45a8ff 444 HAL_StatusTypeDef HAL_FLASHEx_AdvOBProgram (FLASH_AdvOBProgramInitTypeDef *pAdvOBInit)
bogdanm 0:9b334a45a8ff 445 {
bogdanm 0:9b334a45a8ff 446 HAL_StatusTypeDef status = HAL_ERROR;
bogdanm 0:9b334a45a8ff 447
bogdanm 0:9b334a45a8ff 448 /* Check the parameters */
bogdanm 0:9b334a45a8ff 449 assert_param(IS_OBEX(pAdvOBInit->OptionType));
bogdanm 0:9b334a45a8ff 450
bogdanm 0:9b334a45a8ff 451 #if defined (STM32L151xBA) || defined (STM32L152xBA) || \
bogdanm 0:9b334a45a8ff 452 defined (STM32L151xC) || defined (STM32L152xC) || defined (STM32L162xC)
bogdanm 0:9b334a45a8ff 453
bogdanm 0:9b334a45a8ff 454 /* Cat2 & Cat3 devices only */
bogdanm 0:9b334a45a8ff 455 /*Program PCROP option byte*/
bogdanm 0:9b334a45a8ff 456 if ((pAdvOBInit->OptionType & OBEX_PCROP) == OBEX_PCROP)
bogdanm 0:9b334a45a8ff 457 {
bogdanm 0:9b334a45a8ff 458 /* Check the parameters */
bogdanm 0:9b334a45a8ff 459 assert_param(IS_PCROPSTATE(pAdvOBInit->PCROPState));
bogdanm 0:9b334a45a8ff 460 if (pAdvOBInit->PCROPState == PCROPSTATE_ENABLE)
bogdanm 0:9b334a45a8ff 461 {
bogdanm 0:9b334a45a8ff 462 /*Enable of Write protection on the selected Sector*/
bogdanm 0:9b334a45a8ff 463 status = FLASH_OB_PCROPConfig(pAdvOBInit, ENABLE);
bogdanm 0:9b334a45a8ff 464 if (status != HAL_OK)
bogdanm 0:9b334a45a8ff 465 {
bogdanm 0:9b334a45a8ff 466 return status;
bogdanm 0:9b334a45a8ff 467 }
bogdanm 0:9b334a45a8ff 468 }
bogdanm 0:9b334a45a8ff 469 else
bogdanm 0:9b334a45a8ff 470 {
bogdanm 0:9b334a45a8ff 471 /*Disable of Write protection on the selected Sector*/
bogdanm 0:9b334a45a8ff 472 status = FLASH_OB_PCROPConfig(pAdvOBInit, DISABLE);
bogdanm 0:9b334a45a8ff 473 if (status != HAL_OK)
bogdanm 0:9b334a45a8ff 474 {
bogdanm 0:9b334a45a8ff 475 return status;
bogdanm 0:9b334a45a8ff 476 }
bogdanm 0:9b334a45a8ff 477 }
bogdanm 0:9b334a45a8ff 478 }
bogdanm 0:9b334a45a8ff 479
bogdanm 0:9b334a45a8ff 480 #endif /* STM32L151xBA || STM32L152xBA || STM32L151xC || STM32L152xC || STM32L162xC */
bogdanm 0:9b334a45a8ff 481
bogdanm 0:9b334a45a8ff 482 #if defined (STM32L151xD) || defined (STM32L152xD) || defined (STM32L162xD) || \
bogdanm 0:9b334a45a8ff 483 defined(STM32L151xE) || defined (STM32L152xE) || defined (STM32L162xE)
bogdanm 0:9b334a45a8ff 484
bogdanm 0:9b334a45a8ff 485 /* Cat4 & Cat5 devices only */
bogdanm 0:9b334a45a8ff 486 /*Program BOOT config option byte*/
bogdanm 0:9b334a45a8ff 487 if ((pAdvOBInit->OptionType & OBEX_BOOTCONFIG) == OBEX_BOOTCONFIG)
bogdanm 0:9b334a45a8ff 488 {
bogdanm 0:9b334a45a8ff 489 status = FLASH_OB_BootConfig(pAdvOBInit->BootConfig);
bogdanm 0:9b334a45a8ff 490 }
bogdanm 0:9b334a45a8ff 491
bogdanm 0:9b334a45a8ff 492 #endif /* STM32L151xD || STM32L152xD || STM32L162xD || STM32L151xE || STM32L152xE || STM32L162xE */
bogdanm 0:9b334a45a8ff 493
bogdanm 0:9b334a45a8ff 494 return status;
bogdanm 0:9b334a45a8ff 495 }
bogdanm 0:9b334a45a8ff 496
bogdanm 0:9b334a45a8ff 497 /**
bogdanm 0:9b334a45a8ff 498 * @brief Get the OBEX byte configuration
bogdanm 0:9b334a45a8ff 499 * @note This function can be used only for Cat2 & Cat3 devices for PCROP and Cat4 & Cat5 for BFB2.
bogdanm 0:9b334a45a8ff 500 * @param pAdvOBInit: pointer to an FLASH_AdvOBProgramInitTypeDef structure that
bogdanm 0:9b334a45a8ff 501 * contains the configuration information for the programming.
bogdanm 0:9b334a45a8ff 502 *
bogdanm 0:9b334a45a8ff 503 * @retval None
bogdanm 0:9b334a45a8ff 504 */
bogdanm 0:9b334a45a8ff 505 void HAL_FLASHEx_AdvOBGetConfig(FLASH_AdvOBProgramInitTypeDef *pAdvOBInit)
bogdanm 0:9b334a45a8ff 506 {
bogdanm 0:9b334a45a8ff 507 #if defined (STM32L151xBA) || defined (STM32L152xBA) || \
bogdanm 0:9b334a45a8ff 508 defined (STM32L151xC) || defined (STM32L152xC) || defined (STM32L162xC)
bogdanm 0:9b334a45a8ff 509
bogdanm 0:9b334a45a8ff 510 pAdvOBInit->OptionType = OBEX_PCROP;
bogdanm 0:9b334a45a8ff 511
bogdanm 0:9b334a45a8ff 512 /*Get PCROP state */
bogdanm 0:9b334a45a8ff 513 pAdvOBInit->PCROPState = (FLASH->OBR & FLASH_OBR_SPRMOD) >> POSITION_VAL(FLASH_OBR_SPRMOD);
bogdanm 0:9b334a45a8ff 514
bogdanm 0:9b334a45a8ff 515 /*Get PCROP protected sector from 0 to 31 */
bogdanm 0:9b334a45a8ff 516 pAdvOBInit->PCROPSector0To31 = FLASH->WRPR1;
bogdanm 0:9b334a45a8ff 517
bogdanm 0:9b334a45a8ff 518 #if defined(STM32L100xC) || defined (STM32L151xC) || defined (STM32L152xC) || defined (STM32L162xC)
bogdanm 0:9b334a45a8ff 519
bogdanm 0:9b334a45a8ff 520 /*Get PCROP protected sector from 32 to 63 */
bogdanm 0:9b334a45a8ff 521 pAdvOBInit->PCROPSector32To63 = FLASH->WRPR2;
bogdanm 0:9b334a45a8ff 522
bogdanm 0:9b334a45a8ff 523 #endif /* STM32L100xC || STM32L151xC || STM32L152xC || STM32L162xC */
bogdanm 0:9b334a45a8ff 524
bogdanm 0:9b334a45a8ff 525 #endif /* STM32L151xBA || STM32L152xBA || STM32L151xC || STM32L152xC || STM32L162xC */
bogdanm 0:9b334a45a8ff 526
bogdanm 0:9b334a45a8ff 527 #if defined (STM32L151xD) || defined (STM32L152xD) || defined (STM32L162xD) || \
bogdanm 0:9b334a45a8ff 528 defined(STM32L151xE) || defined (STM32L152xE) || defined (STM32L162xE)
bogdanm 0:9b334a45a8ff 529
bogdanm 0:9b334a45a8ff 530 pAdvOBInit->OptionType = OBEX_BOOTCONFIG;
bogdanm 0:9b334a45a8ff 531
bogdanm 0:9b334a45a8ff 532 /*Get Boot config OB*/
bogdanm 0:9b334a45a8ff 533 pAdvOBInit->BootConfig = (FLASH->OBR & 0x80000000) >> 24;
bogdanm 0:9b334a45a8ff 534
bogdanm 0:9b334a45a8ff 535 #endif /* STM32L151xD || STM32L152xD || STM32L162xD || STM32L151xE || STM32L152xE || STM32L162xE */
bogdanm 0:9b334a45a8ff 536 }
bogdanm 0:9b334a45a8ff 537
bogdanm 0:9b334a45a8ff 538 #endif /* STM32L151xBA || STM32L152xBA || STM32L151xC || STM32L152xC || STM32L162xC || STM32L151xD || STM32L152xD || STM32L162xD || STM32L151xE || STM32L152xE || STM32L162xE */
bogdanm 0:9b334a45a8ff 539
bogdanm 0:9b334a45a8ff 540 #if defined (STM32L151xBA) || defined (STM32L152xBA) || \
bogdanm 0:9b334a45a8ff 541 defined (STM32L151xC) || defined (STM32L152xC) || defined (STM32L162xC)
bogdanm 0:9b334a45a8ff 542
bogdanm 0:9b334a45a8ff 543 /**
bogdanm 0:9b334a45a8ff 544 * @brief Select the Protection Mode (SPRMOD).
bogdanm 0:9b334a45a8ff 545 * @note This function can be used only for STM32L151xBA, STM32L152xBA, STM32L151xC, STM32L152xC & STM32L162xC devices
bogdanm 0:9b334a45a8ff 546 * @note Once SPRMOD bit is active, unprotection of a protected sector is not possible
bogdanm 0:9b334a45a8ff 547 * @note Read a protected sector will set RDERR Flag and write a protected sector will set WRPERR Flag
bogdanm 0:9b334a45a8ff 548 * @retval HAL status
bogdanm 0:9b334a45a8ff 549 */
bogdanm 0:9b334a45a8ff 550 HAL_StatusTypeDef HAL_FLASHEx_OB_SelectPCROP(void)
bogdanm 0:9b334a45a8ff 551 {
bogdanm 0:9b334a45a8ff 552 HAL_StatusTypeDef status = HAL_OK;
bogdanm 0:9b334a45a8ff 553 uint16_t tmp1 = 0;
bogdanm 0:9b334a45a8ff 554 uint32_t tmp2 = 0;
bogdanm 0:9b334a45a8ff 555 uint8_t optiontmp = 0;
bogdanm 0:9b334a45a8ff 556 uint16_t optiontmp2 = 0;
bogdanm 0:9b334a45a8ff 557
bogdanm 0:9b334a45a8ff 558 status = FLASH_WaitForLastOperation(HAL_FLASH_TIMEOUT_VALUE);
bogdanm 0:9b334a45a8ff 559
bogdanm 0:9b334a45a8ff 560 /* Mask RDP Byte */
bogdanm 0:9b334a45a8ff 561 optiontmp = (uint8_t)(*(__IO uint8_t *)(OB_BASE));
bogdanm 0:9b334a45a8ff 562
bogdanm 0:9b334a45a8ff 563 /* Update Option Byte */
bogdanm 0:9b334a45a8ff 564 optiontmp2 = (uint16_t)(OB_PCROP_SELECTED | optiontmp);
bogdanm 0:9b334a45a8ff 565
bogdanm 0:9b334a45a8ff 566 /* calculate the option byte to write */
bogdanm 0:9b334a45a8ff 567 tmp1 = (uint16_t)(~(optiontmp2 ));
bogdanm 0:9b334a45a8ff 568 tmp2 = (uint32_t)(((uint32_t)((uint32_t)(tmp1) << 16)) | ((uint32_t)optiontmp2));
bogdanm 0:9b334a45a8ff 569
bogdanm 0:9b334a45a8ff 570 if(status == HAL_OK)
bogdanm 0:9b334a45a8ff 571 {
bogdanm 0:9b334a45a8ff 572 /* program PCRop */
bogdanm 0:9b334a45a8ff 573 OB->RDP = tmp2;
bogdanm 0:9b334a45a8ff 574 }
bogdanm 0:9b334a45a8ff 575
bogdanm 0:9b334a45a8ff 576 /* Wait for last operation to be completed */
bogdanm 0:9b334a45a8ff 577 status = FLASH_WaitForLastOperation(HAL_FLASH_TIMEOUT_VALUE);
bogdanm 0:9b334a45a8ff 578
bogdanm 0:9b334a45a8ff 579 /* Return the Read protection operation Status */
bogdanm 0:9b334a45a8ff 580 return status;
bogdanm 0:9b334a45a8ff 581 }
bogdanm 0:9b334a45a8ff 582
bogdanm 0:9b334a45a8ff 583 /**
bogdanm 0:9b334a45a8ff 584 * @brief Deselect the Protection Mode (SPRMOD).
bogdanm 0:9b334a45a8ff 585 * @note This function can be used only for STM32L151xBA, STM32L152xBA, STM32L151xC, STM32L152xC & STM32L162xC devices
bogdanm 0:9b334a45a8ff 586 * @note Once SPRMOD bit is active, unprotection of a protected sector is not possible
bogdanm 0:9b334a45a8ff 587 * @note Read a protected sector will set RDERR Flag and write a protected sector will set WRPERR Flag
bogdanm 0:9b334a45a8ff 588 * @retval HAL status
bogdanm 0:9b334a45a8ff 589 */
bogdanm 0:9b334a45a8ff 590 HAL_StatusTypeDef HAL_FLASHEx_OB_DeSelectPCROP(void)
bogdanm 0:9b334a45a8ff 591 {
bogdanm 0:9b334a45a8ff 592 HAL_StatusTypeDef status = HAL_OK;
bogdanm 0:9b334a45a8ff 593 uint16_t tmp1 = 0;
bogdanm 0:9b334a45a8ff 594 uint32_t tmp2 = 0;
bogdanm 0:9b334a45a8ff 595 uint8_t optiontmp = 0;
bogdanm 0:9b334a45a8ff 596 uint16_t optiontmp2 = 0;
bogdanm 0:9b334a45a8ff 597
bogdanm 0:9b334a45a8ff 598 status = FLASH_WaitForLastOperation(HAL_FLASH_TIMEOUT_VALUE);
bogdanm 0:9b334a45a8ff 599
bogdanm 0:9b334a45a8ff 600 /* Mask RDP Byte */
bogdanm 0:9b334a45a8ff 601 optiontmp = (uint8_t)(*(__IO uint8_t *)(OB_BASE));
bogdanm 0:9b334a45a8ff 602
bogdanm 0:9b334a45a8ff 603 /* Update Option Byte */
bogdanm 0:9b334a45a8ff 604 optiontmp2 = (uint16_t)(OB_PCROP_DESELECTED | optiontmp);
bogdanm 0:9b334a45a8ff 605
bogdanm 0:9b334a45a8ff 606 /* calculate the option byte to write */
bogdanm 0:9b334a45a8ff 607 tmp1 = (uint16_t)(~(optiontmp2 ));
bogdanm 0:9b334a45a8ff 608 tmp2 = (uint32_t)(((uint32_t)((uint32_t)(tmp1) << 16)) | ((uint32_t)optiontmp2));
bogdanm 0:9b334a45a8ff 609
bogdanm 0:9b334a45a8ff 610 if(status == HAL_OK)
bogdanm 0:9b334a45a8ff 611 {
bogdanm 0:9b334a45a8ff 612 /* program PCRop */
bogdanm 0:9b334a45a8ff 613 OB->RDP = tmp2;
bogdanm 0:9b334a45a8ff 614 }
bogdanm 0:9b334a45a8ff 615
bogdanm 0:9b334a45a8ff 616 /* Wait for last operation to be completed */
bogdanm 0:9b334a45a8ff 617 status = FLASH_WaitForLastOperation(HAL_FLASH_TIMEOUT_VALUE);
bogdanm 0:9b334a45a8ff 618
bogdanm 0:9b334a45a8ff 619 /* Return the Read protection operation Status */
bogdanm 0:9b334a45a8ff 620 return status;
bogdanm 0:9b334a45a8ff 621 }
bogdanm 0:9b334a45a8ff 622
bogdanm 0:9b334a45a8ff 623 #endif /* STM32L151xBA || STM32L152xBA || STM32L151xC || STM32L152xC || STM32L162xC */
bogdanm 0:9b334a45a8ff 624
bogdanm 0:9b334a45a8ff 625 /**
bogdanm 0:9b334a45a8ff 626 * @}
bogdanm 0:9b334a45a8ff 627 */
bogdanm 0:9b334a45a8ff 628
bogdanm 0:9b334a45a8ff 629 /** @defgroup FLASHEx_Exported_Functions_Group3 DATA EEPROM Programming functions
bogdanm 0:9b334a45a8ff 630 * @brief DATA EEPROM Programming functions
bogdanm 0:9b334a45a8ff 631 *
bogdanm 0:9b334a45a8ff 632 @verbatim
bogdanm 0:9b334a45a8ff 633 ===============================================================================
bogdanm 0:9b334a45a8ff 634 ##### DATA EEPROM Programming functions #####
bogdanm 0:9b334a45a8ff 635 ===============================================================================
bogdanm 0:9b334a45a8ff 636
bogdanm 0:9b334a45a8ff 637 [..] Any operation of erase or program should follow these steps:
bogdanm 0:9b334a45a8ff 638 (#) Call the HAL_FLASHEx_DATAEEPROM_Unlock() function to enable the data EEPROM access
bogdanm 0:9b334a45a8ff 639 and Flash program erase control register access.
bogdanm 0:9b334a45a8ff 640 (#) Call the desired function to erase or program data.
bogdanm 0:9b334a45a8ff 641 (#) Call the HAL_FLASHEx_DATAEEPROM_Lock() to disable the data EEPROM access
bogdanm 0:9b334a45a8ff 642 and Flash program erase control register access(recommended
bogdanm 0:9b334a45a8ff 643 to protect the DATA_EEPROM against possible unwanted operation).
bogdanm 0:9b334a45a8ff 644
bogdanm 0:9b334a45a8ff 645 @endverbatim
bogdanm 0:9b334a45a8ff 646 * @{
bogdanm 0:9b334a45a8ff 647 */
bogdanm 0:9b334a45a8ff 648
bogdanm 0:9b334a45a8ff 649 /**
bogdanm 0:9b334a45a8ff 650 * @brief Unlocks the data memory and FLASH_PECR register access.
bogdanm 0:9b334a45a8ff 651 * @retval HAL_StatusTypeDef HAL Status
bogdanm 0:9b334a45a8ff 652 */
bogdanm 0:9b334a45a8ff 653 HAL_StatusTypeDef HAL_FLASHEx_DATAEEPROM_Unlock(void)
bogdanm 0:9b334a45a8ff 654 {
bogdanm 0:9b334a45a8ff 655 if((FLASH->PECR & FLASH_PECR_PELOCK) != RESET)
bogdanm 0:9b334a45a8ff 656 {
bogdanm 0:9b334a45a8ff 657 /* Unlocking the Data memory and FLASH_PECR register access*/
bogdanm 0:9b334a45a8ff 658 FLASH->PEKEYR = FLASH_PEKEY1;
bogdanm 0:9b334a45a8ff 659 FLASH->PEKEYR = FLASH_PEKEY2;
bogdanm 0:9b334a45a8ff 660 }
bogdanm 0:9b334a45a8ff 661 else
bogdanm 0:9b334a45a8ff 662 {
bogdanm 0:9b334a45a8ff 663 return HAL_ERROR;
bogdanm 0:9b334a45a8ff 664 }
bogdanm 0:9b334a45a8ff 665 return HAL_OK;
bogdanm 0:9b334a45a8ff 666 }
bogdanm 0:9b334a45a8ff 667
bogdanm 0:9b334a45a8ff 668 /**
bogdanm 0:9b334a45a8ff 669 * @brief Locks the Data memory and FLASH_PECR register access.
bogdanm 0:9b334a45a8ff 670 * @retval HAL_StatusTypeDef HAL Status
bogdanm 0:9b334a45a8ff 671 */
bogdanm 0:9b334a45a8ff 672 HAL_StatusTypeDef HAL_FLASHEx_DATAEEPROM_Lock(void)
bogdanm 0:9b334a45a8ff 673 {
bogdanm 0:9b334a45a8ff 674 /* Set the PELOCK Bit to lock the data memory and FLASH_PECR register access */
bogdanm 0:9b334a45a8ff 675 SET_BIT(FLASH->PECR, FLASH_PECR_PELOCK);
bogdanm 0:9b334a45a8ff 676
bogdanm 0:9b334a45a8ff 677 return HAL_OK;
bogdanm 0:9b334a45a8ff 678 }
bogdanm 0:9b334a45a8ff 679
bogdanm 0:9b334a45a8ff 680 /**
bogdanm 0:9b334a45a8ff 681 * @brief Erase a word in data memory.
bogdanm 0:9b334a45a8ff 682 * @param Address: specifies the address to be erased.
bogdanm 0:9b334a45a8ff 683 * @param TypeErase: Indicate the way to erase at a specified address.
bogdanm 0:9b334a45a8ff 684 * This parameter can be a value of @ref FLASH_Type_Program
bogdanm 0:9b334a45a8ff 685 * @note To correctly run this function, the DATA_EEPROM_Unlock() function
bogdanm 0:9b334a45a8ff 686 * must be called before.
bogdanm 0:9b334a45a8ff 687 * Call the DATA_EEPROM_Lock() to the data EEPROM access
bogdanm 0:9b334a45a8ff 688 * and Flash program erase control register access(recommended to protect
bogdanm 0:9b334a45a8ff 689 * the DATA_EEPROM against possible unwanted operation).
bogdanm 0:9b334a45a8ff 690 * @retval FLASH Status: The returned value can be:
bogdanm 0:9b334a45a8ff 691 * FLASH_ERROR_PROGRAM, FLASH_ERROR_WRP, FLASH_COMPLETE or FLASH_TIMEOUT.
bogdanm 0:9b334a45a8ff 692 */
bogdanm 0:9b334a45a8ff 693 HAL_StatusTypeDef HAL_FLASHEx_DATAEEPROM_Erase(uint32_t TypeErase, uint32_t Address)
bogdanm 0:9b334a45a8ff 694 {
bogdanm 0:9b334a45a8ff 695 HAL_StatusTypeDef status = HAL_OK;
bogdanm 0:9b334a45a8ff 696
bogdanm 0:9b334a45a8ff 697 /* Check the parameters */
bogdanm 0:9b334a45a8ff 698 assert_param(IS_TYPEPROGRAMDATA(TypeErase));
bogdanm 0:9b334a45a8ff 699 assert_param(IS_FLASH_DATA_ADDRESS(Address));
bogdanm 0:9b334a45a8ff 700
bogdanm 0:9b334a45a8ff 701 /* Wait for last operation to be completed */
bogdanm 0:9b334a45a8ff 702 status = FLASH_WaitForLastOperation((uint32_t)HAL_FLASH_TIMEOUT_VALUE);
bogdanm 0:9b334a45a8ff 703
bogdanm 0:9b334a45a8ff 704 if(status == HAL_OK)
bogdanm 0:9b334a45a8ff 705 {
bogdanm 0:9b334a45a8ff 706 if(TypeErase == TYPEERASEDATA_WORD)
bogdanm 0:9b334a45a8ff 707 {
bogdanm 0:9b334a45a8ff 708 /* Write 00000000h to valid address in the data memory */
bogdanm 0:9b334a45a8ff 709 *(__IO uint32_t *) Address = 0x00000000;
bogdanm 0:9b334a45a8ff 710 }
bogdanm 0:9b334a45a8ff 711
bogdanm 0:9b334a45a8ff 712 if(TypeErase == TYPEERASEDATA_HALFWORD)
bogdanm 0:9b334a45a8ff 713 {
bogdanm 0:9b334a45a8ff 714 /* Write 0000h to valid address in the data memory */
bogdanm 0:9b334a45a8ff 715 *(__IO uint16_t *) Address = (uint16_t)0x0000;
bogdanm 0:9b334a45a8ff 716 }
bogdanm 0:9b334a45a8ff 717
bogdanm 0:9b334a45a8ff 718 if(TypeErase == TYPEERASEDATA_BYTE)
bogdanm 0:9b334a45a8ff 719 {
bogdanm 0:9b334a45a8ff 720 /* Write 00h to valid address in the data memory */
bogdanm 0:9b334a45a8ff 721 *(__IO uint8_t *) Address = (uint8_t)0x00;
bogdanm 0:9b334a45a8ff 722 }
bogdanm 0:9b334a45a8ff 723 }
bogdanm 0:9b334a45a8ff 724
bogdanm 0:9b334a45a8ff 725 /* Return the erase status */
bogdanm 0:9b334a45a8ff 726 return status;
bogdanm 0:9b334a45a8ff 727 }
bogdanm 0:9b334a45a8ff 728
bogdanm 0:9b334a45a8ff 729 /**
bogdanm 0:9b334a45a8ff 730 * @brief Program word at a specified address
bogdanm 0:9b334a45a8ff 731 * @note To correctly run this function, the HAL_FLASH_EEPROM_Unlock() function
bogdanm 0:9b334a45a8ff 732 * must be called before.
bogdanm 0:9b334a45a8ff 733 * Call the HAL_FLASHEx_DATAEEPROM_Unlock() to he data EEPROM access
bogdanm 0:9b334a45a8ff 734 * and Flash program erase control register access(recommended to protect
bogdanm 0:9b334a45a8ff 735 * the DATA_EEPROM against possible unwanted operation).
bogdanm 0:9b334a45a8ff 736 * @note The function HAL_FLASHEx_DATAEEPROM_EnableFixedTimeProgram() can be called before
bogdanm 0:9b334a45a8ff 737 * this function to configure the Fixed Time Programming.
bogdanm 0:9b334a45a8ff 738 * @param TypeProgram: Indicate the way to program at a specified address.
bogdanm 0:9b334a45a8ff 739 * This parameter can be a value of @ref FLASHEx_Type_Program_Data
bogdanm 0:9b334a45a8ff 740 * @param Address: specifies the address to be programmed.
bogdanm 0:9b334a45a8ff 741 * @param Data: specifies the data to be programmed
bogdanm 0:9b334a45a8ff 742 *
bogdanm 0:9b334a45a8ff 743 * @retval HAL_StatusTypeDef HAL Status
bogdanm 0:9b334a45a8ff 744 */
bogdanm 0:9b334a45a8ff 745
bogdanm 0:9b334a45a8ff 746 HAL_StatusTypeDef HAL_FLASHEx_DATAEEPROM_Program(uint32_t TypeProgram, uint32_t Address, uint32_t Data)
bogdanm 0:9b334a45a8ff 747 {
bogdanm 0:9b334a45a8ff 748 HAL_StatusTypeDef status = HAL_ERROR;
bogdanm 0:9b334a45a8ff 749
bogdanm 0:9b334a45a8ff 750 /* Process Locked */
bogdanm 0:9b334a45a8ff 751 __HAL_LOCK(&ProcFlash);
bogdanm 0:9b334a45a8ff 752
bogdanm 0:9b334a45a8ff 753 /* Check the parameters */
bogdanm 0:9b334a45a8ff 754 assert_param(IS_TYPEPROGRAMDATA(TypeProgram));
bogdanm 0:9b334a45a8ff 755
bogdanm 0:9b334a45a8ff 756 /* Wait for last operation to be completed */
bogdanm 0:9b334a45a8ff 757 status = FLASH_WaitForLastOperation((uint32_t)HAL_FLASH_TIMEOUT_VALUE);
bogdanm 0:9b334a45a8ff 758
bogdanm 0:9b334a45a8ff 759 if(status == HAL_OK)
bogdanm 0:9b334a45a8ff 760 {
bogdanm 0:9b334a45a8ff 761 if(TypeProgram == TYPEPROGRAMDATA_FASTBYTE)
bogdanm 0:9b334a45a8ff 762 {
bogdanm 0:9b334a45a8ff 763 /*Program word (8-bit) at a specified address.*/
bogdanm 0:9b334a45a8ff 764 FLASH_DATAEEPROM_FastProgramByte(Address, (uint8_t) Data);
bogdanm 0:9b334a45a8ff 765 }
bogdanm 0:9b334a45a8ff 766
bogdanm 0:9b334a45a8ff 767 if(TypeProgram == TYPEPROGRAMDATA_FASTHALFWORD)
bogdanm 0:9b334a45a8ff 768 {
bogdanm 0:9b334a45a8ff 769 /*Program word (16-bit) at a specified address.*/
bogdanm 0:9b334a45a8ff 770 FLASH_DATAEEPROM_FastProgramHalfWord(Address, (uint16_t) Data);
bogdanm 0:9b334a45a8ff 771 }
bogdanm 0:9b334a45a8ff 772
bogdanm 0:9b334a45a8ff 773 if(TypeProgram == TYPEPROGRAMDATA_FASTWORD)
bogdanm 0:9b334a45a8ff 774 {
bogdanm 0:9b334a45a8ff 775 /*Program word (32-bit) at a specified address.*/
bogdanm 0:9b334a45a8ff 776 FLASH_DATAEEPROM_FastProgramWord(Address, (uint32_t) Data);
bogdanm 0:9b334a45a8ff 777 }
bogdanm 0:9b334a45a8ff 778
bogdanm 0:9b334a45a8ff 779 if(TypeProgram == TYPEPROGRAMDATA_WORD)
bogdanm 0:9b334a45a8ff 780 {
bogdanm 0:9b334a45a8ff 781 /*Program word (32-bit) at a specified address.*/
bogdanm 0:9b334a45a8ff 782 FLASH_DATAEEPROM_ProgramWord(Address, (uint32_t) Data);
bogdanm 0:9b334a45a8ff 783 }
bogdanm 0:9b334a45a8ff 784
bogdanm 0:9b334a45a8ff 785 if(TypeProgram == TYPEPROGRAMDATA_HALFWORD)
bogdanm 0:9b334a45a8ff 786 {
bogdanm 0:9b334a45a8ff 787 /*Program word (16-bit) at a specified address.*/
bogdanm 0:9b334a45a8ff 788 FLASH_DATAEEPROM_ProgramHalfWord(Address, (uint16_t) Data);
bogdanm 0:9b334a45a8ff 789 }
bogdanm 0:9b334a45a8ff 790
bogdanm 0:9b334a45a8ff 791 if(TypeProgram == TYPEPROGRAMDATA_BYTE)
bogdanm 0:9b334a45a8ff 792 {
bogdanm 0:9b334a45a8ff 793 /*Program word (8-bit) at a specified address.*/
bogdanm 0:9b334a45a8ff 794 FLASH_DATAEEPROM_ProgramByte(Address, (uint8_t) Data);
bogdanm 0:9b334a45a8ff 795 }
bogdanm 0:9b334a45a8ff 796
bogdanm 0:9b334a45a8ff 797 /* Wait for last operation to be completed */
bogdanm 0:9b334a45a8ff 798 status = FLASH_WaitForLastOperation((uint32_t)HAL_FLASH_TIMEOUT_VALUE);
bogdanm 0:9b334a45a8ff 799 }
bogdanm 0:9b334a45a8ff 800
bogdanm 0:9b334a45a8ff 801 /* Process Unlocked */
bogdanm 0:9b334a45a8ff 802 __HAL_UNLOCK(&ProcFlash);
bogdanm 0:9b334a45a8ff 803
bogdanm 0:9b334a45a8ff 804 return status;
bogdanm 0:9b334a45a8ff 805 }
bogdanm 0:9b334a45a8ff 806
bogdanm 0:9b334a45a8ff 807 /**
bogdanm 0:9b334a45a8ff 808 * @brief Enable DATA EEPROM fixed Time programming (2*Tprog).
bogdanm 0:9b334a45a8ff 809 * @retval None
bogdanm 0:9b334a45a8ff 810 */
bogdanm 0:9b334a45a8ff 811 void HAL_FLASHEx_DATAEEPROM_EnableFixedTimeProgram(void)
bogdanm 0:9b334a45a8ff 812 {
bogdanm 0:9b334a45a8ff 813 SET_BIT(FLASH->PECR, FLASH_PECR_FTDW);
bogdanm 0:9b334a45a8ff 814 }
bogdanm 0:9b334a45a8ff 815
bogdanm 0:9b334a45a8ff 816 /**
bogdanm 0:9b334a45a8ff 817 * @brief Disables DATA EEPROM fixed Time programming (2*Tprog).
bogdanm 0:9b334a45a8ff 818 * @retval None
bogdanm 0:9b334a45a8ff 819 */
bogdanm 0:9b334a45a8ff 820 void HAL_FLASHEx_DATAEEPROM_DisableFixedTimeProgram(void)
bogdanm 0:9b334a45a8ff 821 {
bogdanm 0:9b334a45a8ff 822 CLEAR_BIT(FLASH->PECR, FLASH_PECR_FTDW);
bogdanm 0:9b334a45a8ff 823 }
bogdanm 0:9b334a45a8ff 824
bogdanm 0:9b334a45a8ff 825 /**
bogdanm 0:9b334a45a8ff 826 * @}
bogdanm 0:9b334a45a8ff 827 */
bogdanm 0:9b334a45a8ff 828
bogdanm 0:9b334a45a8ff 829 /**
bogdanm 0:9b334a45a8ff 830 * @}
bogdanm 0:9b334a45a8ff 831 */
bogdanm 0:9b334a45a8ff 832
bogdanm 0:9b334a45a8ff 833 /** @defgroup FLASHEx_Private_Functions FLASHEx Private functions
bogdanm 0:9b334a45a8ff 834 * @{
bogdanm 0:9b334a45a8ff 835 */
bogdanm 0:9b334a45a8ff 836
bogdanm 0:9b334a45a8ff 837 /*
bogdanm 0:9b334a45a8ff 838 ==============================================================================
bogdanm 0:9b334a45a8ff 839 ##### FLASH STATIC functions #####
bogdanm 0:9b334a45a8ff 840 ==============================================================================
bogdanm 0:9b334a45a8ff 841 */
bogdanm 0:9b334a45a8ff 842
bogdanm 0:9b334a45a8ff 843 /*
bogdanm 0:9b334a45a8ff 844 ==============================================================================
bogdanm 0:9b334a45a8ff 845 FLASH
bogdanm 0:9b334a45a8ff 846 ==============================================================================
bogdanm 0:9b334a45a8ff 847 */
bogdanm 0:9b334a45a8ff 848
bogdanm 0:9b334a45a8ff 849 /**
bogdanm 0:9b334a45a8ff 850 * @brief Set the specific FLASH error flag.
bogdanm 0:9b334a45a8ff 851 * @retval None
bogdanm 0:9b334a45a8ff 852 */
bogdanm 0:9b334a45a8ff 853 static void FLASH_SetErrorCode(void)
bogdanm 0:9b334a45a8ff 854 {
bogdanm 0:9b334a45a8ff 855 if(__HAL_FLASH_GET_FLAG(FLASH_FLAG_WRPERR) != RESET)
bogdanm 0:9b334a45a8ff 856 {
bogdanm 0:9b334a45a8ff 857 ProcFlash.ErrorCode = FLASH_ERROR_WRP;
bogdanm 0:9b334a45a8ff 858 }
bogdanm 0:9b334a45a8ff 859
bogdanm 0:9b334a45a8ff 860 if(__HAL_FLASH_GET_FLAG(FLASH_FLAG_PGAERR) != RESET)
bogdanm 0:9b334a45a8ff 861 {
bogdanm 0:9b334a45a8ff 862 ProcFlash.ErrorCode |= FLASH_ERROR_PGA;
bogdanm 0:9b334a45a8ff 863 }
bogdanm 0:9b334a45a8ff 864
bogdanm 0:9b334a45a8ff 865 if(__HAL_FLASH_GET_FLAG(FLASH_FLAG_SIZERR) != RESET)
bogdanm 0:9b334a45a8ff 866 {
bogdanm 0:9b334a45a8ff 867 ProcFlash.ErrorCode |= FLASH_ERROR_SIZE;
bogdanm 0:9b334a45a8ff 868 }
bogdanm 0:9b334a45a8ff 869
bogdanm 0:9b334a45a8ff 870 if(__HAL_FLASH_GET_FLAG(FLASH_FLAG_OPTVERR) != RESET)
bogdanm 0:9b334a45a8ff 871 {
bogdanm 0:9b334a45a8ff 872 ProcFlash.ErrorCode |= FLASH_ERROR_OPTV;
bogdanm 0:9b334a45a8ff 873 }
bogdanm 0:9b334a45a8ff 874
bogdanm 0:9b334a45a8ff 875 #if defined (STM32L151xBA) || defined (STM32L152xBA) || \
bogdanm 0:9b334a45a8ff 876 defined (STM32L151xC) || defined (STM32L152xC) || defined (STM32L162xC)
bogdanm 0:9b334a45a8ff 877 if(__HAL_FLASH_GET_FLAG(FLASH_FLAG_RDERR) != RESET)
bogdanm 0:9b334a45a8ff 878 {
bogdanm 0:9b334a45a8ff 879 ProcFlash.ErrorCode |= FLASH_ERROR_RD;
bogdanm 0:9b334a45a8ff 880 }
bogdanm 0:9b334a45a8ff 881 #endif /* STM32L151xBA || STM32L152xBA || STM32L151xC || STM32L152xC || STM32L162xC */
bogdanm 0:9b334a45a8ff 882
bogdanm 0:9b334a45a8ff 883 #if defined(STM32L100xC) || defined (STM32L151xC) || defined (STM32L152xC) || defined (STM32L162xC) || \
bogdanm 0:9b334a45a8ff 884 defined(STM32L151xCA) || defined (STM32L151xD) || defined (STM32L152xCA) || defined (STM32L152xD) || defined (STM32L162xCA) || defined (STM32L162xD) || \
bogdanm 0:9b334a45a8ff 885 defined(STM32L151xE) || defined (STM32L152xE) || defined (STM32L162xE)
bogdanm 0:9b334a45a8ff 886 if(__HAL_FLASH_GET_FLAG(FLASH_FLAG_OPTVERRUSR) != RESET)
bogdanm 0:9b334a45a8ff 887 {
bogdanm 0:9b334a45a8ff 888 ProcFlash.ErrorCode |= FLASH_ERROR_OPTVUSR;
bogdanm 0:9b334a45a8ff 889 }
bogdanm 0:9b334a45a8ff 890 #endif /* STM32L100xC || STM32L151xC || STM32L152xC || STM32L162xC || STM32L151xCA || STM32L151xD || STM32L152xCA || STM32L152xD || STM32L162xCA || STM32L162xD || STM32L151xE || STM32L152xE || STM32L162xE */
bogdanm 0:9b334a45a8ff 891 }
bogdanm 0:9b334a45a8ff 892
bogdanm 0:9b334a45a8ff 893 /**
bogdanm 0:9b334a45a8ff 894 * @brief Erases a specified page in program memory.
bogdanm 0:9b334a45a8ff 895 * @param PageAddress: The page address in program memory to be erased.
bogdanm 0:9b334a45a8ff 896 * @note A Page is erased in the Program memory only if the address to load
bogdanm 0:9b334a45a8ff 897 * is the start address of a page (multiple of 256 bytes).
bogdanm 0:9b334a45a8ff 898 * @retval None
bogdanm 0:9b334a45a8ff 899 */
bogdanm 0:9b334a45a8ff 900 static void FLASH_ErasePage(uint32_t PageAddress)
bogdanm 0:9b334a45a8ff 901 {
bogdanm 0:9b334a45a8ff 902 /* Set the ERASE bit */
bogdanm 0:9b334a45a8ff 903 SET_BIT(FLASH->PECR, FLASH_PECR_ERASE);
bogdanm 0:9b334a45a8ff 904
bogdanm 0:9b334a45a8ff 905 /* Set PROG bit */
bogdanm 0:9b334a45a8ff 906 SET_BIT(FLASH->PECR, FLASH_PECR_PROG);
bogdanm 0:9b334a45a8ff 907
bogdanm 0:9b334a45a8ff 908 /* Write 00000000h to the first word of the program page to erase */
bogdanm 0:9b334a45a8ff 909 *(__IO uint32_t *)PageAddress = 0x00000000;
bogdanm 0:9b334a45a8ff 910 }
bogdanm 0:9b334a45a8ff 911
bogdanm 0:9b334a45a8ff 912
bogdanm 0:9b334a45a8ff 913 /*
bogdanm 0:9b334a45a8ff 914 ==============================================================================
bogdanm 0:9b334a45a8ff 915 OPTIONS BYTES
bogdanm 0:9b334a45a8ff 916 ==============================================================================
bogdanm 0:9b334a45a8ff 917 */
bogdanm 0:9b334a45a8ff 918 /**
bogdanm 0:9b334a45a8ff 919 * @brief Enables or disables the read out protection.
bogdanm 0:9b334a45a8ff 920 * @note To correctly run this function, the HAL_FLASH_OB_Unlock() function
bogdanm 0:9b334a45a8ff 921 * must be called before.
bogdanm 0:9b334a45a8ff 922 * @param OB_RDP: specifies the read protection level.
bogdanm 0:9b334a45a8ff 923 * This parameter can be:
bogdanm 0:9b334a45a8ff 924 * @arg OB_RDP_LEVEL0: No protection
bogdanm 0:9b334a45a8ff 925 * @arg OB_RDP_LEVEL1: Read protection of the memory
bogdanm 0:9b334a45a8ff 926 * @arg OB_RDP_LEVEL2: Chip protection
bogdanm 0:9b334a45a8ff 927 *
bogdanm 0:9b334a45a8ff 928 * !!!Warning!!! When enabling OB_RDP_LEVEL2 it's no more possible to go back to level 1 or 0
bogdanm 0:9b334a45a8ff 929 *
bogdanm 0:9b334a45a8ff 930 * @retval HAL status
bogdanm 0:9b334a45a8ff 931 */
bogdanm 0:9b334a45a8ff 932 static HAL_StatusTypeDef FLASH_OB_RDPConfig(uint8_t OB_RDP)
bogdanm 0:9b334a45a8ff 933 {
bogdanm 0:9b334a45a8ff 934 HAL_StatusTypeDef status = HAL_OK;
bogdanm 0:9b334a45a8ff 935 uint32_t tmp1 = 0, tmp2 = 0, sprmod = 0;
bogdanm 0:9b334a45a8ff 936
bogdanm 0:9b334a45a8ff 937 /* Check the parameters */
bogdanm 0:9b334a45a8ff 938 assert_param(IS_OB_RDP(OB_RDP));
bogdanm 0:9b334a45a8ff 939
bogdanm 0:9b334a45a8ff 940 /* According to errata sheet, DocID022054 Rev 5, par2.1.5
bogdanm 0:9b334a45a8ff 941 Before setting Level0 in the RDP register, check that the current level is not equal to Level0.
bogdanm 0:9b334a45a8ff 942 If the current level is not equal to Level0, Level0 can be activated.
bogdanm 0:9b334a45a8ff 943 If the current level is Level0 then the RDP register must not be written again with Level0. */
bogdanm 0:9b334a45a8ff 944 tmp1 = (uint32_t)(OB->RDP & 0x000000FF);
bogdanm 0:9b334a45a8ff 945
bogdanm 0:9b334a45a8ff 946 if ((tmp1 == OB_RDP_LEVEL0) && (OB_RDP == OB_RDP_LEVEL0))
bogdanm 0:9b334a45a8ff 947 {
bogdanm 0:9b334a45a8ff 948 /*current level is Level0 then the RDP register must not be written again with Level0. */
bogdanm 0:9b334a45a8ff 949 status = HAL_ERROR;
bogdanm 0:9b334a45a8ff 950 }
bogdanm 0:9b334a45a8ff 951 else
bogdanm 0:9b334a45a8ff 952 {
bogdanm 0:9b334a45a8ff 953 /* Mask SPRMOD bit */
bogdanm 0:9b334a45a8ff 954 sprmod = (uint32_t)(OB->RDP & 0x00000100);
bogdanm 0:9b334a45a8ff 955
bogdanm 0:9b334a45a8ff 956 status = FLASH_WaitForLastOperation(HAL_FLASH_TIMEOUT_VALUE);
bogdanm 0:9b334a45a8ff 957
bogdanm 0:9b334a45a8ff 958 /* calculate the option byte to write */
bogdanm 0:9b334a45a8ff 959 tmp1 = (~((uint32_t)(OB_RDP | sprmod)));
bogdanm 0:9b334a45a8ff 960 tmp2 = (uint32_t)(((uint32_t)((uint32_t)(tmp1) << 16)) | ((uint32_t)(OB_RDP | sprmod)));
bogdanm 0:9b334a45a8ff 961
bogdanm 0:9b334a45a8ff 962 if(status == HAL_OK)
bogdanm 0:9b334a45a8ff 963 {
bogdanm 0:9b334a45a8ff 964 /* program read protection level */
bogdanm 0:9b334a45a8ff 965 OB->RDP = tmp2;
bogdanm 0:9b334a45a8ff 966 }
bogdanm 0:9b334a45a8ff 967
bogdanm 0:9b334a45a8ff 968 /* Wait for last operation to be completed */
bogdanm 0:9b334a45a8ff 969 status = FLASH_WaitForLastOperation(HAL_FLASH_TIMEOUT_VALUE);
bogdanm 0:9b334a45a8ff 970 }
bogdanm 0:9b334a45a8ff 971
bogdanm 0:9b334a45a8ff 972 /* Return the Read protection operation Status */
bogdanm 0:9b334a45a8ff 973 return status;
bogdanm 0:9b334a45a8ff 974 }
bogdanm 0:9b334a45a8ff 975
bogdanm 0:9b334a45a8ff 976 /**
bogdanm 0:9b334a45a8ff 977 * @brief Programs the FLASH brownout reset threshold level Option Byte.
bogdanm 0:9b334a45a8ff 978 * @param OB_BOR: Selects the brownout reset threshold level.
bogdanm 0:9b334a45a8ff 979 * This parameter can be one of the following values:
bogdanm 0:9b334a45a8ff 980 * @arg OB_BOR_OFF: BOR is disabled at power down, the reset is asserted when the VDD
bogdanm 0:9b334a45a8ff 981 * power supply reaches the PDR(Power Down Reset) threshold (1.5V)
bogdanm 0:9b334a45a8ff 982 * @arg OB_BOR_LEVEL1: BOR Reset threshold levels for 1.7V - 1.8V VDD power supply
bogdanm 0:9b334a45a8ff 983 * @arg OB_BOR_LEVEL2: BOR Reset threshold levels for 1.9V - 2.0V VDD power supply
bogdanm 0:9b334a45a8ff 984 * @arg OB_BOR_LEVEL3: BOR Reset threshold levels for 2.3V - 2.4V VDD power supply
bogdanm 0:9b334a45a8ff 985 * @arg OB_BOR_LEVEL4: BOR Reset threshold levels for 2.55V - 2.65V VDD power supply
bogdanm 0:9b334a45a8ff 986 * @arg OB_BOR_LEVEL5: BOR Reset threshold levels for 2.8V - 2.9V VDD power supply
bogdanm 0:9b334a45a8ff 987 * @retval HAL status
bogdanm 0:9b334a45a8ff 988 */
bogdanm 0:9b334a45a8ff 989 static HAL_StatusTypeDef FLASH_OB_BORConfig(uint8_t OB_BOR)
bogdanm 0:9b334a45a8ff 990 {
bogdanm 0:9b334a45a8ff 991 HAL_StatusTypeDef status = HAL_OK;
bogdanm 0:9b334a45a8ff 992 uint32_t tmp = 0, tmp1 = 0;
bogdanm 0:9b334a45a8ff 993
bogdanm 0:9b334a45a8ff 994 /* Check the parameters */
bogdanm 0:9b334a45a8ff 995 assert_param(IS_OB_BOR_LEVEL(OB_BOR));
bogdanm 0:9b334a45a8ff 996
bogdanm 0:9b334a45a8ff 997 /* Get the User Option byte register */
bogdanm 0:9b334a45a8ff 998 tmp1 = (FLASH->OBR & (FLASH_OBR_USER)) >> 16;
bogdanm 0:9b334a45a8ff 999
bogdanm 0:9b334a45a8ff 1000 /* Calculate the option byte to write - [0xFF | nUSER | 0x00 | USER]*/
bogdanm 0:9b334a45a8ff 1001 tmp = (uint32_t)~((OB_BOR | tmp1)) << 16;
bogdanm 0:9b334a45a8ff 1002 tmp |= (OB_BOR | tmp1);
bogdanm 0:9b334a45a8ff 1003
bogdanm 0:9b334a45a8ff 1004 /* Wait for last operation to be completed */
bogdanm 0:9b334a45a8ff 1005 status = FLASH_WaitForLastOperation(HAL_FLASH_TIMEOUT_VALUE);
bogdanm 0:9b334a45a8ff 1006
bogdanm 0:9b334a45a8ff 1007 if(status == HAL_OK)
bogdanm 0:9b334a45a8ff 1008 {
bogdanm 0:9b334a45a8ff 1009 /* Write the BOR Option Byte */
bogdanm 0:9b334a45a8ff 1010 OB->USER = tmp;
bogdanm 0:9b334a45a8ff 1011 }
bogdanm 0:9b334a45a8ff 1012
bogdanm 0:9b334a45a8ff 1013 /* Wait for last operation to be completed */
bogdanm 0:9b334a45a8ff 1014 status = FLASH_WaitForLastOperation(HAL_FLASH_TIMEOUT_VALUE);
bogdanm 0:9b334a45a8ff 1015
bogdanm 0:9b334a45a8ff 1016 /* Return the Option Byte program Status */
bogdanm 0:9b334a45a8ff 1017 return status;
bogdanm 0:9b334a45a8ff 1018 }
bogdanm 0:9b334a45a8ff 1019
bogdanm 0:9b334a45a8ff 1020 /**
bogdanm 0:9b334a45a8ff 1021 * @brief Returns the FLASH User Option Bytes values.
bogdanm 0:9b334a45a8ff 1022 * @retval The FLASH User Option Bytes.
bogdanm 0:9b334a45a8ff 1023 */
bogdanm 0:9b334a45a8ff 1024 static uint8_t FLASH_OB_GetUser(void)
bogdanm 0:9b334a45a8ff 1025 {
bogdanm 0:9b334a45a8ff 1026 /* Return the User Option Byte */
bogdanm 0:9b334a45a8ff 1027 return (uint8_t)((FLASH->OBR & FLASH_OBR_USER) >> POSITION_VAL(FLASH_OBR_USER));
bogdanm 0:9b334a45a8ff 1028 }
bogdanm 0:9b334a45a8ff 1029
bogdanm 0:9b334a45a8ff 1030 /**
bogdanm 0:9b334a45a8ff 1031 * @brief Checks whether the FLASH Read out Protection Status is set or not.
bogdanm 0:9b334a45a8ff 1032 * @retval FLASH ReadOut Protection
bogdanm 0:9b334a45a8ff 1033 */
bogdanm 0:9b334a45a8ff 1034 static uint8_t FLASH_OB_GetRDP(void)
bogdanm 0:9b334a45a8ff 1035 {
bogdanm 0:9b334a45a8ff 1036 return (uint8_t)(FLASH->OBR & FLASH_OBR_RDPRT);
bogdanm 0:9b334a45a8ff 1037 }
bogdanm 0:9b334a45a8ff 1038
bogdanm 0:9b334a45a8ff 1039 /**
bogdanm 0:9b334a45a8ff 1040 * @brief Returns the FLASH BOR level.
bogdanm 0:9b334a45a8ff 1041 * @retval The FLASH User Option Bytes.
bogdanm 0:9b334a45a8ff 1042 */
bogdanm 0:9b334a45a8ff 1043 static uint8_t FLASH_OB_GetBOR(void)
bogdanm 0:9b334a45a8ff 1044 {
bogdanm 0:9b334a45a8ff 1045 /* Return the BOR level */
bogdanm 0:9b334a45a8ff 1046 return (uint8_t)((FLASH->OBR & (uint32_t)FLASH_OBR_BOR_LEV) >> POSITION_VAL(FLASH_OBR_BOR_LEV));
bogdanm 0:9b334a45a8ff 1047 }
bogdanm 0:9b334a45a8ff 1048
bogdanm 0:9b334a45a8ff 1049 /**
bogdanm 0:9b334a45a8ff 1050 * @brief Write protects the desired pages of the first 64KB of the Flash.
bogdanm 0:9b334a45a8ff 1051 * @param pOBInit: pointer to an FLASH_OBInitStruct structure that
bogdanm 0:9b334a45a8ff 1052 * contains WRP parameters.
bogdanm 0:9b334a45a8ff 1053 * @param NewState: new state of the specified FLASH Pages Wtite protection.
bogdanm 0:9b334a45a8ff 1054 * This parameter can be: ENABLE or DISABLE.
bogdanm 0:9b334a45a8ff 1055 * @retval HAL_StatusTypeDef
bogdanm 0:9b334a45a8ff 1056 */
bogdanm 0:9b334a45a8ff 1057 static HAL_StatusTypeDef FLASH_OB_WRPConfig(FLASH_OBProgramInitTypeDef *pOBInit, FunctionalState NewState)
bogdanm 0:9b334a45a8ff 1058 {
bogdanm 0:9b334a45a8ff 1059 HAL_StatusTypeDef status = HAL_OK;
bogdanm 0:9b334a45a8ff 1060
bogdanm 0:9b334a45a8ff 1061 /* Wait for last operation to be completed */
bogdanm 0:9b334a45a8ff 1062 status = FLASH_WaitForLastOperation(HAL_FLASH_TIMEOUT_VALUE);
bogdanm 0:9b334a45a8ff 1063
bogdanm 0:9b334a45a8ff 1064 if(status == HAL_OK)
bogdanm 0:9b334a45a8ff 1065 {
bogdanm 0:9b334a45a8ff 1066 /* WRP for sector between 0 to 31 */
bogdanm 0:9b334a45a8ff 1067 if (pOBInit->WRPSector0To31 != 0)
bogdanm 0:9b334a45a8ff 1068 {
bogdanm 0:9b334a45a8ff 1069 FLASH_OB_WRPConfigWRP1OrPCROP1(pOBInit->WRPSector0To31, NewState);
bogdanm 0:9b334a45a8ff 1070 }
bogdanm 0:9b334a45a8ff 1071
bogdanm 0:9b334a45a8ff 1072 #if defined(STM32L100xC) || defined (STM32L151xC) || defined (STM32L152xC) || defined (STM32L162xC) || \
bogdanm 0:9b334a45a8ff 1073 defined(STM32L151xCA) || defined (STM32L151xD) || defined (STM32L152xCA) || defined (STM32L152xD) || defined (STM32L162xCA) || defined (STM32L162xD) || \
bogdanm 0:9b334a45a8ff 1074 defined(STM32L151xE) || defined (STM32L152xE) || defined (STM32L162xE)
bogdanm 0:9b334a45a8ff 1075
bogdanm 0:9b334a45a8ff 1076 /* Pages for Cat3, Cat4 & Cat5 devices*/
bogdanm 0:9b334a45a8ff 1077 /* WRP for sector between 32 to 63 */
bogdanm 0:9b334a45a8ff 1078 if (pOBInit->WRPSector32To63 != 0)
bogdanm 0:9b334a45a8ff 1079 {
bogdanm 0:9b334a45a8ff 1080 FLASH_OB_WRPConfigWRP2OrPCROP2(pOBInit->WRPSector32To63, NewState);
bogdanm 0:9b334a45a8ff 1081 }
bogdanm 0:9b334a45a8ff 1082
bogdanm 0:9b334a45a8ff 1083 #endif /* STM32L100xC || STM32L151xC || STM32L152xC || STM32L162xC || STM32L151xCA || STM32L151xD || STM32L152xCA || STM32L152xD || STM32L162xCA || STM32L162xD || STM32L151xE || STM32L152xE || STM32L162xE */
bogdanm 0:9b334a45a8ff 1084
bogdanm 0:9b334a45a8ff 1085 #if defined (STM32L151xD) || defined (STM32L152xD) || defined (STM32L162xD) || \
bogdanm 0:9b334a45a8ff 1086 defined(STM32L151xE) || defined (STM32L152xE) || defined (STM32L162xE)
bogdanm 0:9b334a45a8ff 1087
bogdanm 0:9b334a45a8ff 1088 /* Pages for devices with FLASH >= 256KB*/
bogdanm 0:9b334a45a8ff 1089 /* WRP for sector between 64 to 95 */
bogdanm 0:9b334a45a8ff 1090 if (pOBInit->WRPSector64To95 != 0)
bogdanm 0:9b334a45a8ff 1091 {
bogdanm 0:9b334a45a8ff 1092 FLASH_OB_WRPConfigWRP3(pOBInit->WRPSector64To95, NewState);
bogdanm 0:9b334a45a8ff 1093 }
bogdanm 0:9b334a45a8ff 1094
bogdanm 0:9b334a45a8ff 1095 #endif /* STM32L151xD || STM32L152xD || STM32L162xD || STM32L151xE || STM32L152xE || STM32L162xE */
bogdanm 0:9b334a45a8ff 1096
bogdanm 0:9b334a45a8ff 1097 #if defined(STM32L151xE) || defined (STM32L152xE) || defined (STM32L162xE)
bogdanm 0:9b334a45a8ff 1098
bogdanm 0:9b334a45a8ff 1099 /* Pages for Cat5 devices*/
bogdanm 0:9b334a45a8ff 1100 /* WRP for sector between 96 to 127 */
bogdanm 0:9b334a45a8ff 1101 if (pOBInit->WRPSector96To127 != 0)
bogdanm 0:9b334a45a8ff 1102 {
bogdanm 0:9b334a45a8ff 1103 FLASH_OB_WRPConfigWRP4(pOBInit->WRPSector96To127, NewState);
bogdanm 0:9b334a45a8ff 1104 }
bogdanm 0:9b334a45a8ff 1105
bogdanm 0:9b334a45a8ff 1106 #endif /* STM32L151xE || STM32L152xE || STM32L162xE */
bogdanm 0:9b334a45a8ff 1107
bogdanm 0:9b334a45a8ff 1108 /* Wait for last operation to be completed */
bogdanm 0:9b334a45a8ff 1109 status = FLASH_WaitForLastOperation(HAL_FLASH_TIMEOUT_VALUE);
bogdanm 0:9b334a45a8ff 1110 }
bogdanm 0:9b334a45a8ff 1111
bogdanm 0:9b334a45a8ff 1112 /* Return the write protection operation Status */
bogdanm 0:9b334a45a8ff 1113 return status;
bogdanm 0:9b334a45a8ff 1114 }
bogdanm 0:9b334a45a8ff 1115
bogdanm 0:9b334a45a8ff 1116 #if defined (STM32L151xBA) || defined (STM32L152xBA) || \
bogdanm 0:9b334a45a8ff 1117 defined (STM32L151xC) || defined (STM32L152xC) || defined (STM32L162xC)
bogdanm 0:9b334a45a8ff 1118 /**
bogdanm 0:9b334a45a8ff 1119 * @brief Enables the read/write protection (PCROP) of the desired
bogdanm 0:9b334a45a8ff 1120 * sectors.
bogdanm 0:9b334a45a8ff 1121 * @note This function can be used only for Cat2 & Cat3 devices
bogdanm 0:9b334a45a8ff 1122 * @param pAdvOBInit: pointer to an FLASH_AdvOBProgramInitTypeDef structure that
bogdanm 0:9b334a45a8ff 1123 * contains PCROP parameters.
bogdanm 0:9b334a45a8ff 1124 * @param NewState: new state of the specified FLASH Pages read/Write protection.
bogdanm 0:9b334a45a8ff 1125 * This parameter can be: ENABLE or DISABLE.
bogdanm 0:9b334a45a8ff 1126 * @retval HAL status
bogdanm 0:9b334a45a8ff 1127 */
bogdanm 0:9b334a45a8ff 1128 static HAL_StatusTypeDef FLASH_OB_PCROPConfig(FLASH_AdvOBProgramInitTypeDef *pAdvOBInit, FunctionalState NewState)
bogdanm 0:9b334a45a8ff 1129 {
bogdanm 0:9b334a45a8ff 1130 HAL_StatusTypeDef status = HAL_OK;
bogdanm 0:9b334a45a8ff 1131 FunctionalState pcropstate = DISABLE;
bogdanm 0:9b334a45a8ff 1132
bogdanm 0:9b334a45a8ff 1133 /* Wait for last operation to be completed */
bogdanm 0:9b334a45a8ff 1134 status = FLASH_WaitForLastOperation(HAL_FLASH_TIMEOUT_VALUE);
bogdanm 0:9b334a45a8ff 1135
bogdanm 0:9b334a45a8ff 1136 /* Invert state to use same function of WRP */
bogdanm 0:9b334a45a8ff 1137 if (NewState == DISABLE)
bogdanm 0:9b334a45a8ff 1138 {
bogdanm 0:9b334a45a8ff 1139 pcropstate = ENABLE;
bogdanm 0:9b334a45a8ff 1140 }
bogdanm 0:9b334a45a8ff 1141
bogdanm 0:9b334a45a8ff 1142 if(status == HAL_OK)
bogdanm 0:9b334a45a8ff 1143 {
bogdanm 0:9b334a45a8ff 1144 /* Pages for Cat2 devices*/
bogdanm 0:9b334a45a8ff 1145 /* PCROP for sector between 0 to 31 */
bogdanm 0:9b334a45a8ff 1146 if (pAdvOBInit->PCROPSector0To31 != 0)
bogdanm 0:9b334a45a8ff 1147 {
bogdanm 0:9b334a45a8ff 1148 FLASH_OB_WRPConfigWRP1OrPCROP1(pAdvOBInit->PCROPSector0To31, pcropstate);
bogdanm 0:9b334a45a8ff 1149 }
bogdanm 0:9b334a45a8ff 1150
bogdanm 0:9b334a45a8ff 1151 #if defined(STM32L100xC) || defined (STM32L151xC) || defined (STM32L152xC) || defined (STM32L162xC)
bogdanm 0:9b334a45a8ff 1152
bogdanm 0:9b334a45a8ff 1153 /* Pages for Cat3 devices*/
bogdanm 0:9b334a45a8ff 1154 /* WRP for sector between 32 to 63 */
bogdanm 0:9b334a45a8ff 1155 if (pAdvOBInit->PCROPSector32To63 != 0)
bogdanm 0:9b334a45a8ff 1156 {
bogdanm 0:9b334a45a8ff 1157 FLASH_OB_WRPConfigWRP2OrPCROP2(pAdvOBInit->PCROPSector32To63, pcropstate);
bogdanm 0:9b334a45a8ff 1158 }
bogdanm 0:9b334a45a8ff 1159
bogdanm 0:9b334a45a8ff 1160 #endif /* STM32L100xC || STM32L151xC || STM32L152xC || STM32L162xC */
bogdanm 0:9b334a45a8ff 1161
bogdanm 0:9b334a45a8ff 1162 /* Wait for last operation to be completed */
bogdanm 0:9b334a45a8ff 1163 status = FLASH_WaitForLastOperation(HAL_FLASH_TIMEOUT_VALUE);
bogdanm 0:9b334a45a8ff 1164 }
bogdanm 0:9b334a45a8ff 1165
bogdanm 0:9b334a45a8ff 1166 /* Return the write protection operation Status */
bogdanm 0:9b334a45a8ff 1167 return status;
bogdanm 0:9b334a45a8ff 1168 }
bogdanm 0:9b334a45a8ff 1169 #endif /* STM32L151xBA || STM32L152xBA || STM32L151xC || STM32L152xC || STM32L162xC */
bogdanm 0:9b334a45a8ff 1170
bogdanm 0:9b334a45a8ff 1171 /**
bogdanm 0:9b334a45a8ff 1172 * @brief Write protects the desired pages of the first 128KB of the Flash.
bogdanm 0:9b334a45a8ff 1173 * @param WRP1OrPCROP1: specifies the address of the pages to be write protected.
bogdanm 0:9b334a45a8ff 1174 * This parameter can be:
bogdanm 0:9b334a45a8ff 1175 * @arg value between OB_WRP1/PCROP1_PAGES0TO15 and OB_WRP1/PCROP1_PAGES496TO511
bogdanm 0:9b334a45a8ff 1176 * @arg OB_WRP1/PCROP1_ALLPAGES
bogdanm 0:9b334a45a8ff 1177 * @param NewState: new state of the specified FLASH Pages Wtite protection.
bogdanm 0:9b334a45a8ff 1178 * This parameter can be: ENABLE or DISABLE.
bogdanm 0:9b334a45a8ff 1179 * @retval None
bogdanm 0:9b334a45a8ff 1180 */
bogdanm 0:9b334a45a8ff 1181 static void FLASH_OB_WRPConfigWRP1OrPCROP1(uint32_t WRP1OrPCROP1, FunctionalState NewState)
bogdanm 0:9b334a45a8ff 1182 {
bogdanm 0:9b334a45a8ff 1183 uint32_t wrp01data = 0, wrp23data = 0;
bogdanm 0:9b334a45a8ff 1184
bogdanm 0:9b334a45a8ff 1185 uint32_t tmp1 = 0, tmp2 = 0;
bogdanm 0:9b334a45a8ff 1186
bogdanm 0:9b334a45a8ff 1187 if (NewState != DISABLE)
bogdanm 0:9b334a45a8ff 1188 {
bogdanm 0:9b334a45a8ff 1189 wrp01data = (uint16_t)(((WRP1OrPCROP1 & WRP_MASK_LOW) | OB->WRP01));
bogdanm 0:9b334a45a8ff 1190 wrp23data = (uint16_t)((((WRP1OrPCROP1 & WRP_MASK_HIGH)>>16 | OB->WRP23)));
bogdanm 0:9b334a45a8ff 1191 tmp1 = (uint32_t)(~(wrp01data) << 16)|(wrp01data);
bogdanm 0:9b334a45a8ff 1192 OB->WRP01 = tmp1;
bogdanm 0:9b334a45a8ff 1193
bogdanm 0:9b334a45a8ff 1194 tmp2 = (uint32_t)(~(wrp23data) << 16)|(wrp23data);
bogdanm 0:9b334a45a8ff 1195 OB->WRP23 = tmp2;
bogdanm 0:9b334a45a8ff 1196 }
bogdanm 0:9b334a45a8ff 1197 else
bogdanm 0:9b334a45a8ff 1198 {
bogdanm 0:9b334a45a8ff 1199 wrp01data = (uint16_t)(~WRP1OrPCROP1 & (WRP_MASK_LOW & OB->WRP01));
bogdanm 0:9b334a45a8ff 1200 wrp23data = (uint16_t)((((~WRP1OrPCROP1 & WRP_MASK_HIGH)>>16 & OB->WRP23)));
bogdanm 0:9b334a45a8ff 1201
bogdanm 0:9b334a45a8ff 1202 tmp1 = (uint32_t)((~wrp01data) << 16)|(wrp01data);
bogdanm 0:9b334a45a8ff 1203 OB->WRP01 = tmp1;
bogdanm 0:9b334a45a8ff 1204
bogdanm 0:9b334a45a8ff 1205 tmp2 = (uint32_t)((~wrp23data) << 16)|(wrp23data);
bogdanm 0:9b334a45a8ff 1206 OB->WRP23 = tmp2;
bogdanm 0:9b334a45a8ff 1207 }
bogdanm 0:9b334a45a8ff 1208 }
bogdanm 0:9b334a45a8ff 1209
bogdanm 0:9b334a45a8ff 1210 #if defined(STM32L100xC) || defined (STM32L151xC) || defined (STM32L152xC) || defined (STM32L162xC) || \
bogdanm 0:9b334a45a8ff 1211 defined(STM32L151xCA) || defined (STM32L151xD) || defined (STM32L152xCA) || defined (STM32L152xD) || defined (STM32L162xCA) || defined (STM32L162xD) || \
bogdanm 0:9b334a45a8ff 1212 defined(STM32L151xE) || defined (STM32L152xE) || defined (STM32L162xE)
bogdanm 0:9b334a45a8ff 1213 /**
bogdanm 0:9b334a45a8ff 1214 * @brief Enable Write protects the desired pages of the second 128KB of the Flash.
bogdanm 0:9b334a45a8ff 1215 * @note This function can be used only for Cat3, Cat4 & Cat5 devices.
bogdanm 0:9b334a45a8ff 1216 * @param WRP2OrPCROP2: specifies the address of the pages to be write protected.
bogdanm 0:9b334a45a8ff 1217 * This parameter can be:
bogdanm 0:9b334a45a8ff 1218 * @arg value between OB_WRP2/PCROP2_PAGES512TO527 and OB_WRP2/PCROP2_PAGES1008TO1023
bogdanm 0:9b334a45a8ff 1219 * @arg OB_WRP2/PCROP2_ALLPAGES
bogdanm 0:9b334a45a8ff 1220 * @param NewState: new state of the specified FLASH Pages Wtite protection.
bogdanm 0:9b334a45a8ff 1221 * This parameter can be: ENABLE or DISABLE.
bogdanm 0:9b334a45a8ff 1222 * @retval None
bogdanm 0:9b334a45a8ff 1223 */
bogdanm 0:9b334a45a8ff 1224 static void FLASH_OB_WRPConfigWRP2OrPCROP2(uint32_t WRP2OrPCROP2, FunctionalState NewState)
bogdanm 0:9b334a45a8ff 1225 {
bogdanm 0:9b334a45a8ff 1226 uint32_t wrp45data = 0, wrp67data = 0;
bogdanm 0:9b334a45a8ff 1227
bogdanm 0:9b334a45a8ff 1228 uint32_t tmp1 = 0, tmp2 = 0;
bogdanm 0:9b334a45a8ff 1229
bogdanm 0:9b334a45a8ff 1230 if (NewState != DISABLE)
bogdanm 0:9b334a45a8ff 1231 {
bogdanm 0:9b334a45a8ff 1232 wrp45data = (uint16_t)(((WRP2OrPCROP2 & WRP_MASK_LOW) | OB->WRP45));
bogdanm 0:9b334a45a8ff 1233 wrp67data = (uint16_t)((((WRP2OrPCROP2 & WRP_MASK_HIGH)>>16 | OB->WRP67)));
bogdanm 0:9b334a45a8ff 1234 tmp1 = (uint32_t)(~(wrp45data) << 16)|(wrp45data);
bogdanm 0:9b334a45a8ff 1235 OB->WRP45 = tmp1;
bogdanm 0:9b334a45a8ff 1236
bogdanm 0:9b334a45a8ff 1237 tmp2 = (uint32_t)(~(wrp67data) << 16)|(wrp67data);
bogdanm 0:9b334a45a8ff 1238 OB->WRP67 = tmp2;
bogdanm 0:9b334a45a8ff 1239 }
bogdanm 0:9b334a45a8ff 1240 else
bogdanm 0:9b334a45a8ff 1241 {
bogdanm 0:9b334a45a8ff 1242 wrp45data = (uint16_t)(~WRP2OrPCROP2 & (WRP_MASK_LOW & OB->WRP45));
bogdanm 0:9b334a45a8ff 1243 wrp67data = (uint16_t)((((~WRP2OrPCROP2 & WRP_MASK_HIGH)>>16 & OB->WRP67)));
bogdanm 0:9b334a45a8ff 1244
bogdanm 0:9b334a45a8ff 1245 tmp1 = (uint32_t)((~wrp45data) << 16)|(wrp45data);
bogdanm 0:9b334a45a8ff 1246 OB->WRP45 = tmp1;
bogdanm 0:9b334a45a8ff 1247
bogdanm 0:9b334a45a8ff 1248 tmp2 = (uint32_t)((~wrp67data) << 16)|(wrp67data);
bogdanm 0:9b334a45a8ff 1249 OB->WRP67 = tmp2;
bogdanm 0:9b334a45a8ff 1250 }
bogdanm 0:9b334a45a8ff 1251 }
bogdanm 0:9b334a45a8ff 1252 #endif /* STM32L100xC || STM32L151xC || STM32L152xC || STM32L162xC || STM32L151xCA || STM32L151xD || STM32L152xCA || STM32L152xD || STM32L162xCA || STM32L162xD || STM32L151xE || STM32L152xE || STM32L162xE */
bogdanm 0:9b334a45a8ff 1253
bogdanm 0:9b334a45a8ff 1254 #if defined (STM32L151xD) || defined (STM32L152xD) || defined (STM32L162xD) || \
bogdanm 0:9b334a45a8ff 1255 defined(STM32L151xE) || defined (STM32L152xE) || defined (STM32L162xE)
bogdanm 0:9b334a45a8ff 1256 /**
bogdanm 0:9b334a45a8ff 1257 * @brief Enable Write protects the desired pages of the third 128KB of the Flash.
bogdanm 0:9b334a45a8ff 1258 * @note This function can be used only for STM32L151xD, STM32L152xD, STM32L162xD & Cat5 devices.
bogdanm 0:9b334a45a8ff 1259 * @param WRP3: specifies the address of the pages to be write protected.
bogdanm 0:9b334a45a8ff 1260 * This parameter can be:
bogdanm 0:9b334a45a8ff 1261 * @arg value between WRP3_PAGES1024TO1039 and OB_WRP3_PAGES1520TO1535
bogdanm 0:9b334a45a8ff 1262 * @arg OB_WRP3_ALLPAGES
bogdanm 0:9b334a45a8ff 1263 * @param NewState: new state of the specified FLASH Pages Wtite protection.
bogdanm 0:9b334a45a8ff 1264 * This parameter can be: ENABLE or DISABLE.
bogdanm 0:9b334a45a8ff 1265 * @retval None
bogdanm 0:9b334a45a8ff 1266 */
bogdanm 0:9b334a45a8ff 1267 static void FLASH_OB_WRPConfigWRP3(uint32_t WRP3, FunctionalState NewState)
bogdanm 0:9b334a45a8ff 1268 {
bogdanm 0:9b334a45a8ff 1269 uint32_t wrp89data = 0, wrp1011data = 0;
bogdanm 0:9b334a45a8ff 1270
bogdanm 0:9b334a45a8ff 1271 uint32_t tmp1 = 0, tmp2 = 0;
bogdanm 0:9b334a45a8ff 1272
bogdanm 0:9b334a45a8ff 1273 if (NewState != DISABLE)
bogdanm 0:9b334a45a8ff 1274 {
bogdanm 0:9b334a45a8ff 1275 wrp89data = (uint16_t)(((WRP3 & WRP_MASK_LOW) | OB->WRP89));
bogdanm 0:9b334a45a8ff 1276 wrp1011data = (uint16_t)((((WRP3 & WRP_MASK_HIGH)>>16 | OB->WRP1011)));
bogdanm 0:9b334a45a8ff 1277 tmp1 = (uint32_t)(~(wrp89data) << 16)|(wrp89data);
bogdanm 0:9b334a45a8ff 1278 OB->WRP89 = tmp1;
bogdanm 0:9b334a45a8ff 1279
bogdanm 0:9b334a45a8ff 1280 tmp2 = (uint32_t)(~(wrp1011data) << 16)|(wrp1011data);
bogdanm 0:9b334a45a8ff 1281 OB->WRP1011 = tmp2;
bogdanm 0:9b334a45a8ff 1282 }
bogdanm 0:9b334a45a8ff 1283 else
bogdanm 0:9b334a45a8ff 1284 {
bogdanm 0:9b334a45a8ff 1285 wrp89data = (uint16_t)(~WRP3 & (WRP_MASK_LOW & OB->WRP89));
bogdanm 0:9b334a45a8ff 1286 wrp1011data = (uint16_t)((((~WRP3 & WRP_MASK_HIGH)>>16 & OB->WRP1011)));
bogdanm 0:9b334a45a8ff 1287
bogdanm 0:9b334a45a8ff 1288 tmp1 = (uint32_t)((~wrp89data) << 16)|(wrp89data);
bogdanm 0:9b334a45a8ff 1289 OB->WRP89 = tmp1;
bogdanm 0:9b334a45a8ff 1290
bogdanm 0:9b334a45a8ff 1291 tmp2 = (uint32_t)((~wrp1011data) << 16)|(wrp1011data);
bogdanm 0:9b334a45a8ff 1292 OB->WRP1011 = tmp2;
bogdanm 0:9b334a45a8ff 1293 }
bogdanm 0:9b334a45a8ff 1294 }
bogdanm 0:9b334a45a8ff 1295 #endif /* STM32L151xD || STM32L152xD || STM32L162xD || STM32L151xE || STM32L152xE || STM32L162xE */
bogdanm 0:9b334a45a8ff 1296
bogdanm 0:9b334a45a8ff 1297 #if defined(STM32L151xE) || defined (STM32L152xE) || defined (STM32L162xE)
bogdanm 0:9b334a45a8ff 1298 /**
bogdanm 0:9b334a45a8ff 1299 * @brief Enable Write protects the desired pages of the Fourth 128KB of the Flash.
bogdanm 0:9b334a45a8ff 1300 * @note This function can be used only for Cat5 devices.
bogdanm 0:9b334a45a8ff 1301 * @param WRP4: specifies the address of the pages to be write protected.
bogdanm 0:9b334a45a8ff 1302 * This parameter can be:
bogdanm 0:9b334a45a8ff 1303 * @arg value between OB_WRP4_PAGES1536TO1551 and OB_WRP4_PAGES2032TO2047
bogdanm 0:9b334a45a8ff 1304 * @arg OB_WRP4_ALLPAGES
bogdanm 0:9b334a45a8ff 1305 * @param NewState: new state of the specified FLASH Pages Wtite protection.
bogdanm 0:9b334a45a8ff 1306 * This parameter can be: ENABLE or DISABLE.
bogdanm 0:9b334a45a8ff 1307 * @retval None
bogdanm 0:9b334a45a8ff 1308 */
bogdanm 0:9b334a45a8ff 1309 static void FLASH_OB_WRPConfigWRP4(uint32_t WRP4, FunctionalState NewState)
bogdanm 0:9b334a45a8ff 1310 {
bogdanm 0:9b334a45a8ff 1311 uint32_t wrp1213data = 0, wrp1415data = 0;
bogdanm 0:9b334a45a8ff 1312
bogdanm 0:9b334a45a8ff 1313 uint32_t tmp1 = 0, tmp2 = 0;
bogdanm 0:9b334a45a8ff 1314
bogdanm 0:9b334a45a8ff 1315 if (NewState != DISABLE)
bogdanm 0:9b334a45a8ff 1316 {
bogdanm 0:9b334a45a8ff 1317 wrp1213data = (uint16_t)(((WRP4 & WRP_MASK_LOW) | OB->WRP1213));
bogdanm 0:9b334a45a8ff 1318 wrp1415data = (uint16_t)((((WRP4 & WRP_MASK_HIGH)>>16 | OB->WRP1415)));
bogdanm 0:9b334a45a8ff 1319 tmp1 = (uint32_t)(~(wrp1213data) << 16)|(wrp1213data);
bogdanm 0:9b334a45a8ff 1320 OB->WRP1213 = tmp1;
bogdanm 0:9b334a45a8ff 1321
bogdanm 0:9b334a45a8ff 1322 tmp2 = (uint32_t)(~(wrp1415data) << 16)|(wrp1415data);
bogdanm 0:9b334a45a8ff 1323 OB->WRP1415 = tmp2;
bogdanm 0:9b334a45a8ff 1324 }
bogdanm 0:9b334a45a8ff 1325 else
bogdanm 0:9b334a45a8ff 1326 {
bogdanm 0:9b334a45a8ff 1327 wrp1213data = (uint16_t)(~WRP4 & (WRP_MASK_LOW & OB->WRP1213));
bogdanm 0:9b334a45a8ff 1328 wrp1415data = (uint16_t)((((~WRP4 & WRP_MASK_HIGH)>>16 & OB->WRP1415)));
bogdanm 0:9b334a45a8ff 1329
bogdanm 0:9b334a45a8ff 1330 tmp1 = (uint32_t)((~wrp1213data) << 16)|(wrp1213data);
bogdanm 0:9b334a45a8ff 1331 OB->WRP1213 = tmp1;
bogdanm 0:9b334a45a8ff 1332
bogdanm 0:9b334a45a8ff 1333 tmp2 = (uint32_t)((~wrp1415data) << 16)|(wrp1415data);
bogdanm 0:9b334a45a8ff 1334 OB->WRP1415 = tmp2;
bogdanm 0:9b334a45a8ff 1335 }
bogdanm 0:9b334a45a8ff 1336 }
bogdanm 0:9b334a45a8ff 1337 #endif /* STM32L151xE || STM32L152xE || STM32L162xE */
bogdanm 0:9b334a45a8ff 1338
bogdanm 0:9b334a45a8ff 1339 /**
bogdanm 0:9b334a45a8ff 1340 * @brief Programs the FLASH User Option Byte: IWDG_SW / RST_STOP / RST_STDBY.
bogdanm 0:9b334a45a8ff 1341 * @param OB_IWDG: Selects the WDG mode.
bogdanm 0:9b334a45a8ff 1342 * This parameter can be one of the following values:
bogdanm 0:9b334a45a8ff 1343 * @arg OB_IWDG_SW: Software WDG selected
bogdanm 0:9b334a45a8ff 1344 * @arg OB_IWDG_HW: Hardware WDG selected
bogdanm 0:9b334a45a8ff 1345 * @param OB_STOP: Reset event when entering STOP mode.
bogdanm 0:9b334a45a8ff 1346 * This parameter can be one of the following values:
bogdanm 0:9b334a45a8ff 1347 * @arg OB_STOP_NORST: No reset generated when entering in STOP
bogdanm 0:9b334a45a8ff 1348 * @arg OB_STOP_RST: Reset generated when entering in STOP
bogdanm 0:9b334a45a8ff 1349 * @param OB_STDBY: Reset event when entering Standby mode.
bogdanm 0:9b334a45a8ff 1350 * This parameter can be one of the following values:
bogdanm 0:9b334a45a8ff 1351 * @arg OB_STDBY_NORST: No reset generated when entering in STANDBY
bogdanm 0:9b334a45a8ff 1352 * @arg OB_STDBY_RST: Reset generated when entering in STANDBY
bogdanm 0:9b334a45a8ff 1353 * @retval HAL status
bogdanm 0:9b334a45a8ff 1354 */
bogdanm 0:9b334a45a8ff 1355 static HAL_StatusTypeDef FLASH_OB_UserConfig(uint8_t OB_IWDG, uint8_t OB_STOP, uint8_t OB_STDBY)
bogdanm 0:9b334a45a8ff 1356 {
bogdanm 0:9b334a45a8ff 1357 HAL_StatusTypeDef status = HAL_OK;
bogdanm 0:9b334a45a8ff 1358 uint32_t tmp = 0, tmp1 = 0;
bogdanm 0:9b334a45a8ff 1359
bogdanm 0:9b334a45a8ff 1360 /* Check the parameters */
bogdanm 0:9b334a45a8ff 1361 assert_param(IS_OB_IWDG_SOURCE(OB_IWDG));
bogdanm 0:9b334a45a8ff 1362 assert_param(IS_OB_STOP_SOURCE(OB_STOP));
bogdanm 0:9b334a45a8ff 1363 assert_param(IS_OB_STDBY_SOURCE(OB_STDBY));
bogdanm 0:9b334a45a8ff 1364
bogdanm 0:9b334a45a8ff 1365 /* Get the User Option byte register */
bogdanm 0:9b334a45a8ff 1366 tmp1 = (FLASH->OBR & FLASH_OBR_BOR_LEV) >> 16;
bogdanm 0:9b334a45a8ff 1367
bogdanm 0:9b334a45a8ff 1368 /* Calculate the user option byte to write */
bogdanm 0:9b334a45a8ff 1369 tmp = (uint32_t)(((uint32_t)~((uint32_t)((uint32_t)(OB_IWDG) | (uint32_t)(OB_STOP) | (uint32_t)(OB_STDBY) | tmp1))) << 16);
bogdanm 0:9b334a45a8ff 1370 tmp |= ((uint32_t)(OB_IWDG) | ((uint32_t)OB_STOP) | (uint32_t)(OB_STDBY) | tmp1);
bogdanm 0:9b334a45a8ff 1371
bogdanm 0:9b334a45a8ff 1372 /* Wait for last operation to be completed */
bogdanm 0:9b334a45a8ff 1373 status = FLASH_WaitForLastOperation(HAL_FLASH_TIMEOUT_VALUE);
bogdanm 0:9b334a45a8ff 1374
bogdanm 0:9b334a45a8ff 1375 if(status == HAL_OK)
bogdanm 0:9b334a45a8ff 1376 {
bogdanm 0:9b334a45a8ff 1377 /* Write the User Option Byte */
bogdanm 0:9b334a45a8ff 1378 OB->USER = tmp;
bogdanm 0:9b334a45a8ff 1379 }
bogdanm 0:9b334a45a8ff 1380
bogdanm 0:9b334a45a8ff 1381 /* Wait for last operation to be completed */
bogdanm 0:9b334a45a8ff 1382 status = FLASH_WaitForLastOperation(HAL_FLASH_TIMEOUT_VALUE);
bogdanm 0:9b334a45a8ff 1383
bogdanm 0:9b334a45a8ff 1384 /* Return the Option Byte program Status */
bogdanm 0:9b334a45a8ff 1385 return status;
bogdanm 0:9b334a45a8ff 1386 }
bogdanm 0:9b334a45a8ff 1387
bogdanm 0:9b334a45a8ff 1388 #if defined (STM32L151xD) || defined (STM32L152xD) || defined (STM32L162xD) || \
bogdanm 0:9b334a45a8ff 1389 defined(STM32L151xE) || defined (STM32L152xE) || defined (STM32L162xE)
bogdanm 0:9b334a45a8ff 1390 /**
bogdanm 0:9b334a45a8ff 1391 * @brief Configures to boot from Bank1 or Bank2.
bogdanm 0:9b334a45a8ff 1392 * @param OB_BOOT: select the FLASH Bank to boot from.
bogdanm 0:9b334a45a8ff 1393 * This parameter can be one of the following values:
bogdanm 0:9b334a45a8ff 1394 * @arg OB_BOOT_BANK2: At startup, if boot pins are set in boot from user Flash
bogdanm 0:9b334a45a8ff 1395 * position and this parameter is selected the device will boot from Bank2 or Bank1,
bogdanm 0:9b334a45a8ff 1396 * depending on the activation of the bank. The active banks are checked in
bogdanm 0:9b334a45a8ff 1397 * the following order: Bank2, followed by Bank1.
bogdanm 0:9b334a45a8ff 1398 * The active bank is recognized by the value programmed at the base address
bogdanm 0:9b334a45a8ff 1399 * of the respective bank (corresponding to the initial stack pointer value
bogdanm 0:9b334a45a8ff 1400 * in the interrupt vector table).
bogdanm 0:9b334a45a8ff 1401 * @arg OB_BOOT_BANK1: At startup, if boot pins are set in boot from user Flash
bogdanm 0:9b334a45a8ff 1402 * position and this parameter is selected the device will boot from Bank1(Default).
bogdanm 0:9b334a45a8ff 1403 * For more information, please refer to AN2606 from www.st.com.
bogdanm 0:9b334a45a8ff 1404 * @retval HAL status
bogdanm 0:9b334a45a8ff 1405 */
bogdanm 0:9b334a45a8ff 1406 static HAL_StatusTypeDef FLASH_OB_BootConfig(uint8_t OB_BOOT)
bogdanm 0:9b334a45a8ff 1407 {
bogdanm 0:9b334a45a8ff 1408 HAL_StatusTypeDef status = HAL_OK;
bogdanm 0:9b334a45a8ff 1409 uint32_t tmp = 0, tmp1 = 0;
bogdanm 0:9b334a45a8ff 1410
bogdanm 0:9b334a45a8ff 1411 /* Check the parameters */
bogdanm 0:9b334a45a8ff 1412 assert_param(IS_OB_BOOT_BANK(OB_BOOT));
bogdanm 0:9b334a45a8ff 1413
bogdanm 0:9b334a45a8ff 1414 /* Get the User Option byte register and BOR Level*/
bogdanm 0:9b334a45a8ff 1415 tmp1 = (FLASH->OBR & (FLASH_OBR_nRST_STDBY | FLASH_OBR_nRST_STOP | FLASH_OBR_IWDG_SW | FLASH_OBR_BOR_LEV)) >> 16;
bogdanm 0:9b334a45a8ff 1416
bogdanm 0:9b334a45a8ff 1417 /* Calculate the option byte to write */
bogdanm 0:9b334a45a8ff 1418 tmp = (uint32_t)~(OB_BOOT | tmp1) << 16;
bogdanm 0:9b334a45a8ff 1419 tmp |= (OB_BOOT | tmp1);
bogdanm 0:9b334a45a8ff 1420
bogdanm 0:9b334a45a8ff 1421 /* Wait for last operation to be completed */
bogdanm 0:9b334a45a8ff 1422 status = FLASH_WaitForLastOperation(HAL_FLASH_TIMEOUT_VALUE);
bogdanm 0:9b334a45a8ff 1423
bogdanm 0:9b334a45a8ff 1424 if(status == HAL_OK)
bogdanm 0:9b334a45a8ff 1425 {
bogdanm 0:9b334a45a8ff 1426 /* Write the BOOT Option Byte */
bogdanm 0:9b334a45a8ff 1427 OB->USER = tmp;
bogdanm 0:9b334a45a8ff 1428 }
bogdanm 0:9b334a45a8ff 1429
bogdanm 0:9b334a45a8ff 1430 /* Wait for last operation to be completed */
bogdanm 0:9b334a45a8ff 1431 status = FLASH_WaitForLastOperation(HAL_FLASH_TIMEOUT_VALUE);
bogdanm 0:9b334a45a8ff 1432
bogdanm 0:9b334a45a8ff 1433 /* Return the Option Byte program Status */
bogdanm 0:9b334a45a8ff 1434 return status;
bogdanm 0:9b334a45a8ff 1435 }
bogdanm 0:9b334a45a8ff 1436
bogdanm 0:9b334a45a8ff 1437 #endif /* STM32L151xD || STM32L152xD || STM32L162xD || STM32L151xE || STM32L152xE || STM32L162xE */
bogdanm 0:9b334a45a8ff 1438
bogdanm 0:9b334a45a8ff 1439 /*
bogdanm 0:9b334a45a8ff 1440 ==============================================================================
bogdanm 0:9b334a45a8ff 1441 DATA
bogdanm 0:9b334a45a8ff 1442 ==============================================================================
bogdanm 0:9b334a45a8ff 1443 */
bogdanm 0:9b334a45a8ff 1444
bogdanm 0:9b334a45a8ff 1445 /**
bogdanm 0:9b334a45a8ff 1446 * @brief Write a Byte at a specified address in data memory.
bogdanm 0:9b334a45a8ff 1447 * @param Address: specifies the address to be written.
bogdanm 0:9b334a45a8ff 1448 * @param Data: specifies the data to be written.
bogdanm 0:9b334a45a8ff 1449 * @note This function assumes that the is data word is already erased.
bogdanm 0:9b334a45a8ff 1450 * @retval HAL status
bogdanm 0:9b334a45a8ff 1451 */
bogdanm 0:9b334a45a8ff 1452 static HAL_StatusTypeDef FLASH_DATAEEPROM_FastProgramByte(uint32_t Address, uint8_t Data)
bogdanm 0:9b334a45a8ff 1453 {
bogdanm 0:9b334a45a8ff 1454 HAL_StatusTypeDef status = HAL_OK;
bogdanm 0:9b334a45a8ff 1455 #if defined(STM32L100xB) || defined (STM32L151xB) || defined (STM32L152xB)
bogdanm 0:9b334a45a8ff 1456 uint32_t tmp = 0, tmpaddr = 0;
bogdanm 0:9b334a45a8ff 1457 #endif /* STM32L100xB || STM32L151xB || STM32L152xB */
bogdanm 0:9b334a45a8ff 1458
bogdanm 0:9b334a45a8ff 1459 /* Check the parameters */
bogdanm 0:9b334a45a8ff 1460 assert_param(IS_FLASH_DATA_ADDRESS(Address));
bogdanm 0:9b334a45a8ff 1461
bogdanm 0:9b334a45a8ff 1462 /* Wait for last operation to be completed */
bogdanm 0:9b334a45a8ff 1463 status = FLASH_WaitForLastOperation(HAL_FLASH_TIMEOUT_VALUE);
bogdanm 0:9b334a45a8ff 1464
bogdanm 0:9b334a45a8ff 1465 if(status == HAL_OK)
bogdanm 0:9b334a45a8ff 1466 {
bogdanm 0:9b334a45a8ff 1467 /* Clear the FTDW bit */
bogdanm 0:9b334a45a8ff 1468 CLEAR_BIT(FLASH->PECR, FLASH_PECR_FTDW);
bogdanm 0:9b334a45a8ff 1469
bogdanm 0:9b334a45a8ff 1470 #if defined(STM32L100xB) || defined (STM32L151xB) || defined (STM32L152xB)
bogdanm 0:9b334a45a8ff 1471 /* Possible only on Cat1 devices */
bogdanm 0:9b334a45a8ff 1472 if(Data != (uint8_t)0x00)
bogdanm 0:9b334a45a8ff 1473 {
bogdanm 0:9b334a45a8ff 1474 /* If the previous operation is completed, proceed to write the new Data */
bogdanm 0:9b334a45a8ff 1475 *(__IO uint8_t *)Address = Data;
bogdanm 0:9b334a45a8ff 1476
bogdanm 0:9b334a45a8ff 1477 /* Wait for last operation to be completed */
bogdanm 0:9b334a45a8ff 1478 status = FLASH_WaitForLastOperation(HAL_FLASH_TIMEOUT_VALUE);
bogdanm 0:9b334a45a8ff 1479 }
bogdanm 0:9b334a45a8ff 1480 else
bogdanm 0:9b334a45a8ff 1481 {
bogdanm 0:9b334a45a8ff 1482 tmpaddr = Address & 0xFFFFFFFC;
bogdanm 0:9b334a45a8ff 1483 tmp = * (__IO uint32_t *) tmpaddr;
bogdanm 0:9b334a45a8ff 1484 tmpaddr = 0xFF << ((uint32_t) (0x8 * (Address & 0x3)));
bogdanm 0:9b334a45a8ff 1485 tmp &= ~tmpaddr;
bogdanm 0:9b334a45a8ff 1486 status = HAL_FLASHEx_DATAEEPROM_Erase(TYPEERASEDATA_WORD, Address & 0xFFFFFFFC);
bogdanm 0:9b334a45a8ff 1487 status = HAL_FLASHEx_DATAEEPROM_Program(TYPEPROGRAMDATA_FASTWORD, (Address & 0xFFFFFFFC), tmp);
bogdanm 0:9b334a45a8ff 1488 }
bogdanm 0:9b334a45a8ff 1489 #else /*!Cat1*/
bogdanm 0:9b334a45a8ff 1490 /* If the previous operation is completed, proceed to write the new Data */
bogdanm 0:9b334a45a8ff 1491 *(__IO uint8_t *)Address = Data;
bogdanm 0:9b334a45a8ff 1492
bogdanm 0:9b334a45a8ff 1493 /* Wait for last operation to be completed */
bogdanm 0:9b334a45a8ff 1494 status = FLASH_WaitForLastOperation(HAL_FLASH_TIMEOUT_VALUE);
bogdanm 0:9b334a45a8ff 1495 #endif /* STM32L100xB || STM32L151xB || STM32L152xB */
bogdanm 0:9b334a45a8ff 1496 }
bogdanm 0:9b334a45a8ff 1497 /* Return the Write Status */
bogdanm 0:9b334a45a8ff 1498 return status;
bogdanm 0:9b334a45a8ff 1499 }
bogdanm 0:9b334a45a8ff 1500
bogdanm 0:9b334a45a8ff 1501 /**
bogdanm 0:9b334a45a8ff 1502 * @brief Writes a half word at a specified address in data memory.
bogdanm 0:9b334a45a8ff 1503 * @param Address: specifies the address to be written.
bogdanm 0:9b334a45a8ff 1504 * @param Data: specifies the data to be written.
bogdanm 0:9b334a45a8ff 1505 * @note This function assumes that the is data word is already erased.
bogdanm 0:9b334a45a8ff 1506 * @retval HAL status
bogdanm 0:9b334a45a8ff 1507 */
bogdanm 0:9b334a45a8ff 1508 static HAL_StatusTypeDef FLASH_DATAEEPROM_FastProgramHalfWord(uint32_t Address, uint16_t Data)
bogdanm 0:9b334a45a8ff 1509 {
bogdanm 0:9b334a45a8ff 1510 HAL_StatusTypeDef status = HAL_OK;
bogdanm 0:9b334a45a8ff 1511 #if defined(STM32L100xB) || defined (STM32L151xB) || defined (STM32L152xB)
bogdanm 0:9b334a45a8ff 1512 uint32_t tmp = 0, tmpaddr = 0;
bogdanm 0:9b334a45a8ff 1513 #endif /* STM32L100xB || STM32L151xB || STM32L152xB */
bogdanm 0:9b334a45a8ff 1514
bogdanm 0:9b334a45a8ff 1515 /* Check the parameters */
bogdanm 0:9b334a45a8ff 1516 assert_param(IS_FLASH_DATA_ADDRESS(Address));
bogdanm 0:9b334a45a8ff 1517
bogdanm 0:9b334a45a8ff 1518 /* Wait for last operation to be completed */
bogdanm 0:9b334a45a8ff 1519 status = FLASH_WaitForLastOperation(HAL_FLASH_TIMEOUT_VALUE);
bogdanm 0:9b334a45a8ff 1520
bogdanm 0:9b334a45a8ff 1521 if(status == HAL_OK)
bogdanm 0:9b334a45a8ff 1522 {
bogdanm 0:9b334a45a8ff 1523 /* Clear the FTDW bit */
bogdanm 0:9b334a45a8ff 1524 CLEAR_BIT(FLASH->PECR, FLASH_PECR_FTDW);
bogdanm 0:9b334a45a8ff 1525
bogdanm 0:9b334a45a8ff 1526 #if defined(STM32L100xB) || defined (STM32L151xB) || defined (STM32L152xB)
bogdanm 0:9b334a45a8ff 1527 /* Possible only on Cat1 devices */
bogdanm 0:9b334a45a8ff 1528 if(Data != (uint16_t)0x0000)
bogdanm 0:9b334a45a8ff 1529 {
bogdanm 0:9b334a45a8ff 1530 /* If the previous operation is completed, proceed to write the new data */
bogdanm 0:9b334a45a8ff 1531 *(__IO uint16_t *)Address = Data;
bogdanm 0:9b334a45a8ff 1532
bogdanm 0:9b334a45a8ff 1533 /* Wait for last operation to be completed */
bogdanm 0:9b334a45a8ff 1534 status = FLASH_WaitForLastOperation(HAL_FLASH_TIMEOUT_VALUE);
bogdanm 0:9b334a45a8ff 1535 }
bogdanm 0:9b334a45a8ff 1536 else
bogdanm 0:9b334a45a8ff 1537 {
bogdanm 0:9b334a45a8ff 1538 if((Address & 0x3) != 0x3)
bogdanm 0:9b334a45a8ff 1539 {
bogdanm 0:9b334a45a8ff 1540 tmpaddr = Address & 0xFFFFFFFC;
bogdanm 0:9b334a45a8ff 1541 tmp = * (__IO uint32_t *) tmpaddr;
bogdanm 0:9b334a45a8ff 1542 tmpaddr = 0xFFFF << ((uint32_t) (0x8 * (Address & 0x3)));
bogdanm 0:9b334a45a8ff 1543 tmp &= ~tmpaddr;
bogdanm 0:9b334a45a8ff 1544 status = HAL_FLASHEx_DATAEEPROM_Erase(TYPEERASEDATA_WORD, Address & 0xFFFFFFFC);
bogdanm 0:9b334a45a8ff 1545 status = HAL_FLASHEx_DATAEEPROM_Program(TYPEPROGRAMDATA_FASTWORD, (Address & 0xFFFFFFFC), tmp);
bogdanm 0:9b334a45a8ff 1546 }
bogdanm 0:9b334a45a8ff 1547 else
bogdanm 0:9b334a45a8ff 1548 {
bogdanm 0:9b334a45a8ff 1549 HAL_FLASHEx_DATAEEPROM_Program(TYPEPROGRAMDATA_FASTBYTE, Address, 0x00);
bogdanm 0:9b334a45a8ff 1550 HAL_FLASHEx_DATAEEPROM_Program(TYPEPROGRAMDATA_FASTBYTE, Address + 1, 0x00);
bogdanm 0:9b334a45a8ff 1551 }
bogdanm 0:9b334a45a8ff 1552 }
bogdanm 0:9b334a45a8ff 1553 #else /* !Cat1 */
bogdanm 0:9b334a45a8ff 1554 /* If the previous operation is completed, proceed to write the new data */
bogdanm 0:9b334a45a8ff 1555 *(__IO uint16_t *)Address = Data;
bogdanm 0:9b334a45a8ff 1556
bogdanm 0:9b334a45a8ff 1557 /* Wait for last operation to be completed */
bogdanm 0:9b334a45a8ff 1558 status = FLASH_WaitForLastOperation(HAL_FLASH_TIMEOUT_VALUE);
bogdanm 0:9b334a45a8ff 1559 #endif /* STM32L100xB || STM32L151xB || STM32L152xB */
bogdanm 0:9b334a45a8ff 1560 }
bogdanm 0:9b334a45a8ff 1561 /* Return the Write Status */
bogdanm 0:9b334a45a8ff 1562 return status;
bogdanm 0:9b334a45a8ff 1563 }
bogdanm 0:9b334a45a8ff 1564
bogdanm 0:9b334a45a8ff 1565 /**
bogdanm 0:9b334a45a8ff 1566 * @brief Programs a word at a specified address in data memory.
bogdanm 0:9b334a45a8ff 1567 * @param Address: specifies the address to be written.
bogdanm 0:9b334a45a8ff 1568 * @param Data: specifies the data to be written.
bogdanm 0:9b334a45a8ff 1569 * @note This function assumes that the is data word is already erased.
bogdanm 0:9b334a45a8ff 1570 * @retval HAL status
bogdanm 0:9b334a45a8ff 1571 */
bogdanm 0:9b334a45a8ff 1572 static HAL_StatusTypeDef FLASH_DATAEEPROM_FastProgramWord(uint32_t Address, uint32_t Data)
bogdanm 0:9b334a45a8ff 1573 {
bogdanm 0:9b334a45a8ff 1574 HAL_StatusTypeDef status = HAL_OK;
bogdanm 0:9b334a45a8ff 1575
bogdanm 0:9b334a45a8ff 1576 /* Check the parameters */
bogdanm 0:9b334a45a8ff 1577 assert_param(IS_FLASH_DATA_ADDRESS(Address));
bogdanm 0:9b334a45a8ff 1578
bogdanm 0:9b334a45a8ff 1579 /* Wait for last operation to be completed */
bogdanm 0:9b334a45a8ff 1580 status = FLASH_WaitForLastOperation(HAL_FLASH_TIMEOUT_VALUE);
bogdanm 0:9b334a45a8ff 1581
bogdanm 0:9b334a45a8ff 1582 if(status == HAL_OK)
bogdanm 0:9b334a45a8ff 1583 {
bogdanm 0:9b334a45a8ff 1584 /* Clear the FTDW bit */
bogdanm 0:9b334a45a8ff 1585 CLEAR_BIT(FLASH->PECR, FLASH_PECR_FTDW);
bogdanm 0:9b334a45a8ff 1586
bogdanm 0:9b334a45a8ff 1587 /* If the previous operation is completed, proceed to program the new data */
bogdanm 0:9b334a45a8ff 1588 *(__IO uint32_t *)Address = Data;
bogdanm 0:9b334a45a8ff 1589
bogdanm 0:9b334a45a8ff 1590 /* Wait for last operation to be completed */
bogdanm 0:9b334a45a8ff 1591 status = FLASH_WaitForLastOperation(HAL_FLASH_TIMEOUT_VALUE);
bogdanm 0:9b334a45a8ff 1592 }
bogdanm 0:9b334a45a8ff 1593 /* Return the Write Status */
bogdanm 0:9b334a45a8ff 1594 return status;
bogdanm 0:9b334a45a8ff 1595 }
bogdanm 0:9b334a45a8ff 1596
bogdanm 0:9b334a45a8ff 1597 /**
bogdanm 0:9b334a45a8ff 1598 * @brief Write a Byte at a specified address in data memory without erase.
bogdanm 0:9b334a45a8ff 1599 * @param Address: specifies the address to be written.
bogdanm 0:9b334a45a8ff 1600 * @param Data: specifies the data to be written.
bogdanm 0:9b334a45a8ff 1601 * @retval HAL status
bogdanm 0:9b334a45a8ff 1602 */
bogdanm 0:9b334a45a8ff 1603 static HAL_StatusTypeDef FLASH_DATAEEPROM_ProgramByte(uint32_t Address, uint8_t Data)
bogdanm 0:9b334a45a8ff 1604 {
bogdanm 0:9b334a45a8ff 1605 HAL_StatusTypeDef status = HAL_OK;
bogdanm 0:9b334a45a8ff 1606 #if defined(STM32L100xB) || defined (STM32L151xB) || defined (STM32L152xB)
bogdanm 0:9b334a45a8ff 1607 uint32_t tmp = 0, tmpaddr = 0;
bogdanm 0:9b334a45a8ff 1608 #endif /* STM32L100xB || STM32L151xB || STM32L152xB */
bogdanm 0:9b334a45a8ff 1609
bogdanm 0:9b334a45a8ff 1610 /* Check the parameters */
bogdanm 0:9b334a45a8ff 1611 assert_param(IS_FLASH_DATA_ADDRESS(Address));
bogdanm 0:9b334a45a8ff 1612
bogdanm 0:9b334a45a8ff 1613 /* Wait for last operation to be completed */
bogdanm 0:9b334a45a8ff 1614 status = FLASH_WaitForLastOperation(HAL_FLASH_TIMEOUT_VALUE);
bogdanm 0:9b334a45a8ff 1615
bogdanm 0:9b334a45a8ff 1616 if(status == HAL_OK)
bogdanm 0:9b334a45a8ff 1617 {
bogdanm 0:9b334a45a8ff 1618 #if defined(STM32L100xB) || defined (STM32L151xB) || defined (STM32L152xB)
bogdanm 0:9b334a45a8ff 1619 if(Data != (uint8_t) 0x00)
bogdanm 0:9b334a45a8ff 1620 {
bogdanm 0:9b334a45a8ff 1621 *(__IO uint8_t *)Address = Data;
bogdanm 0:9b334a45a8ff 1622
bogdanm 0:9b334a45a8ff 1623 /* Wait for last operation to be completed */
bogdanm 0:9b334a45a8ff 1624 status = FLASH_WaitForLastOperation(HAL_FLASH_TIMEOUT_VALUE);
bogdanm 0:9b334a45a8ff 1625
bogdanm 0:9b334a45a8ff 1626 }
bogdanm 0:9b334a45a8ff 1627 else
bogdanm 0:9b334a45a8ff 1628 {
bogdanm 0:9b334a45a8ff 1629 tmpaddr = Address & 0xFFFFFFFC;
bogdanm 0:9b334a45a8ff 1630 tmp = * (__IO uint32_t *) tmpaddr;
bogdanm 0:9b334a45a8ff 1631 tmpaddr = 0xFF << ((uint32_t) (0x8 * (Address & 0x3)));
bogdanm 0:9b334a45a8ff 1632 tmp &= ~tmpaddr;
bogdanm 0:9b334a45a8ff 1633 status = HAL_FLASHEx_DATAEEPROM_Erase(TYPEERASEDATA_WORD, Address & 0xFFFFFFFC);
bogdanm 0:9b334a45a8ff 1634 status = HAL_FLASHEx_DATAEEPROM_Program(TYPEPROGRAMDATA_FASTWORD, (Address & 0xFFFFFFFC), tmp);
bogdanm 0:9b334a45a8ff 1635 }
bogdanm 0:9b334a45a8ff 1636 #else /* Not Cat1*/
bogdanm 0:9b334a45a8ff 1637 *(__IO uint8_t *)Address = Data;
bogdanm 0:9b334a45a8ff 1638
bogdanm 0:9b334a45a8ff 1639 /* Wait for last operation to be completed */
bogdanm 0:9b334a45a8ff 1640 status = FLASH_WaitForLastOperation(HAL_FLASH_TIMEOUT_VALUE);
bogdanm 0:9b334a45a8ff 1641 #endif /* STM32L100xB || STM32L151xB || STM32L152xB */
bogdanm 0:9b334a45a8ff 1642 }
bogdanm 0:9b334a45a8ff 1643 /* Return the Write Status */
bogdanm 0:9b334a45a8ff 1644 return status;
bogdanm 0:9b334a45a8ff 1645 }
bogdanm 0:9b334a45a8ff 1646
bogdanm 0:9b334a45a8ff 1647 /**
bogdanm 0:9b334a45a8ff 1648 * @brief Writes a half word at a specified address in data memory without erase.
bogdanm 0:9b334a45a8ff 1649 * @param Address: specifies the address to be written.
bogdanm 0:9b334a45a8ff 1650 * @param Data: specifies the data to be written.
bogdanm 0:9b334a45a8ff 1651 * @retval HAL status
bogdanm 0:9b334a45a8ff 1652 */
bogdanm 0:9b334a45a8ff 1653 static HAL_StatusTypeDef FLASH_DATAEEPROM_ProgramHalfWord(uint32_t Address, uint16_t Data)
bogdanm 0:9b334a45a8ff 1654 {
bogdanm 0:9b334a45a8ff 1655 HAL_StatusTypeDef status = HAL_OK;
bogdanm 0:9b334a45a8ff 1656 #if defined(STM32L100xB) || defined (STM32L151xB) || defined (STM32L152xB)
bogdanm 0:9b334a45a8ff 1657 uint32_t tmp = 0, tmpaddr = 0;
bogdanm 0:9b334a45a8ff 1658 #endif /* STM32L100xB || STM32L151xB || STM32L152xB */
bogdanm 0:9b334a45a8ff 1659
bogdanm 0:9b334a45a8ff 1660 /* Check the parameters */
bogdanm 0:9b334a45a8ff 1661 assert_param(IS_FLASH_DATA_ADDRESS(Address));
bogdanm 0:9b334a45a8ff 1662
bogdanm 0:9b334a45a8ff 1663 /* Wait for last operation to be completed */
bogdanm 0:9b334a45a8ff 1664 status = FLASH_WaitForLastOperation(HAL_FLASH_TIMEOUT_VALUE);
bogdanm 0:9b334a45a8ff 1665
bogdanm 0:9b334a45a8ff 1666 if(status == HAL_OK)
bogdanm 0:9b334a45a8ff 1667 {
bogdanm 0:9b334a45a8ff 1668 #if defined(STM32L100xB) || defined (STM32L151xB) || defined (STM32L152xB)
bogdanm 0:9b334a45a8ff 1669 if(Data != (uint16_t)0x0000)
bogdanm 0:9b334a45a8ff 1670 {
bogdanm 0:9b334a45a8ff 1671 *(__IO uint16_t *)Address = Data;
bogdanm 0:9b334a45a8ff 1672
bogdanm 0:9b334a45a8ff 1673 /* Wait for last operation to be completed */
bogdanm 0:9b334a45a8ff 1674 status = FLASH_WaitForLastOperation(HAL_FLASH_TIMEOUT_VALUE);
bogdanm 0:9b334a45a8ff 1675 }
bogdanm 0:9b334a45a8ff 1676 else
bogdanm 0:9b334a45a8ff 1677 {
bogdanm 0:9b334a45a8ff 1678 if((Address & 0x3) != 0x3)
bogdanm 0:9b334a45a8ff 1679 {
bogdanm 0:9b334a45a8ff 1680 tmpaddr = Address & 0xFFFFFFFC;
bogdanm 0:9b334a45a8ff 1681 tmp = * (__IO uint32_t *) tmpaddr;
bogdanm 0:9b334a45a8ff 1682 tmpaddr = 0xFFFF << ((uint32_t) (0x8 * (Address & 0x3)));
bogdanm 0:9b334a45a8ff 1683 tmp &= ~tmpaddr;
bogdanm 0:9b334a45a8ff 1684 status = HAL_FLASHEx_DATAEEPROM_Erase(TYPEERASEDATA_WORD, Address & 0xFFFFFFFC);
bogdanm 0:9b334a45a8ff 1685 status = HAL_FLASHEx_DATAEEPROM_Program(TYPEPROGRAMDATA_FASTWORD, (Address & 0xFFFFFFFC), tmp);
bogdanm 0:9b334a45a8ff 1686 }
bogdanm 0:9b334a45a8ff 1687 else
bogdanm 0:9b334a45a8ff 1688 {
bogdanm 0:9b334a45a8ff 1689 HAL_FLASHEx_DATAEEPROM_Program(TYPEPROGRAMDATA_FASTBYTE, Address, 0x00);
bogdanm 0:9b334a45a8ff 1690 HAL_FLASHEx_DATAEEPROM_Program(TYPEPROGRAMDATA_FASTBYTE, Address + 1, 0x00);
bogdanm 0:9b334a45a8ff 1691 }
bogdanm 0:9b334a45a8ff 1692 }
bogdanm 0:9b334a45a8ff 1693 #else /* Not Cat1*/
bogdanm 0:9b334a45a8ff 1694 *(__IO uint16_t *)Address = Data;
bogdanm 0:9b334a45a8ff 1695
bogdanm 0:9b334a45a8ff 1696 /* Wait for last operation to be completed */
bogdanm 0:9b334a45a8ff 1697 status = FLASH_WaitForLastOperation(HAL_FLASH_TIMEOUT_VALUE);
bogdanm 0:9b334a45a8ff 1698 #endif /* STM32L100xB || STM32L151xB || STM32L152xB */
bogdanm 0:9b334a45a8ff 1699 }
bogdanm 0:9b334a45a8ff 1700 /* Return the Write Status */
bogdanm 0:9b334a45a8ff 1701 return status;
bogdanm 0:9b334a45a8ff 1702 }
bogdanm 0:9b334a45a8ff 1703
bogdanm 0:9b334a45a8ff 1704 /**
bogdanm 0:9b334a45a8ff 1705 * @brief Programs a word at a specified address in data memory without erase.
bogdanm 0:9b334a45a8ff 1706 * @param Address: specifies the address to be written.
bogdanm 0:9b334a45a8ff 1707 * @param Data: specifies the data to be written.
bogdanm 0:9b334a45a8ff 1708 * @retval HAL status
bogdanm 0:9b334a45a8ff 1709 */
bogdanm 0:9b334a45a8ff 1710 static HAL_StatusTypeDef FLASH_DATAEEPROM_ProgramWord(uint32_t Address, uint32_t Data)
bogdanm 0:9b334a45a8ff 1711 {
bogdanm 0:9b334a45a8ff 1712 HAL_StatusTypeDef status = HAL_OK;
bogdanm 0:9b334a45a8ff 1713
bogdanm 0:9b334a45a8ff 1714 /* Check the parameters */
bogdanm 0:9b334a45a8ff 1715 assert_param(IS_FLASH_DATA_ADDRESS(Address));
bogdanm 0:9b334a45a8ff 1716
bogdanm 0:9b334a45a8ff 1717 /* Wait for last operation to be completed */
bogdanm 0:9b334a45a8ff 1718 status = FLASH_WaitForLastOperation(HAL_FLASH_TIMEOUT_VALUE);
bogdanm 0:9b334a45a8ff 1719
bogdanm 0:9b334a45a8ff 1720 if(status == HAL_OK)
bogdanm 0:9b334a45a8ff 1721 {
bogdanm 0:9b334a45a8ff 1722 *(__IO uint32_t *)Address = Data;
bogdanm 0:9b334a45a8ff 1723
bogdanm 0:9b334a45a8ff 1724 /* Wait for last operation to be completed */
bogdanm 0:9b334a45a8ff 1725 status = FLASH_WaitForLastOperation(HAL_FLASH_TIMEOUT_VALUE);
bogdanm 0:9b334a45a8ff 1726 }
bogdanm 0:9b334a45a8ff 1727 /* Return the Write Status */
bogdanm 0:9b334a45a8ff 1728 return status;
bogdanm 0:9b334a45a8ff 1729 }
bogdanm 0:9b334a45a8ff 1730
bogdanm 0:9b334a45a8ff 1731 /**
bogdanm 0:9b334a45a8ff 1732 * @}
bogdanm 0:9b334a45a8ff 1733 */
bogdanm 0:9b334a45a8ff 1734
bogdanm 0:9b334a45a8ff 1735 /**
bogdanm 0:9b334a45a8ff 1736 * @}
bogdanm 0:9b334a45a8ff 1737 */
bogdanm 0:9b334a45a8ff 1738
bogdanm 0:9b334a45a8ff 1739 /** @addtogroup FLASH
bogdanm 0:9b334a45a8ff 1740 * @{
bogdanm 0:9b334a45a8ff 1741 */
bogdanm 0:9b334a45a8ff 1742
bogdanm 0:9b334a45a8ff 1743 /** @addtogroup FLASH_Exported_Functions
bogdanm 0:9b334a45a8ff 1744 * @{
bogdanm 0:9b334a45a8ff 1745 */
bogdanm 0:9b334a45a8ff 1746
bogdanm 0:9b334a45a8ff 1747 /** @addtogroup FLASH_Exported_Functions_Group1
bogdanm 0:9b334a45a8ff 1748 * @brief Interrupts functions
bogdanm 0:9b334a45a8ff 1749 *
bogdanm 0:9b334a45a8ff 1750 @verbatim
bogdanm 0:9b334a45a8ff 1751 ==============================================================================
bogdanm 0:9b334a45a8ff 1752 ##### Interrupts functions #####
bogdanm 0:9b334a45a8ff 1753 ==============================================================================
bogdanm 0:9b334a45a8ff 1754
bogdanm 0:9b334a45a8ff 1755 @endverbatim
bogdanm 0:9b334a45a8ff 1756 * @{
bogdanm 0:9b334a45a8ff 1757 */
bogdanm 0:9b334a45a8ff 1758
bogdanm 0:9b334a45a8ff 1759 /**
bogdanm 0:9b334a45a8ff 1760 * @brief This function handles FLASH interrupt request.
bogdanm 0:9b334a45a8ff 1761 * @retval None
bogdanm 0:9b334a45a8ff 1762 */
bogdanm 0:9b334a45a8ff 1763 void HAL_FLASH_IRQHandler(void)
bogdanm 0:9b334a45a8ff 1764 {
bogdanm 0:9b334a45a8ff 1765 uint32_t temp;
bogdanm 0:9b334a45a8ff 1766
bogdanm 0:9b334a45a8ff 1767 /* If the program operation is completed, disable the PROG Bit */
bogdanm 0:9b334a45a8ff 1768 CLEAR_BIT(FLASH->PECR, FLASH_PECR_PROG);
bogdanm 0:9b334a45a8ff 1769
bogdanm 0:9b334a45a8ff 1770 /* If the erase operation is completed, disable the ERASE Bit */
bogdanm 0:9b334a45a8ff 1771 CLEAR_BIT(FLASH->PECR, FLASH_PECR_ERASE);
bogdanm 0:9b334a45a8ff 1772
bogdanm 0:9b334a45a8ff 1773 /* Check FLASH End of Operation flag */
bogdanm 0:9b334a45a8ff 1774 if(__HAL_FLASH_GET_FLAG(FLASH_FLAG_EOP) != RESET)
bogdanm 0:9b334a45a8ff 1775 {
bogdanm 0:9b334a45a8ff 1776 if(ProcFlash.ProcedureOnGoing == FLASH_PROC_PAGEERASE)
bogdanm 0:9b334a45a8ff 1777 {
bogdanm 0:9b334a45a8ff 1778 /*Nb of sector to erased can be decreased*/
bogdanm 0:9b334a45a8ff 1779 ProcFlash.NbPagesToErase--;
bogdanm 0:9b334a45a8ff 1780
bogdanm 0:9b334a45a8ff 1781 /* Check if there are still sectors to erase*/
bogdanm 0:9b334a45a8ff 1782 if(ProcFlash.NbPagesToErase != 0)
bogdanm 0:9b334a45a8ff 1783 {
bogdanm 0:9b334a45a8ff 1784 temp = ProcFlash.Page;
bogdanm 0:9b334a45a8ff 1785 /*Indicate user which sector has been erased*/
bogdanm 0:9b334a45a8ff 1786 HAL_FLASH_EndOfOperationCallback(temp);
bogdanm 0:9b334a45a8ff 1787
bogdanm 0:9b334a45a8ff 1788 /* Clear pending flags (if any) */
bogdanm 0:9b334a45a8ff 1789 __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_MASK);
bogdanm 0:9b334a45a8ff 1790
bogdanm 0:9b334a45a8ff 1791 /*Increment sector number*/
bogdanm 0:9b334a45a8ff 1792 temp = ProcFlash.Page + FLASH_PAGE_SIZE;
bogdanm 0:9b334a45a8ff 1793 ProcFlash.Page = ProcFlash.Page + FLASH_PAGE_SIZE;
bogdanm 0:9b334a45a8ff 1794 FLASH_ErasePage(temp);
bogdanm 0:9b334a45a8ff 1795 }
bogdanm 0:9b334a45a8ff 1796 else
bogdanm 0:9b334a45a8ff 1797 {
bogdanm 0:9b334a45a8ff 1798 /*No more sectors to Erase, user callback can be called.*/
bogdanm 0:9b334a45a8ff 1799 /*Reset Sector and stop Erase sectors procedure*/
bogdanm 0:9b334a45a8ff 1800 ProcFlash.Page = temp = 0xFFFFFFFF;
bogdanm 0:9b334a45a8ff 1801 ProcFlash.ProcedureOnGoing = FLASH_PROC_NONE;
bogdanm 0:9b334a45a8ff 1802 /* FLASH EOP interrupt user callback */
bogdanm 0:9b334a45a8ff 1803 HAL_FLASH_EndOfOperationCallback(temp);
bogdanm 0:9b334a45a8ff 1804 /* Clear FLASH End of Operation pending bit */
bogdanm 0:9b334a45a8ff 1805 __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_EOP);
bogdanm 0:9b334a45a8ff 1806 }
bogdanm 0:9b334a45a8ff 1807 }
bogdanm 0:9b334a45a8ff 1808 else
bogdanm 0:9b334a45a8ff 1809 {
bogdanm 0:9b334a45a8ff 1810 if(ProcFlash.ProcedureOnGoing == FLASH_PROC_PROGRAM)
bogdanm 0:9b334a45a8ff 1811 {
bogdanm 0:9b334a45a8ff 1812 /*Program ended. Return the selected address*/
bogdanm 0:9b334a45a8ff 1813 /* FLASH EOP interrupt user callback */
bogdanm 0:9b334a45a8ff 1814 HAL_FLASH_EndOfOperationCallback(ProcFlash.Address);
bogdanm 0:9b334a45a8ff 1815 }
bogdanm 0:9b334a45a8ff 1816 ProcFlash.ProcedureOnGoing = FLASH_PROC_NONE;
bogdanm 0:9b334a45a8ff 1817 /* Clear FLASH End of Operation pending bit */
bogdanm 0:9b334a45a8ff 1818 __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_EOP);
bogdanm 0:9b334a45a8ff 1819 }
bogdanm 0:9b334a45a8ff 1820
bogdanm 0:9b334a45a8ff 1821 }
bogdanm 0:9b334a45a8ff 1822
bogdanm 0:9b334a45a8ff 1823 /* Check FLASH operation error flags */
bogdanm 0:9b334a45a8ff 1824 if( (__HAL_FLASH_GET_FLAG(FLASH_FLAG_WRPERR) != RESET) ||
bogdanm 0:9b334a45a8ff 1825 (__HAL_FLASH_GET_FLAG(FLASH_FLAG_PGAERR) != RESET) ||
bogdanm 0:9b334a45a8ff 1826 (__HAL_FLASH_GET_FLAG(FLASH_FLAG_SIZERR) != RESET) ||
bogdanm 0:9b334a45a8ff 1827 #if defined (STM32L151xBA) || defined (STM32L152xBA) || \
bogdanm 0:9b334a45a8ff 1828 defined (STM32L151xC) || defined (STM32L152xC) || defined (STM32L162xC)
bogdanm 0:9b334a45a8ff 1829 (__HAL_FLASH_GET_FLAG(FLASH_FLAG_RDERR) != RESET) ||
bogdanm 0:9b334a45a8ff 1830 #endif /* STM32L151xBA || STM32L152xBA || STM32L151xC || STM32L152xC || STM32L162xC */
bogdanm 0:9b334a45a8ff 1831 #if defined(STM32L100xC) || defined (STM32L151xC) || defined (STM32L152xC) || defined (STM32L162xC) || \
bogdanm 0:9b334a45a8ff 1832 defined(STM32L151xCA) || defined (STM32L151xD) || defined (STM32L152xCA) || defined (STM32L152xD) || defined (STM32L162xCA) || defined (STM32L162xD) || \
bogdanm 0:9b334a45a8ff 1833 defined(STM32L151xE) || defined (STM32L152xE) || defined (STM32L162xE)
bogdanm 0:9b334a45a8ff 1834 (__HAL_FLASH_GET_FLAG(FLASH_FLAG_OPTVERRUSR) != RESET) ||
bogdanm 0:9b334a45a8ff 1835 #endif /* STM32L100xC || STM32L151xC || STM32L152xC || STM32L162xC || STM32L151xCA || STM32L151xD || STM32L152xCA || STM32L152xD || STM32L162xCA || STM32L162xD || STM32L151xE || STM32L152xE || STM32L162xE */
bogdanm 0:9b334a45a8ff 1836 (__HAL_FLASH_GET_FLAG(FLASH_FLAG_OPTVERR) != RESET) )
bogdanm 0:9b334a45a8ff 1837 {
bogdanm 0:9b334a45a8ff 1838 if(ProcFlash.ProcedureOnGoing == FLASH_PROC_PAGEERASE)
bogdanm 0:9b334a45a8ff 1839 {
bogdanm 0:9b334a45a8ff 1840 /*return the faulty sector*/
bogdanm 0:9b334a45a8ff 1841 temp = ProcFlash.Page;
bogdanm 0:9b334a45a8ff 1842 ProcFlash.Page = 0xFFFFFFFF;
bogdanm 0:9b334a45a8ff 1843 }
bogdanm 0:9b334a45a8ff 1844 else
bogdanm 0:9b334a45a8ff 1845 {
bogdanm 0:9b334a45a8ff 1846 /*retrun the faulty address*/
bogdanm 0:9b334a45a8ff 1847 temp = ProcFlash.Address;
bogdanm 0:9b334a45a8ff 1848 }
bogdanm 0:9b334a45a8ff 1849
bogdanm 0:9b334a45a8ff 1850 /*Save the Error code*/
bogdanm 0:9b334a45a8ff 1851 FLASH_SetErrorCode();
bogdanm 0:9b334a45a8ff 1852
bogdanm 0:9b334a45a8ff 1853 /* FLASH error interrupt user callback */
bogdanm 0:9b334a45a8ff 1854 HAL_FLASH_OperationErrorCallback(temp);
bogdanm 0:9b334a45a8ff 1855
bogdanm 0:9b334a45a8ff 1856 /* Clear FLASH error pending bits */
bogdanm 0:9b334a45a8ff 1857 __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_MASK);
bogdanm 0:9b334a45a8ff 1858
bogdanm 0:9b334a45a8ff 1859 /*Stop the procedure ongoing*/
bogdanm 0:9b334a45a8ff 1860 ProcFlash.ProcedureOnGoing = FLASH_PROC_NONE;
bogdanm 0:9b334a45a8ff 1861 }
bogdanm 0:9b334a45a8ff 1862
bogdanm 0:9b334a45a8ff 1863 if(ProcFlash.ProcedureOnGoing == FLASH_PROC_NONE)
bogdanm 0:9b334a45a8ff 1864 {
bogdanm 0:9b334a45a8ff 1865 /* Disable End of FLASH Operation interrupt */
bogdanm 0:9b334a45a8ff 1866 __HAL_FLASH_DISABLE_IT(FLASH_IT_EOP);
bogdanm 0:9b334a45a8ff 1867
bogdanm 0:9b334a45a8ff 1868 /* Disable Error source interrupt */
bogdanm 0:9b334a45a8ff 1869 __HAL_FLASH_DISABLE_IT(FLASH_IT_ERR);
bogdanm 0:9b334a45a8ff 1870
bogdanm 0:9b334a45a8ff 1871 /* Process Unlocked */
bogdanm 0:9b334a45a8ff 1872 __HAL_UNLOCK(&ProcFlash);
bogdanm 0:9b334a45a8ff 1873 }
bogdanm 0:9b334a45a8ff 1874
bogdanm 0:9b334a45a8ff 1875 }
bogdanm 0:9b334a45a8ff 1876
bogdanm 0:9b334a45a8ff 1877 /**
bogdanm 0:9b334a45a8ff 1878 * @}
bogdanm 0:9b334a45a8ff 1879 */
bogdanm 0:9b334a45a8ff 1880
bogdanm 0:9b334a45a8ff 1881 /**
bogdanm 0:9b334a45a8ff 1882 * @}
bogdanm 0:9b334a45a8ff 1883 */
bogdanm 0:9b334a45a8ff 1884
bogdanm 0:9b334a45a8ff 1885 /** @defgroup FLASH_Internal_Functions FLASH Internal function
bogdanm 0:9b334a45a8ff 1886 * @{
bogdanm 0:9b334a45a8ff 1887 */
bogdanm 0:9b334a45a8ff 1888
bogdanm 0:9b334a45a8ff 1889 /**
bogdanm 0:9b334a45a8ff 1890 * @brief Wait for a FLASH operation to complete.
bogdanm 0:9b334a45a8ff 1891 * @param Timeout: maximum flash operationtimeout
bogdanm 0:9b334a45a8ff 1892 * @retval HAL status
bogdanm 0:9b334a45a8ff 1893 */
bogdanm 0:9b334a45a8ff 1894 HAL_StatusTypeDef FLASH_WaitForLastOperation(uint32_t Timeout)
bogdanm 0:9b334a45a8ff 1895 {
bogdanm 0:9b334a45a8ff 1896 /* Wait for the FLASH operation to complete by polling on BUSY flag to be reset.
bogdanm 0:9b334a45a8ff 1897 Even if the FLASH operation fails, the BUSY flag will be reset and an error
bogdanm 0:9b334a45a8ff 1898 flag will be set */
bogdanm 0:9b334a45a8ff 1899
bogdanm 0:9b334a45a8ff 1900 uint32_t tickstart = HAL_GetTick();
bogdanm 0:9b334a45a8ff 1901
bogdanm 0:9b334a45a8ff 1902 while(__HAL_FLASH_GET_FLAG(FLASH_FLAG_BSY) != RESET)
bogdanm 0:9b334a45a8ff 1903 {
bogdanm 0:9b334a45a8ff 1904 if(Timeout != HAL_MAX_DELAY)
bogdanm 0:9b334a45a8ff 1905 {
bogdanm 0:9b334a45a8ff 1906 if((Timeout == 0)||((HAL_GetTick() - tickstart ) > Timeout))
bogdanm 0:9b334a45a8ff 1907 {
bogdanm 0:9b334a45a8ff 1908 return HAL_TIMEOUT;
bogdanm 0:9b334a45a8ff 1909 }
bogdanm 0:9b334a45a8ff 1910 }
bogdanm 0:9b334a45a8ff 1911 }
bogdanm 0:9b334a45a8ff 1912
bogdanm 0:9b334a45a8ff 1913 if( (__HAL_FLASH_GET_FLAG(FLASH_FLAG_WRPERR) != RESET) ||
bogdanm 0:9b334a45a8ff 1914 (__HAL_FLASH_GET_FLAG(FLASH_FLAG_PGAERR) != RESET) ||
bogdanm 0:9b334a45a8ff 1915 (__HAL_FLASH_GET_FLAG(FLASH_FLAG_SIZERR) != RESET) ||
bogdanm 0:9b334a45a8ff 1916 #if defined (STM32L151xBA) || defined (STM32L152xBA) || \
bogdanm 0:9b334a45a8ff 1917 defined (STM32L151xC) || defined (STM32L152xC) || defined (STM32L162xC)
bogdanm 0:9b334a45a8ff 1918 (__HAL_FLASH_GET_FLAG(FLASH_FLAG_RDERR) != RESET) ||
bogdanm 0:9b334a45a8ff 1919 #endif /* STM32L151xBA || STM32L152xBA || STM32L151xC || STM32L152xC || STM32L162xC */
bogdanm 0:9b334a45a8ff 1920 #if defined(STM32L100xC) || defined (STM32L151xC) || defined (STM32L152xC) || defined (STM32L162xC) || \
bogdanm 0:9b334a45a8ff 1921 defined(STM32L151xCA) || defined (STM32L151xD) || defined (STM32L152xCA) || defined (STM32L152xD) || defined (STM32L162xCA) || defined (STM32L162xD) || \
bogdanm 0:9b334a45a8ff 1922 defined(STM32L151xE) || defined (STM32L152xE) || defined (STM32L162xE)
bogdanm 0:9b334a45a8ff 1923 (__HAL_FLASH_GET_FLAG(FLASH_FLAG_OPTVERRUSR) != RESET) ||
bogdanm 0:9b334a45a8ff 1924 #endif /* STM32L100xC || STM32L151xC || STM32L152xC || STM32L162xC || STM32L151xCA || STM32L151xD || STM32L152xCA || STM32L152xD || STM32L162xCA || STM32L162xD || STM32L151xE || STM32L152xE || STM32L162xE */
bogdanm 0:9b334a45a8ff 1925 (__HAL_FLASH_GET_FLAG(FLASH_FLAG_OPTVERR) != RESET) )
bogdanm 0:9b334a45a8ff 1926 {
bogdanm 0:9b334a45a8ff 1927 /*Save the error code*/
bogdanm 0:9b334a45a8ff 1928 FLASH_SetErrorCode();
bogdanm 0:9b334a45a8ff 1929 return HAL_ERROR;
bogdanm 0:9b334a45a8ff 1930 }
bogdanm 0:9b334a45a8ff 1931
bogdanm 0:9b334a45a8ff 1932 /* There is no error flag set */
bogdanm 0:9b334a45a8ff 1933 return HAL_OK;
bogdanm 0:9b334a45a8ff 1934 }
bogdanm 0:9b334a45a8ff 1935
bogdanm 0:9b334a45a8ff 1936
bogdanm 0:9b334a45a8ff 1937 /**
bogdanm 0:9b334a45a8ff 1938 * @}
bogdanm 0:9b334a45a8ff 1939 */
bogdanm 0:9b334a45a8ff 1940
bogdanm 0:9b334a45a8ff 1941 #endif /* HAL_FLASH_MODULE_ENABLED */
bogdanm 0:9b334a45a8ff 1942
bogdanm 0:9b334a45a8ff 1943 /**
bogdanm 0:9b334a45a8ff 1944 * @}
bogdanm 0:9b334a45a8ff 1945 */
bogdanm 0:9b334a45a8ff 1946
bogdanm 0:9b334a45a8ff 1947 /**
bogdanm 0:9b334a45a8ff 1948 * @}
bogdanm 0:9b334a45a8ff 1949 */
bogdanm 0:9b334a45a8ff 1950
bogdanm 0:9b334a45a8ff 1951 /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
bogdanm 0:9b334a45a8ff 1952