mirror of
				https://github.com/mfulz/qmk_firmware.git
				synced 2025-10-31 05:12:33 +01:00 
			
		
		
		
	Remove eeprom_f4 due to conflicting license
This commit is contained in:
		
							parent
							
								
									d9cf6c6730
								
							
						
					
					
						commit
						ce5678b819
					
				| @ -1,822 +0,0 @@ | ||||
| /**
 | ||||
|   ****************************************************************************** | ||||
|   * @file    EEPROM/EEPROM_Emulation/src/eeprom.c | ||||
|   * @author  MCD Application Team | ||||
|   * @brief   This file provides all the EEPROM emulation firmware functions. | ||||
|   ****************************************************************************** | ||||
|   * @attention | ||||
|   * | ||||
|   * <h2><center>© Copyright <EFBFBD> 2017 STMicroelectronics International N.V. | ||||
|   * All rights reserved.</center></h2> | ||||
|   * | ||||
|   * Redistribution and use in source and binary forms, with or without | ||||
|   * modification, are permitted, provided that the following conditions are met: | ||||
|   * | ||||
|   * 1. Redistribution of source code must retain the above copyright notice, | ||||
|   *    this list of conditions and the following disclaimer. | ||||
|   * 2. Redistributions in binary form must reproduce the above copyright notice, | ||||
|   *    this list of conditions and the following disclaimer in the documentation | ||||
|   *    and/or other materials provided with the distribution. | ||||
|   * 3. Neither the name of STMicroelectronics nor the names of other | ||||
|   *    contributors to this software may be used to endorse or promote products | ||||
|   *    derived from this software without specific written permission. | ||||
|   * 4. This software, including modifications and/or derivative works of this | ||||
|   *    software, must execute solely and exclusively on microcontroller or | ||||
|   *    microprocessor devices manufactured by or for STMicroelectronics. | ||||
|   * 5. Redistribution and use of this software other than as permitted under | ||||
|   *    this license is void and will automatically terminate your rights under | ||||
|   *    this license. | ||||
|   * | ||||
|   * THIS SOFTWARE IS PROVIDED BY STMICROELECTRONICS AND CONTRIBUTORS "AS IS" | ||||
|   * AND ANY EXPRESS, IMPLIED OR STATUTORY WARRANTIES, INCLUDING, BUT NOT | ||||
|   * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A | ||||
|   * PARTICULAR PURPOSE AND NON-INFRINGEMENT OF THIRD PARTY INTELLECTUAL PROPERTY | ||||
|   * RIGHTS ARE DISCLAIMED TO THE FULLEST EXTENT PERMITTED BY LAW. IN NO EVENT | ||||
|   * SHALL STMICROELECTRONICS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, | ||||
|   * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | ||||
|   * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, | ||||
|   * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF | ||||
|   * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING | ||||
|   * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, | ||||
|   * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||||
|   * | ||||
|   ****************************************************************************** | ||||
|   */ | ||||
| /** @addtogroup EEPROM_Emulation
 | ||||
|   * @{ | ||||
|   */ | ||||
| 
 | ||||
| /* Includes ------------------------------------------------------------------*/ | ||||
| #include "eeprom_f4.h" | ||||
| 
 | ||||
| /* Private typedef -----------------------------------------------------------*/ | ||||
| /* Private define ------------------------------------------------------------*/ | ||||
| /* Private macro -------------------------------------------------------------*/ | ||||
| /* Private variables ---------------------------------------------------------*/ | ||||
| 
 | ||||
| /* Global variable used to store variable value in read sequence */ | ||||
| uint16_t DataVar = 0; | ||||
| 
 | ||||
| /* Virtual address defined by the user: 0xFFFF value is prohibited */ | ||||
| extern uint16_t VirtAddVarTab[NB_OF_VAR]; | ||||
| 
 | ||||
| /* Private function prototypes -----------------------------------------------*/ | ||||
| /* Private functions ---------------------------------------------------------*/ | ||||
| static HAL_StatusTypeDef EE_Format(void); | ||||
| static uint16_t EE_FindValidPage(uint8_t Operation); | ||||
| static uint16_t EE_VerifyPageFullWriteVariable(uint16_t VirtAddress, uint16_t Data); | ||||
| static uint16_t EE_PageTransfer(uint16_t VirtAddress, uint16_t Data); | ||||
| static uint16_t EE_VerifyPageFullyErased(uint32_t Address); | ||||
| 
 | ||||
| /**
 | ||||
|   * @brief  Restore the pages to a known good state in case of page's status | ||||
|   *   corruption after a power loss. | ||||
|   * @param  None. | ||||
|   * @retval - Flash error code: on write Flash error | ||||
|   *         - FLASH_COMPLETE: on success | ||||
|   */ | ||||
| uint16_t EE_Init(void) | ||||
| { | ||||
|   uint16_t PageStatus0 = 6, PageStatus1 = 6; | ||||
|   uint16_t VarIdx = 0; | ||||
|   uint16_t EepromStatus = 0, ReadStatus = 0; | ||||
|   int16_t x = -1; | ||||
|   HAL_StatusTypeDef  FlashStatus; | ||||
| 
 | ||||
|   FLASH_UnlockF4(); | ||||
| 
 | ||||
|   /* Get Page0 status */ | ||||
|   PageStatus0 = (*(__IO uint16_t*)PAGE0_BASE_ADDRESS); | ||||
|   /* Get Page1 status */ | ||||
|   PageStatus1 = (*(__IO uint16_t*)PAGE1_BASE_ADDRESS); | ||||
| 
 | ||||
|   /* Check for invalid header states and repair if necessary */ | ||||
|   switch (PageStatus0) | ||||
|   { | ||||
|     case ERASED: | ||||
|       if (PageStatus1 == VALID_PAGE) /* Page0 erased, Page1 valid */ | ||||
|       { | ||||
|           /* Erase Page0 */ | ||||
|         if(!EE_VerifyPageFullyErased(PAGE0_BASE_ADDRESS)) | ||||
|         { | ||||
|           FlashStatus = FLASH_EraseSectorF4(PAGE0_ID); | ||||
|           /* If erase operation was failed, a Flash error code is returned */ | ||||
|           if (FlashStatus != HAL_OK) | ||||
|           { | ||||
|             return FlashStatus; | ||||
|           } | ||||
|         } | ||||
|       } | ||||
|       else if (PageStatus1 == RECEIVE_DATA) /* Page0 erased, Page1 receive */ | ||||
|       { | ||||
|         /* Erase Page0 */ | ||||
|         if(!EE_VerifyPageFullyErased(PAGE0_BASE_ADDRESS)) | ||||
|         { | ||||
|           FlashStatus = FLASH_EraseSectorF4(PAGE1_ID); | ||||
|           /* If erase operation was failed, a Flash error code is returned */ | ||||
|           if (FlashStatus != HAL_OK) | ||||
|           { | ||||
|             return FlashStatus; | ||||
|           } | ||||
|         } | ||||
|         /* Mark Page1 as valid */ | ||||
|         FlashStatus = FLASH_ProgramHalfWordF4(PAGE1_BASE_ADDRESS, VALID_PAGE); | ||||
|         /* If program operation was failed, a Flash error code is returned */ | ||||
|         if (FlashStatus != HAL_OK) | ||||
|         { | ||||
|           return FlashStatus; | ||||
|         } | ||||
|       } | ||||
|       else /* First EEPROM access (Page0&1 are erased) or invalid state -> format EEPROM */ | ||||
|       { | ||||
|         /* Erase both Page0 and Page1 and set Page0 as valid page */ | ||||
|         FlashStatus = EE_Format(); | ||||
|         /* If erase/program operation was failed, a Flash error code is returned */ | ||||
|         if (FlashStatus != HAL_OK) | ||||
|         { | ||||
|           return FlashStatus; | ||||
|         } | ||||
|       } | ||||
|       break; | ||||
| 
 | ||||
|     case RECEIVE_DATA: | ||||
|       if (PageStatus1 == VALID_PAGE) /* Page0 receive, Page1 valid */ | ||||
|       { | ||||
|         /* Transfer data from Page1 to Page0 */ | ||||
|         for (VarIdx = 0; VarIdx < NB_OF_VAR; VarIdx++) | ||||
|         { | ||||
|           if (( *(__IO uint16_t*)(PAGE0_BASE_ADDRESS + 6)) == VirtAddVarTab[VarIdx]) | ||||
|           { | ||||
|             x = VarIdx; | ||||
|           } | ||||
|           if (VarIdx != x) | ||||
|           { | ||||
|             /* Read the last variables' updates */ | ||||
|             ReadStatus = EE_ReadVariable(VirtAddVarTab[VarIdx], &DataVar); | ||||
|             /* In case variable corresponding to the virtual address was found */ | ||||
|             if (ReadStatus != 0x1) | ||||
|             { | ||||
|               /* Transfer the variable to the Page0 */ | ||||
|               EepromStatus = EE_VerifyPageFullWriteVariable(VirtAddVarTab[VarIdx], DataVar); | ||||
|               /* If program operation was failed, a Flash error code is returned */ | ||||
|               if (EepromStatus != HAL_OK) | ||||
|               { | ||||
|                 return EepromStatus; | ||||
|               } | ||||
|             } | ||||
|           } | ||||
|         } | ||||
|         /* Mark Page0 as valid */ | ||||
|         FlashStatus = FLASH_ProgramHalfWordF4(PAGE0_BASE_ADDRESS, VALID_PAGE); | ||||
|         /* If program operation was failed, a Flash error code is returned */ | ||||
|         if (FlashStatus != HAL_OK) | ||||
|         { | ||||
|           return FlashStatus; | ||||
|         } | ||||
|         /* Erase Page1 */ | ||||
|         if(!EE_VerifyPageFullyErased(PAGE1_BASE_ADDRESS)) | ||||
|         { | ||||
|           FlashStatus = FLASH_EraseSectorF4(PAGE1_ID); | ||||
|           /* If erase operation was failed, a Flash error code is returned */ | ||||
|           if (FlashStatus != HAL_OK) | ||||
|           { | ||||
|             return FlashStatus; | ||||
|           } | ||||
|         } | ||||
|       } | ||||
|       else if (PageStatus1 == ERASED) /* Page0 receive, Page1 erased */ | ||||
|       { | ||||
|         /* Erase Page1 */ | ||||
|         if(!EE_VerifyPageFullyErased(PAGE1_BASE_ADDRESS)) | ||||
|         { | ||||
|           FlashStatus = FLASH_EraseSectorF4(PAGE1_ID); | ||||
|           /* If erase operation was failed, a Flash error code is returned */ | ||||
|           if (FlashStatus != HAL_OK) | ||||
|           { | ||||
|             return FlashStatus; | ||||
|           } | ||||
|         } | ||||
|         /* Mark Page0 as valid */ | ||||
|         FlashStatus = FLASH_ProgramHalfWordF4(PAGE0_BASE_ADDRESS, VALID_PAGE); | ||||
|         /* If program operation was failed, a Flash error code is returned */ | ||||
|         if (FlashStatus != HAL_OK) | ||||
|         { | ||||
|           return FlashStatus; | ||||
|         } | ||||
|       } | ||||
|       else /* Invalid state -> format eeprom */ | ||||
|       { | ||||
|         /* Erase both Page0 and Page1 and set Page0 as valid page */ | ||||
|         FlashStatus = EE_Format(); | ||||
|         /* If erase/program operation was failed, a Flash error code is returned */ | ||||
|         if (FlashStatus != HAL_OK) | ||||
|         { | ||||
|           return FlashStatus; | ||||
|         } | ||||
|       } | ||||
|       break; | ||||
| 
 | ||||
|     case VALID_PAGE: | ||||
|       if (PageStatus1 == VALID_PAGE) /* Invalid state -> format eeprom */ | ||||
|       { | ||||
|         /* Erase both Page0 and Page1 and set Page0 as valid page */ | ||||
|         FlashStatus = EE_Format(); | ||||
|         /* If erase/program operation was failed, a Flash error code is returned */ | ||||
|         if (FlashStatus != HAL_OK) | ||||
|         { | ||||
|           return FlashStatus; | ||||
|         } | ||||
|       } | ||||
|       else if (PageStatus1 == ERASED) /* Page0 valid, Page1 erased */ | ||||
|       { | ||||
|         /* Erase Page1 */ | ||||
|         if(!EE_VerifyPageFullyErased(PAGE1_BASE_ADDRESS)) | ||||
|         { | ||||
|           FlashStatus = FLASH_EraseSectorF4(PAGE1_ID); | ||||
|           /* If erase operation was failed, a Flash error code is returned */ | ||||
|           if (FlashStatus != HAL_OK) | ||||
|           { | ||||
|             return FlashStatus; | ||||
|           } | ||||
|         } | ||||
|       } | ||||
|       else /* Page0 valid, Page1 receive */ | ||||
|       { | ||||
|         /* Transfer data from Page0 to Page1 */ | ||||
|         for (VarIdx = 0; VarIdx < NB_OF_VAR; VarIdx++) | ||||
|         { | ||||
|           if ((*(__IO uint16_t*)(PAGE1_BASE_ADDRESS + 6)) == VirtAddVarTab[VarIdx]) | ||||
|           { | ||||
|             x = VarIdx; | ||||
|           } | ||||
|           if (VarIdx != x) | ||||
|           { | ||||
|             /* Read the last variables' updates */ | ||||
|             ReadStatus = EE_ReadVariable(VirtAddVarTab[VarIdx], &DataVar); | ||||
|             /* In case variable corresponding to the virtual address was found */ | ||||
|             if (ReadStatus != 0x1) | ||||
|             { | ||||
|               /* Transfer the variable to the Page1 */ | ||||
|               EepromStatus = EE_VerifyPageFullWriteVariable(VirtAddVarTab[VarIdx], DataVar); | ||||
|               /* If program operation was failed, a Flash error code is returned */ | ||||
|               if (EepromStatus != HAL_OK) | ||||
|               { | ||||
|                 return EepromStatus; | ||||
|               } | ||||
|             } | ||||
|           } | ||||
|         } | ||||
|         /* Mark Page1 as valid */ | ||||
|         FlashStatus = FLASH_ProgramHalfWordF4(PAGE1_BASE_ADDRESS, VALID_PAGE); | ||||
|         /* If program operation was failed, a Flash error code is returned */ | ||||
|         if (FlashStatus != HAL_OK) | ||||
|         { | ||||
|           return FlashStatus; | ||||
|         } | ||||
|         /* Erase Page0 */ | ||||
|         if(!EE_VerifyPageFullyErased(PAGE0_BASE_ADDRESS)) | ||||
|         { | ||||
|           FlashStatus = FLASH_EraseSectorF4(PAGE0_ID); | ||||
|           /* If erase operation was failed, a Flash error code is returned */ | ||||
|           if (FlashStatus != HAL_OK) | ||||
|           { | ||||
|             return FlashStatus; | ||||
|           } | ||||
|         } | ||||
|       } | ||||
|       break; | ||||
| 
 | ||||
|     default:  /* Any other state -> format eeprom */ | ||||
|       /* Erase both Page0 and Page1 and set Page0 as valid page */ | ||||
|       FlashStatus = EE_Format(); | ||||
|       /* If erase/program operation was failed, a Flash error code is returned */ | ||||
|       if (FlashStatus != HAL_OK) | ||||
|       { | ||||
|         return FlashStatus; | ||||
|       } | ||||
|       break; | ||||
|   } | ||||
| 
 | ||||
|   return HAL_OK; | ||||
| } | ||||
| 
 | ||||
| /**
 | ||||
|   * @brief  Verify if specified page is fully erased. | ||||
|   * @param  Address: page address | ||||
|   *   This parameter can be one of the following values: | ||||
|   *     @arg PAGE0_BASE_ADDRESS: Page0 base address | ||||
|   *     @arg PAGE1_BASE_ADDRESS: Page1 base address | ||||
|   * @retval page fully erased status: | ||||
|   *           - 0: if Page not erased | ||||
|   *           - 1: if Page erased | ||||
|   */ | ||||
| uint16_t EE_VerifyPageFullyErased(uint32_t Address) | ||||
| { | ||||
|   uint32_t ReadStatus = 1; | ||||
|   uint16_t AddressValue = 0x5555; | ||||
| 
 | ||||
|   /* Check each active page address starting from end */ | ||||
|   while (Address <= PAGE0_END_ADDRESS) | ||||
|   { | ||||
|     /* Get the current location content to be compared with virtual address */ | ||||
|     AddressValue = (*(__IO uint16_t*)Address); | ||||
| 
 | ||||
|     /* Compare the read address with the virtual address */ | ||||
|     if (AddressValue != ERASED) | ||||
|     { | ||||
| 
 | ||||
|       /* In case variable value is read, reset ReadStatus flag */ | ||||
|       ReadStatus = 0; | ||||
| 
 | ||||
|       break; | ||||
|     } | ||||
|     /* Next address location */ | ||||
|     Address = Address + 4; | ||||
|   } | ||||
| 
 | ||||
|   /* Return ReadStatus value: (0: Page not erased, 1: Sector erased) */ | ||||
|   return ReadStatus; | ||||
| } | ||||
| 
 | ||||
| /**
 | ||||
|   * @brief  Returns the last stored variable data, if found, which correspond to | ||||
|   *   the passed virtual address | ||||
|   * @param  VirtAddress: Variable virtual address | ||||
|   * @param  Data: Global variable contains the read variable value | ||||
|   * @retval Success or error status: | ||||
|   *           - 0: if variable was found | ||||
|   *           - 1: if the variable was not found | ||||
|   *           - NO_VALID_PAGE: if no valid page was found. | ||||
|   */ | ||||
| uint16_t EE_ReadVariable(uint16_t VirtAddress, uint16_t* Data) | ||||
| { | ||||
|   uint16_t ValidPage = PAGE0; | ||||
|   uint16_t AddressValue = 0x5555, ReadStatus = 1; | ||||
|   uint32_t Address = EEPROM_START_ADDRESS, PageStartAddress = EEPROM_START_ADDRESS; | ||||
| 
 | ||||
|   /* Get active Page for read operation */ | ||||
|   ValidPage = EE_FindValidPage(READ_FROM_VALID_PAGE); | ||||
| 
 | ||||
|   /* Check if there is no valid page */ | ||||
|   if (ValidPage == NO_VALID_PAGE) | ||||
|   { | ||||
|     return  NO_VALID_PAGE; | ||||
|   } | ||||
| 
 | ||||
|   /* Get the valid Page start Address */ | ||||
|   PageStartAddress = (uint32_t)(EEPROM_START_ADDRESS + (uint32_t)(ValidPage * PAGE_SIZE)); | ||||
| 
 | ||||
|   /* Get the valid Page end Address */ | ||||
|   Address = (uint32_t)((EEPROM_START_ADDRESS - 2) + (uint32_t)((1 + ValidPage) * PAGE_SIZE)); | ||||
| 
 | ||||
|   /* Check each active page address starting from end */ | ||||
|   while (Address > (PageStartAddress + 2)) | ||||
|   { | ||||
|     /* Get the current location content to be compared with virtual address */ | ||||
|     AddressValue = (*(__IO uint16_t*)Address); | ||||
| 
 | ||||
|     /* Compare the read address with the virtual address */ | ||||
|     if (AddressValue == VirtAddress) | ||||
|     { | ||||
|       /* Get content of Address-2 which is variable value */ | ||||
|       *Data = (*(__IO uint16_t*)(Address - 2)); | ||||
| 
 | ||||
|       /* In case variable value is read, reset ReadStatus flag */ | ||||
|       ReadStatus = 0; | ||||
| 
 | ||||
|       break; | ||||
|     } | ||||
|     else | ||||
|     { | ||||
|       /* Next address location */ | ||||
|       Address = Address - 4; | ||||
|     } | ||||
|   } | ||||
| 
 | ||||
|   /* Return ReadStatus value: (0: variable exist, 1: variable doesn't exist) */ | ||||
|   return ReadStatus; | ||||
| } | ||||
| 
 | ||||
| /**
 | ||||
|   * @brief  Writes/upadtes variable data in EEPROM. | ||||
|   * @param  VirtAddress: Variable virtual address | ||||
|   * @param  Data: 16 bit data to be written | ||||
|   * @retval Success or error status: | ||||
|   *           - FLASH_COMPLETE: on success | ||||
|   *           - PAGE_FULL: if valid page is full | ||||
|   *           - NO_VALID_PAGE: if no valid page was found | ||||
|   *           - Flash error code: on write Flash error | ||||
|   */ | ||||
| uint16_t EE_WriteVariable(uint16_t VirtAddress, uint16_t Data) | ||||
| { | ||||
|   uint16_t Status = 0; | ||||
| 
 | ||||
|   /* Write the variable virtual address and value in the EEPROM */ | ||||
|   Status = EE_VerifyPageFullWriteVariable(VirtAddress, Data); | ||||
| 
 | ||||
|   /* In case the EEPROM active page is full */ | ||||
|   if (Status == PAGE_FULL) | ||||
|   { | ||||
|     /* Perform Page transfer */ | ||||
|     Status = EE_PageTransfer(VirtAddress, Data); | ||||
|   } | ||||
| 
 | ||||
|   /* Return last operation status */ | ||||
|   return Status; | ||||
| } | ||||
| 
 | ||||
| /**
 | ||||
|   * @brief  Erases PAGE and PAGE1 and writes VALID_PAGE header to PAGE | ||||
|   * @param  None | ||||
|   * @retval Status of the last operation (Flash write or erase) done during | ||||
|   *         EEPROM formating | ||||
|   */ | ||||
| static HAL_StatusTypeDef EE_Format(void) | ||||
| { | ||||
|   HAL_StatusTypeDef FlashStatus = HAL_OK; | ||||
| 
 | ||||
|   /* Erase Page0 */ | ||||
|   if(!EE_VerifyPageFullyErased(PAGE0_BASE_ADDRESS)) | ||||
|   { | ||||
|     FlashStatus = FLASH_EraseSectorF4(PAGE0_ID); | ||||
|     /* If erase operation was failed, a Flash error code is returned */ | ||||
|     if (FlashStatus != HAL_OK) | ||||
|     { | ||||
|       return FlashStatus; | ||||
|     } | ||||
|   } | ||||
|   /* Set Page0 as valid page: Write VALID_PAGE at Page0 base address */ | ||||
|   FlashStatus = FLASH_ProgramHalfWordF4(PAGE0_BASE_ADDRESS, VALID_PAGE); | ||||
|   /* If program operation was failed, a Flash error code is returned */ | ||||
|   if (FlashStatus != HAL_OK) | ||||
|   { | ||||
|     return FlashStatus; | ||||
|   } | ||||
| 
 | ||||
|   /* Erase Page1 */ | ||||
|   if(!EE_VerifyPageFullyErased(PAGE1_BASE_ADDRESS)) | ||||
|   { | ||||
|     FlashStatus = FLASH_EraseSectorF4(PAGE1_ID); | ||||
|     /* If erase operation was failed, a Flash error code is returned */ | ||||
|     if (FlashStatus != HAL_OK) | ||||
|     { | ||||
|       return FlashStatus; | ||||
|     } | ||||
|   } | ||||
| 
 | ||||
|   return HAL_OK; | ||||
| } | ||||
| 
 | ||||
| /**
 | ||||
|   * @brief  Find valid Page for write or read operation | ||||
|   * @param  Operation: operation to achieve on the valid page. | ||||
|   *   This parameter can be one of the following values: | ||||
|   *     @arg READ_FROM_VALID_PAGE: read operation from valid page | ||||
|   *     @arg WRITE_IN_VALID_PAGE: write operation from valid page | ||||
|   * @retval Valid page number (PAGE or PAGE1) or NO_VALID_PAGE in case | ||||
|   *   of no valid page was found | ||||
|   */ | ||||
| static uint16_t EE_FindValidPage(uint8_t Operation) | ||||
| { | ||||
|   uint16_t PageStatus0 = 6, PageStatus1 = 6; | ||||
| 
 | ||||
|   /* Get Page0 actual status */ | ||||
|   PageStatus0 = (*(__IO uint16_t*)PAGE0_BASE_ADDRESS); | ||||
| 
 | ||||
|   /* Get Page1 actual status */ | ||||
|   PageStatus1 = (*(__IO uint16_t*)PAGE1_BASE_ADDRESS); | ||||
| 
 | ||||
|   /* Write or read operation */ | ||||
|   switch (Operation) | ||||
|   { | ||||
|     case WRITE_IN_VALID_PAGE:   /* ---- Write operation ---- */ | ||||
|       if (PageStatus1 == VALID_PAGE) | ||||
|       { | ||||
|         /* Page0 receiving data */ | ||||
|         if (PageStatus0 == RECEIVE_DATA) | ||||
|         { | ||||
|           return PAGE0;         /* Page0 valid */ | ||||
|         } | ||||
|         else | ||||
|         { | ||||
|           return PAGE1;         /* Page1 valid */ | ||||
|         } | ||||
|       } | ||||
|       else if (PageStatus0 == VALID_PAGE) | ||||
|       { | ||||
|         /* Page1 receiving data */ | ||||
|         if (PageStatus1 == RECEIVE_DATA) | ||||
|         { | ||||
|           return PAGE1;         /* Page1 valid */ | ||||
|         } | ||||
|         else | ||||
|         { | ||||
|           return PAGE0;         /* Page0 valid */ | ||||
|         } | ||||
|       } | ||||
|       else | ||||
|       { | ||||
|         return NO_VALID_PAGE;   /* No valid Page */ | ||||
|       } | ||||
| 
 | ||||
|     case READ_FROM_VALID_PAGE:  /* ---- Read operation ---- */ | ||||
|       if (PageStatus0 == VALID_PAGE) | ||||
|       { | ||||
|         return PAGE0;           /* Page0 valid */ | ||||
|       } | ||||
|       else if (PageStatus1 == VALID_PAGE) | ||||
|       { | ||||
|         return PAGE1;           /* Page1 valid */ | ||||
|       } | ||||
|       else | ||||
|       { | ||||
|         return NO_VALID_PAGE ;  /* No valid Page */ | ||||
|       } | ||||
| 
 | ||||
|     default: | ||||
|       return PAGE0;             /* Page0 valid */ | ||||
|   } | ||||
| } | ||||
| 
 | ||||
| /**
 | ||||
|   * @brief  Verify if active page is full and Writes variable in EEPROM. | ||||
|   * @param  VirtAddress: 16 bit virtual address of the variable | ||||
|   * @param  Data: 16 bit data to be written as variable value | ||||
|   * @retval Success or error status: | ||||
|   *           - FLASH_COMPLETE: on success | ||||
|   *           - PAGE_FULL: if valid page is full | ||||
|   *           - NO_VALID_PAGE: if no valid page was found | ||||
|   *           - Flash error code: on write Flash error | ||||
|   */ | ||||
| static uint16_t EE_VerifyPageFullWriteVariable(uint16_t VirtAddress, uint16_t Data) | ||||
| { | ||||
|   HAL_StatusTypeDef FlashStatus = HAL_OK; | ||||
|   uint16_t ValidPage = PAGE0; | ||||
|   uint32_t Address = EEPROM_START_ADDRESS, PageEndAddress = EEPROM_START_ADDRESS+PAGE_SIZE; | ||||
| 
 | ||||
|   /* Get valid Page for write operation */ | ||||
|   ValidPage = EE_FindValidPage(WRITE_IN_VALID_PAGE); | ||||
| 
 | ||||
|   /* Check if there is no valid page */ | ||||
|   if (ValidPage == NO_VALID_PAGE) | ||||
|   { | ||||
|     return  NO_VALID_PAGE; | ||||
|   } | ||||
| 
 | ||||
|   /* Get the valid Page start Address */ | ||||
|   Address = (uint32_t)(EEPROM_START_ADDRESS + (uint32_t)(ValidPage * PAGE_SIZE)); | ||||
| 
 | ||||
|   /* Get the valid Page end Address */ | ||||
|   PageEndAddress = (uint32_t)((EEPROM_START_ADDRESS - 1) + (uint32_t)((ValidPage + 1) * PAGE_SIZE)); | ||||
| 
 | ||||
|   /* Check each active page address starting from begining */ | ||||
|   while (Address < PageEndAddress) | ||||
|   { | ||||
|     /* Verify if Address and Address+2 contents are 0xFFFFFFFF */ | ||||
|     if ((*(__IO uint32_t*)Address) == 0xFFFFFFFF) | ||||
|     { | ||||
|       /* Set variable data */ | ||||
|       FlashStatus = FLASH_ProgramHalfWordF4(Address, Data); | ||||
|       /* If program operation was failed, a Flash error code is returned */ | ||||
|       if (FlashStatus != HAL_OK) | ||||
|       { | ||||
|         return FlashStatus; | ||||
|       } | ||||
|       /* Set variable virtual address */ | ||||
|       FlashStatus = FLASH_ProgramHalfWordF4(Address + 2, VirtAddress); | ||||
|       /* Return program operation status */ | ||||
|       return FlashStatus; | ||||
|     } | ||||
|     else | ||||
|     { | ||||
|       /* Next address location */ | ||||
|       Address = Address + 4; | ||||
|     } | ||||
|   } | ||||
| 
 | ||||
|   /* Return PAGE_FULL in case the valid page is full */ | ||||
|   return PAGE_FULL; | ||||
| } | ||||
| 
 | ||||
| /**
 | ||||
|   * @brief  Transfers last updated variables data from the full Page to | ||||
|   *   an empty one. | ||||
|   * @param  VirtAddress: 16 bit virtual address of the variable | ||||
|   * @param  Data: 16 bit data to be written as variable value | ||||
|   * @retval Success or error status: | ||||
|   *           - FLASH_COMPLETE: on success | ||||
|   *           - PAGE_FULL: if valid page is full | ||||
|   *           - NO_VALID_PAGE: if no valid page was found | ||||
|   *           - Flash error code: on write Flash error | ||||
|   */ | ||||
| static uint16_t EE_PageTransfer(uint16_t VirtAddress, uint16_t Data) | ||||
| { | ||||
|   HAL_StatusTypeDef FlashStatus = HAL_OK; | ||||
|   uint32_t NewPageAddress = EEPROM_START_ADDRESS; | ||||
|   uint16_t OldPageId=0; | ||||
|   uint16_t ValidPage = PAGE0, VarIdx = 0; | ||||
|   uint16_t EepromStatus = 0, ReadStatus = 0; | ||||
| 
 | ||||
|   /* Get active Page for read operation */ | ||||
|   ValidPage = EE_FindValidPage(READ_FROM_VALID_PAGE); | ||||
| 
 | ||||
|   if (ValidPage == PAGE1)       /* Page1 valid */ | ||||
|   { | ||||
|     /* New page address where variable will be moved to */ | ||||
|     NewPageAddress = PAGE0_BASE_ADDRESS; | ||||
| 
 | ||||
|     /* Old page ID where variable will be taken from */ | ||||
|     OldPageId = PAGE1_ID; | ||||
|   } | ||||
|   else if (ValidPage == PAGE0)  /* Page0 valid */ | ||||
|   { | ||||
|     /* New page address  where variable will be moved to */ | ||||
|     NewPageAddress = PAGE1_BASE_ADDRESS; | ||||
| 
 | ||||
|     /* Old page ID where variable will be taken from */ | ||||
|     OldPageId = PAGE0_ID; | ||||
|   } | ||||
|   else | ||||
|   { | ||||
|     return NO_VALID_PAGE;       /* No valid Page */ | ||||
|   } | ||||
| 
 | ||||
|   /* Set the new Page status to RECEIVE_DATA status */ | ||||
|   FlashStatus = FLASH_ProgramHalfWordF4(NewPageAddress, RECEIVE_DATA); | ||||
|   /* If program operation was failed, a Flash error code is returned */ | ||||
|   if (FlashStatus != HAL_OK) | ||||
|   { | ||||
|     return FlashStatus; | ||||
|   } | ||||
| 
 | ||||
|   /* Write the variable passed as parameter in the new active page */ | ||||
|   EepromStatus = EE_VerifyPageFullWriteVariable(VirtAddress, Data); | ||||
|   /* If program operation was failed, a Flash error code is returned */ | ||||
|   if (EepromStatus != HAL_OK) | ||||
|   { | ||||
|     return EepromStatus; | ||||
|   } | ||||
| 
 | ||||
|   /* Transfer process: transfer variables from old to the new active page */ | ||||
|   for (VarIdx = 0; VarIdx < NB_OF_VAR; VarIdx++) | ||||
|   { | ||||
|     if (VirtAddVarTab[VarIdx] != VirtAddress)  /* Check each variable except the one passed as parameter */ | ||||
|     { | ||||
|       /* Read the other last variable updates */ | ||||
|       ReadStatus = EE_ReadVariable(VirtAddVarTab[VarIdx], &DataVar); | ||||
|       /* In case variable corresponding to the virtual address was found */ | ||||
|       if (ReadStatus != 0x1) | ||||
|       { | ||||
|         /* Transfer the variable to the new active page */ | ||||
|         EepromStatus = EE_VerifyPageFullWriteVariable(VirtAddVarTab[VarIdx], DataVar); | ||||
|         /* If program operation was failed, a Flash error code is returned */ | ||||
|         if (EepromStatus != HAL_OK) | ||||
|         { | ||||
|           return EepromStatus; | ||||
|         } | ||||
|       } | ||||
|     } | ||||
|   } | ||||
| 
 | ||||
|   /* Erase the old Page: Set old Page status to ERASED status */ | ||||
|   FlashStatus = FLASH_EraseSectorF4(OldPageId); | ||||
|   /* If erase operation was failed, a Flash error code is returned */ | ||||
|   if (FlashStatus != HAL_OK) | ||||
|   { | ||||
|     return FlashStatus; | ||||
|   } | ||||
| 
 | ||||
|   /* Set new Page status to VALID_PAGE status */ | ||||
|   FlashStatus = FLASH_ProgramHalfWordF4(NewPageAddress, VALID_PAGE); | ||||
|   /* If program operation was failed, a Flash error code is returned */ | ||||
|   if (FlashStatus != HAL_OK) | ||||
|   { | ||||
|     return FlashStatus; | ||||
|   } | ||||
| 
 | ||||
|   /* Return last operation flash status */ | ||||
|   return FlashStatus; | ||||
| } | ||||
| 
 | ||||
| /* flash operation */ | ||||
| 
 | ||||
| #define EraseTimeout        ((uint32_t)0x00000FFF) | ||||
| #define ProgramTimeout      ((uint32_t)0x0000001F) | ||||
| 
 | ||||
| #define FLASH_PSIZE_BYTE    0 | ||||
| #define FLASH_PSIZE_HFWORD  FLASH_CR_PSIZE_0 | ||||
| #define FLASH_PSIZE_WORD    FLASH_CR_PSIZE_1 | ||||
| #define FLASH_CR_SNB_Pos    3 | ||||
| #define FLASH_KEY1_F4       0x45670123 | ||||
| #define FLASH_KEY2_F4       0xCDEF89AB | ||||
| 
 | ||||
| #define ASSERT(exp) (void)((0)) | ||||
| 
 | ||||
| static void Flash_Delay(void) | ||||
| { | ||||
|     __IO uint32_t i = 0; | ||||
|     for(i = 0xFF; i != 0; i--) { } | ||||
| } | ||||
| 
 | ||||
| static HAL_StatusTypeDef FLASH_GetStatus(void) | ||||
| { | ||||
|     if ((FLASH->SR & FLASH_SR_BSY) == FLASH_SR_BSY) | ||||
|         return HAL_BUSY; | ||||
| 
 | ||||
|     if ((FLASH->SR & (FLASH_SR_PGSERR|FLASH_SR_PGPERR|FLASH_SR_PGAERR)) != 0) | ||||
|         return HAL_ERROR; | ||||
| 
 | ||||
|     if ((FLASH->SR & FLASH_SR_WRPERR) != 0 ) | ||||
|         return HAL_ERROR; | ||||
| 
 | ||||
|     if ((FLASH->SR & FLASH_SR_SOP) != 0 ) | ||||
|         return HAL_ERROR; | ||||
| 
 | ||||
|     return HAL_OK; | ||||
| } | ||||
| 
 | ||||
| static HAL_StatusTypeDef FLASH_WaitForLastOperation(uint32_t timeout) | ||||
| { | ||||
|     /* Check for the Flash Status */ | ||||
|     HAL_StatusTypeDef status = FLASH_GetStatus(); | ||||
|     /* Wait for a Flash operation to complete or a TIMEOUT to occur */ | ||||
|     while ((status == HAL_BUSY) && (timeout != 0x00)) | ||||
|     { | ||||
|         Flash_Delay(); | ||||
|         status = FLASH_GetStatus(); | ||||
|         timeout--; | ||||
|     } | ||||
|     if (timeout == 0) | ||||
|         status = HAL_TIMEOUT; | ||||
| 
 | ||||
|     return status; | ||||
| } | ||||
| HAL_StatusTypeDef FLASH_UnlockF4(void) | ||||
| { | ||||
|     FLASH->KEYR = FLASH_KEY1_F4; | ||||
|     FLASH->KEYR = FLASH_KEY2_F4; | ||||
|     return HAL_OK; | ||||
| } | ||||
| 
 | ||||
| HAL_StatusTypeDef FLASH_EraseSectorF4(uint32_t sector) | ||||
| { | ||||
|     HAL_StatusTypeDef status = HAL_OK; | ||||
|     /* Wait for last operation to be completed */ | ||||
|     status = FLASH_WaitForLastOperation(EraseTimeout); | ||||
| 
 | ||||
|     if(status == HAL_OK) { | ||||
|         /* if the previous operation is completed, proceed to erase the page */ | ||||
|         CLEAR_BIT(FLASH->CR, FLASH_CR_PSIZE); | ||||
|         FLASH->CR |= FLASH_PSIZE_WORD; | ||||
|         CLEAR_BIT(FLASH->CR, FLASH_CR_SNB); | ||||
|         FLASH->CR |= FLASH_CR_SER | (sector << FLASH_CR_SNB_Pos); | ||||
|         FLASH->CR |= FLASH_CR_STRT; | ||||
| 
 | ||||
|         /* Wait for last operation to be completed */ | ||||
|         status = FLASH_WaitForLastOperation(EraseTimeout); | ||||
|         if(status != HAL_TIMEOUT) | ||||
|         { | ||||
|             /* if the erase operation is completed, disable the PER Bit */ | ||||
|             FLASH->CR &= ~FLASH_CR_SNB; | ||||
|             FLASH->CR &= ~FLASH_CR_SER; | ||||
|         } | ||||
| 
 | ||||
|         FLASH->SR = (FLASH_SR_EOP | FLASH_SR_SOP | FLASH_SR_WRPERR); | ||||
|     } | ||||
|     /* Return the Erase Status */ | ||||
|     return status; | ||||
| } | ||||
| 
 | ||||
| HAL_StatusTypeDef FLASH_ProgramHalfWordF4(uint32_t address, uint16_t data) | ||||
| { | ||||
|     HAL_StatusTypeDef status = HAL_ERROR; | ||||
| 
 | ||||
|     if (IS_FLASH_ADDRESS(address)) | ||||
|     { | ||||
|         /* Wait for last operation to be completed */ | ||||
|         status = FLASH_WaitForLastOperation(ProgramTimeout); | ||||
|         if(status == HAL_OK) { | ||||
|             // set size to byte
 | ||||
|             FLASH->CR &= ~FLASH_CR_PSIZE; | ||||
|             FLASH->CR |= FLASH_PSIZE_HFWORD; | ||||
|             FLASH->CR |= FLASH_CR_PG; | ||||
| 
 | ||||
|             *(__IO uint16_t*)address = data; | ||||
|             /* Wait for last operation to be completed */ | ||||
|             status = FLASH_WaitForLastOperation(ProgramTimeout); | ||||
|             if(status != HAL_TIMEOUT) | ||||
|             { | ||||
|                 /* if the program operation is completed, disable the PG Bit */ | ||||
|                 FLASH->CR &= ~FLASH_CR_PG; | ||||
|             } | ||||
|             FLASH->SR = (FLASH_SR_EOP | FLASH_SR_SOP | FLASH_SR_PGSERR | FLASH_SR_PGPERR | FLASH_SR_PGAERR | FLASH_SR_WRPERR); | ||||
|         } | ||||
|     } | ||||
|     return status; | ||||
| } | ||||
| 
 | ||||
| /**
 | ||||
|   * @} | ||||
|   */ | ||||
| 
 | ||||
| /******************* (C) COPYRIGHT 2017 STMicroelectronics *****END OF FILE****/ | ||||
| @ -1,130 +0,0 @@ | ||||
| /**
 | ||||
|   ****************************************************************************** | ||||
|   * @file    EEPROM/EEPROM_Emulation/inc/eeprom.h | ||||
|   * @author  MCD Application Team | ||||
|   * @brief   This file contains all the functions prototypes for the EEPROM | ||||
|   *          emulation firmware library. | ||||
|   ****************************************************************************** | ||||
|   * @attention | ||||
|   * | ||||
|   * <h2><center>© Copyright <EFBFBD> 2017 STMicroelectronics International N.V. | ||||
|   * All rights reserved.</center></h2> | ||||
|   * | ||||
|   * Redistribution and use in source and binary forms, with or without | ||||
|   * modification, are permitted, provided that the following conditions are met: | ||||
|   * | ||||
|   * 1. Redistribution of source code must retain the above copyright notice, | ||||
|   *    this list of conditions and the following disclaimer. | ||||
|   * 2. Redistributions in binary form must reproduce the above copyright notice, | ||||
|   *    this list of conditions and the following disclaimer in the documentation | ||||
|   *    and/or other materials provided with the distribution. | ||||
|   * 3. Neither the name of STMicroelectronics nor the names of other | ||||
|   *    contributors to this software may be used to endorse or promote products | ||||
|   *    derived from this software without specific written permission. | ||||
|   * 4. This software, including modifications and/or derivative works of this | ||||
|   *    software, must execute solely and exclusively on microcontroller or | ||||
|   *    microprocessor devices manufactured by or for STMicroelectronics. | ||||
|   * 5. Redistribution and use of this software other than as permitted under | ||||
|   *    this license is void and will automatically terminate your rights under | ||||
|   *    this license. | ||||
|   * | ||||
|   * THIS SOFTWARE IS PROVIDED BY STMICROELECTRONICS AND CONTRIBUTORS "AS IS" | ||||
|   * AND ANY EXPRESS, IMPLIED OR STATUTORY WARRANTIES, INCLUDING, BUT NOT | ||||
|   * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A | ||||
|   * PARTICULAR PURPOSE AND NON-INFRINGEMENT OF THIRD PARTY INTELLECTUAL PROPERTY | ||||
|   * RIGHTS ARE DISCLAIMED TO THE FULLEST EXTENT PERMITTED BY LAW. IN NO EVENT | ||||
|   * SHALL STMICROELECTRONICS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, | ||||
|   * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | ||||
|   * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, | ||||
|   * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF | ||||
|   * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING | ||||
|   * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, | ||||
|   * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||||
|   * | ||||
|   ****************************************************************************** | ||||
|   */ | ||||
| 
 | ||||
| /* Define to prevent recursive inclusion -------------------------------------*/ | ||||
| #ifndef __EEPROM_H | ||||
| #define __EEPROM_H | ||||
| 
 | ||||
| 
 | ||||
| /* Includes ------------------------------------------------------------------*/ | ||||
| #include "hal.h" | ||||
| 
 | ||||
| typedef enum | ||||
| { | ||||
|   HAL_OK       = 0x00U, | ||||
|   HAL_ERROR    = 0x01U, | ||||
|   HAL_BUSY     = 0x02U, | ||||
|   HAL_TIMEOUT  = 0x03U | ||||
| } HAL_StatusTypeDef; | ||||
| 
 | ||||
| /* Exported constants --------------------------------------------------------*/ | ||||
| /* EEPROM emulation firmware error codes */ | ||||
| #define EE_OK      (uint32_t)HAL_OK | ||||
| #define EE_ERROR   (uint32_t)HAL_ERROR | ||||
| #define EE_BUSY    (uint32_t)HAL_BUSY | ||||
| #define EE_TIMEOUT (uint32_t)HAL_TIMEOUT | ||||
| 
 | ||||
| /* Define the size of the sectors to be used */ | ||||
| #define PAGE_SIZE               (uint32_t)0x4000  /* Page size = 16KByte */ | ||||
| 
 | ||||
| /* Device voltage range supposed to be [2.7V to 3.6V], the operation will
 | ||||
|    be done by word  */ | ||||
| #define VOLTAGE_RANGE           (uint8_t)VOLTAGE_RANGE_3 | ||||
| 
 | ||||
| /* EEPROM start address in Flash */ | ||||
| #define EEPROM_START_ADDRESS  ((uint32_t)0x08008000) /* EEPROM emulation start address: | ||||
|                                                   from sector2 : after 16KByte of used | ||||
|                                                   Flash memory */ | ||||
| 
 | ||||
| /* Pages 0 and 1 base and end addresses */ | ||||
| #define PAGE0_BASE_ADDRESS    ((uint32_t)(EEPROM_START_ADDRESS + 0x0000)) | ||||
| #define PAGE0_END_ADDRESS     ((uint32_t)(EEPROM_START_ADDRESS + (PAGE_SIZE - 1))) | ||||
| #define PAGE0_ID               2//FLASH_SECTOR_2
 | ||||
| 
 | ||||
| #define PAGE1_BASE_ADDRESS    ((uint32_t)(EEPROM_START_ADDRESS + 0x4000)) | ||||
| #define PAGE1_END_ADDRESS     ((uint32_t)(EEPROM_START_ADDRESS + (2 * PAGE_SIZE - 1))) | ||||
| #define PAGE1_ID               3//FLASH_SECTOR_3
 | ||||
| 
 | ||||
| /* Used Flash pages for EEPROM emulation */ | ||||
| #define PAGE0                 ((uint16_t)0x0000) | ||||
| #define PAGE1                 ((uint16_t)0x0001) /* Page nb between PAGE0_BASE_ADDRESS & PAGE1_BASE_ADDRESS*/ | ||||
| 
 | ||||
| /* No valid page define */ | ||||
| #define NO_VALID_PAGE         ((uint16_t)0x00AB) | ||||
| 
 | ||||
| /* Page status definitions */ | ||||
| #define ERASED                ((uint16_t)0xFFFF)     /* Page is empty */ | ||||
| #define RECEIVE_DATA          ((uint16_t)0xEEEE)     /* Page is marked to receive data */ | ||||
| #define VALID_PAGE            ((uint16_t)0x0000)     /* Page containing valid data */ | ||||
| 
 | ||||
| /* Valid pages in read and write defines */ | ||||
| #define READ_FROM_VALID_PAGE  ((uint8_t)0x00) | ||||
| #define WRITE_IN_VALID_PAGE   ((uint8_t)0x01) | ||||
| 
 | ||||
| /* Page full define */ | ||||
| #define PAGE_FULL             ((uint8_t)0x80) | ||||
| 
 | ||||
| /* Variables' number */ | ||||
| #define NB_OF_VAR             ((uint8_t)0x16) | ||||
| 
 | ||||
| /* Exported types ------------------------------------------------------------*/ | ||||
| /* Exported macro ------------------------------------------------------------*/ | ||||
| /* Exported functions ------------------------------------------------------- */ | ||||
| 
 | ||||
| HAL_StatusTypeDef FLASH_UnlockF4(void); | ||||
| HAL_StatusTypeDef FLASH_EraseSectorF4(uint32_t sector); | ||||
| HAL_StatusTypeDef FLASH_ProgramHalfWordF4(uint32_t address, uint16_t data); | ||||
| 
 | ||||
| uint16_t EE_Init(void); | ||||
| uint16_t EE_ReadVariable(uint16_t VirtAddress, uint16_t* Data); | ||||
| uint16_t EE_WriteVariable(uint16_t VirtAddress, uint16_t Data); | ||||
| 
 | ||||
| #define IS_FLASH_ADDRESS(ADDRESS) (((ADDRESS) >= EEPROM_START_ADDRESS) && ((ADDRESS) < PAGE1_END_ADDRESS)) | ||||
| #define IS_FLASH_SECTOR(SECTOR) (((SECTOR) >= PAGE0_ID) && ((SECTOR) <= PAGE1_ID)) | ||||
| 
 | ||||
| #endif /* __EEPROM_H */ | ||||
| 
 | ||||
| /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ | ||||
| @ -53,5 +53,4 @@ RGBLIGHT_CUSTOM_DRIVER = yes | ||||
| # project specific files
 | ||||
| SRC += \
 | ||||
|     matrix.c \
 | ||||
|     ws2812_f4.c \
 | ||||
| 	eeprom_f4.c | ||||
|     ws2812_f4.c | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 skullY
						skullY