/** ****************************************************************************** * @file stm8l10x_flash.c * @brief This file contains all the functions for the FLASH peripheral. * @author STMicroelectronics - MCD Application Team * @version V1.1.0 * @date 09/14/2009 ****************************************************************************** * * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. * *

© COPYRIGHT 2009 STMicroelectronics

* @image html logo.bmp ****************************************************************************** */ /* Includes ------------------------------------------------------------------*/ #include "stm8l10x_flash.h" /* Private TypeDef -----------------------------------------------------------*/ /* Private define ------------------------------------------------------------*/ #define FLASH_CLEAR_BYTE (uint8_t)0x00; #define FLASH_SET_BYTE (uint8_t)0xFF; /* Private macro -------------------------------------------------------------*/ /* Private variables ---------------------------------------------------------*/ /* Private function prototypes -----------------------------------------------*/ /* Private Constants ---------------------------------------------------------*/ #define OPERATION_TIMEOUT ((uint16_t)0x1000) /* Public functions ----------------------------------------------------------*/ /** @addtogroup FLASH_Public_functions * @{ */ /** * @brief Unlocks the program or data EEPROM memory * @param[in] FLASH_MemType : Memory type to unlock * This parameter can be any of the @ref FLASH_MemType_TypeDef enumeration. * @retval * None */ void FLASH_Unlock(FLASH_MemType_TypeDef FLASH_MemType) { /* Check parameter */ assert_param(IS_MEMORY_TYPE(FLASH_MemType)); /* Unlock program memory */ if (FLASH_MemType == FLASH_MemType_Program) { FLASH->PUKR = FLASH_RASS_KEY1; FLASH->PUKR= FLASH_RASS_KEY2; } /* Unlock data memory */ if (FLASH_MemType == FLASH_MemType_Data) { FLASH->DUKR = FLASH_RASS_KEY2; /* Warning: keys are reversed on data memory !!! */ FLASH->DUKR = FLASH_RASS_KEY1; } } /** * @brief Locks the program or data EEPROM memory * @param[in] FLASH_MemType : Memory type * This parameter can be any of the @ref FLASH_MemType_TypeDef enumeration. * @retval * None */ void FLASH_Lock(FLASH_MemType_TypeDef FLASH_MemType) { /* Check parameter */ assert_param(IS_MEMORY_TYPE(FLASH_MemType)); /* Lock memory */ FLASH->IAPSR &= FLASH_MemType; } /** * @brief Deinitializes the FLASH peripheral registers to their default reset values. * @par Parameters: * None * @retval * None */ void FLASH_DeInit(void) { uint8_t temp; FLASH->CR1 = FLASH_CR1_RESET_VALUE; FLASH->CR2 = FLASH_CR2_RESET_VALUE; FLASH->IAPSR = FLASH_IAPSR_RESET_VALUE; temp = FLASH->IAPSR; /* Reading of this register causes the clearing of status flags */ } /** * @brief Enables or Disables the Flash interrupt mode * @param[in] NewState : The new state of the flash interrupt mode * This parameter can be any of the @ref FunctionalState enumeration. * @retval * None */ void FLASH_ITConfig(FunctionalState NewState) { /* Check parameter */ assert_param(IS_FUNCTIONAL_STATE(NewState)); if (NewState != DISABLE) { FLASH->CR1 |= FLASH_CR1_IE; /* Enables the interrupt sources */ } else { FLASH->CR1 &= (uint8_t)(~FLASH_CR1_IE); /* Disables the interrupt sources */ } } /** * @brief Erases one byte in the program or data EEPROM memory * @param[in] Address : Address of the byte to erase * @retval @ref FLASH_Status_TypeDef : State of the last operation * @par Required preconditions: * PointerAttr define is declared in the stm8l10x.h file to select the pointer that declared * as near (2 bytes). */ void FLASH_EraseByte(uint16_t Address) { /* Check parameter */ assert_param(IS_FLASH_ADDRESS(Address)); *((PointerAttr uint8_t*) Address) = FLASH_CLEAR_BYTE; /* Erase byte */ } /** * @brief Programs one byte in program or data EEPROM memory * @param[in] Address : Adress where the byte is written * @param[in] Data : Value to be written * @retval @ref FLASH_Status_TypeDef : State of the last operation * @par Required preconditions: * PointerAttr define is declared in the stm8l10x.h file to select the pointer that declared * as near (2 bytes). */ void FLASH_ProgramByte(uint16_t Address, uint8_t Data) { /* Check parameters */ assert_param(IS_FLASH_ADDRESS(Address)); *((PointerAttr uint8_t*) Address) = Data; } /** * @brief Programs one word (4 bytes) in program or data EEPROM memory * @param[in] Address : The address where the data will be written * @param[in] Data : Value to be written * @retval * None. * @par Required preconditions: * PointerAttr define is declared in the stm8l10x.h file to select the pointer that declared * as near (2 bytes). */ void FLASH_ProgramWord(uint16_t Address, uint32_t Data) { /* Check parameters */ assert_param(IS_FLASH_ADDRESS(Address)); /* Enable Word Write Once */ FLASH->CR2 |= FLASH_CR2_WPRG; *((PointerAttr uint8_t*)Address) = *((uint8_t*)(&Data)); /* Write one byte - from lowest address*/ *(((PointerAttr uint8_t*)Address) + 1) = *((uint8_t*)(&Data)+1); /* Write one byte*/ *(((PointerAttr uint8_t*)Address) + 2) = *((uint8_t*)(&Data)+2); /* Write one byte*/ *(((PointerAttr uint8_t*)Address) + 3) = *((uint8_t*)(&Data)+3); /* Write one byte - from higher address*/ } /** * @brief Reads any byte from flash memory * @param[in] Address : Address to read * @retval uint8_t : Value read * @par Required preconditions: * PointerAttr define is declared in the stm8l10x.h file to select the pointer that declared * as near (2 bytes). */ uint8_t FLASH_ReadByte(uint16_t Address) { /* Check parameter */ assert_param(IS_FLASH_ADDRESS(Address)); return(*((PointerAttr uint8_t*) Address)); /* Read byte */ } /** * @brief Sets the fixed programming time * @param[in] FLASH_ProgramTime : Indicates the programming time to be fixed * This parameter can be any of the @ref FLASH_ProgramTime_TypeDef enumeration. * @retval * None */ void FLASH_SetProgrammingTime(FLASH_ProgramTime_TypeDef FLASH_ProgramTime) { /* Check parameter */ assert_param(IS_FLASH_PROGRAM_TIME(FLASH_ProgramTime)); FLASH->CR1 &= (uint8_t)(~FLASH_CR1_FIX); FLASH->CR1 |= (uint8_t)FLASH_ProgramTime; } /** * @brief Returns the fixed programming time * @par Parameters: * None * @retval @ref FLASH_ProgramTime_TypeDef : Fixed programming time value */ FLASH_ProgramTime_TypeDef FLASH_GetProgrammingTime(void) { return((FLASH_ProgramTime_TypeDef)(FLASH->CR1 & FLASH_CR1_FIX)); } /** * @brief Returns the FLASH Read Out Protection Status. * @par Parameters: * None * @retval FunctionalState: Indicates the FLASH Read Out Protection Status. * This parameter can be any of the @ref FunctionalState enumeration. */ FunctionalState FLASH_GetReadOutProtectionStatus(void) { if (OPT->OPT0_LOCKBYTE == FLASH_READOUTPROTECTION_KEY) { /* The status of the Flash read out protection is enabled*/ return ENABLE; } else { /* The status of the Flash read out protection is disabled*/ return DISABLE; } } /** * @brief Returns the Boot memory size in bytes * @par Parameters: * None * @retval uint16_t : Boot memory size in bytes */ uint16_t FLASH_GetBootSize(void) { uint16_t temp; /* Calculates the number of bytes */ temp = (uint16_t)(OPT->OPT2_BOOTSIZE * (uint16_t)64); /* Correction because size upper 8kb doesn't exist */ if (OPT->OPT2_BOOTSIZE > 0x7F) { temp = 8192; } /* Return value */ return(temp); } /** * @brief Returns the Data EEPROM Area size in bytes * @par Parameters: * None * @retval uint16_t : Data EEPROM Area size in bytes */ uint16_t FLASH_GetDataSize(void) { uint16_t temp; /* Calculates the number of bytes */ temp = (uint16_t)(OPT->OPT3_DATASIZE * (uint16_t)64); /* Correction because size upper of 2kb doesn't exist */ if (OPT->OPT3_DATASIZE > 0x20) { temp = 2048; } /* Return value */ return(temp); } /** * @brief Checks whether the specified FLASH flag is set or not. * @param[in] FLASH_FLAG : specifies the Flash Flag to check. * This parameter can be any of the @ref FLASH_FLAG_TypeDef enumeration. * @retval FlagStatus : Indicates the state of the Flash_Flag. * This parameter can be any of the @ref FlagStatus enumeration. */ FlagStatus FLASH_GetFlagStatus(FLASH_FLAG_TypeDef FLASH_FLAG) { FlagStatus status = RESET; assert_param(IS_FLASH_FLAGS(FLASH_FLAG)); /* Check the status of the specified flash flag*/ if ((FLASH->IAPSR & (uint8_t)FLASH_FLAG) != (uint8_t)RESET) { status = SET; /* FLASH_FLAG is set*/ } else { status = RESET; /* FLASH_FLAG is reset*/ } /* Return the Flash_Flag status*/ return status; } /** * @brief Wait for a Flash operation to complete. * @par Parameters: * None * @retval FLASH_Status_TypeDef State of the last operation * @par Required preconditions: * The FLASH_WaitForLastOperation function should be executed from RAM. * This function return the FLASH status and clears the EOP, WR_PG_DIS flags in the IAPSR register. */ FLASH_Status_TypeDef FLASH_WaitForLastOperation(void) { uint32_t timeout = OPERATION_TIMEOUT; uint8_t My_FlagStatus = 0x00; /* Wait until operation completion or write protected page occured */ while ((My_FlagStatus == 0x00) && (timeout != 0x00)) { My_FlagStatus = (uint8_t)(FLASH->IAPSR & (FLASH_IAPSR_EOP | FLASH_IAPSR_WR_PG_DIS)); timeout--; } if (timeout == 0x00 ) { My_FlagStatus = FLASH_Status_TimeOut; } return((FLASH_Status_TypeDef)My_FlagStatus); } /* *****************************************************************************************/ /* Uncomment the line below to use these functions */ /* */ /* *****************************************************************************************/ /* LINKER SECTIONS DEFINITION FOR THIS FILE ONLY */ #ifdef USE_COSMIC_SECTIONS #pragma section (FLASH_CODE) #pragma section const {FLASH_CONST} #pragma section @near [FLASH_URAM] #pragma section @near {FLASH_IRAM} #pragma section @tiny [FLASH_UZRAM] #pragma section @tiny {FLASH_IZRAM} #endif /** * @brief Erases one Block in the program or data EEPROM memory * @param[in] BlockNum : The Block number * @retval * None * @par Required preconditions: * The FLASH_EraseBlock function Should be executed from RAM. * PointerAttr define is declared in the stm8l10x.h file to select the pointer that declared * as near (2 bytes). */ void FLASH_EraseBlock(uint8_t BlockNum) { uint32_t *pwFlash; uint16_t StartAddress = 0; /* Check parameters */ assert_param(IS_FLASH_BLOCK_NUMBER(BlockNum)); StartAddress = FLASH_START_PHYSICAL_ADDRESS; /* Point to the first block address */ pwFlash = (PointerAttr uint32_t *)(StartAddress + ((uint16_t)BlockNum * (uint16_t)FLASH_BLOCK_SIZE)); /* Enable Word Write Once */ FLASH->CR2 |= FLASH_CR2_ERASE; *pwFlash = (uint32_t)0; } /** * @brief Programs a memory block * @param[in] BlockNum : The Block number * @param[in] FLASH_ProgramMode : The programming mode. * @param[in] Buffer : The buffer address of source data. * @retval * None * @par Required preconditions: * The FLASH_ProgramBlock function should be executed from RAM. * PointerAttr define is declared in the stm8l10x.h file to select the pointer that declared * as near (2 bytes). */ void FLASH_ProgramBlock(uint8_t BlockNum, FLASH_ProgramMode_TypeDef FLASH_ProgramMode, uint8_t *Buffer) { uint16_t Count = 0; uint16_t StartAddress; /* Check parameters */ assert_param(IS_FLASH_BLOCK_NUMBER(BlockNum)); assert_param(IS_FLASH_PROGRAM_MODE(FLASH_ProgramMode)); /* Selection of Standard or Fast programming mode */ if (FLASH_ProgramMode == FLASH_ProgramMode_Standard) { /* Standard programming mode */ FLASH->CR2 |= FLASH_CR2_PRG; } else { /* Fast programming mode */ FLASH->CR2 |= FLASH_CR2_FPRG; } StartAddress = FLASH_START_PHYSICAL_ADDRESS; /* Point to the first Block address */ StartAddress = StartAddress + ((uint16_t)BlockNum * (uint16_t)FLASH_BLOCK_SIZE); /* Copy data bytes from RAM to FLASH memory */ for (Count = 0; Count < FLASH_BLOCK_SIZE; Count++) { *((PointerAttr uint8_t*)StartAddress + Count) = ((uint8_t)(Buffer[Count])); } } /** * @} */ /******************* (C) COPYRIGHT 2009 STMicroelectronics *****END OF FILE****/