V 2.0.0
This commit is contained in:
		
							parent
							
								
									4f5ef9f303
								
							
						
					
					
						commit
						ccb49ab9bf
					
				
							
								
								
									
										238
									
								
								ee.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										238
									
								
								ee.c
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,238 @@ | |||
| 
 | ||||
| #include "ee.h" | ||||
| #include "eeConfig.h" | ||||
| #include <string.h> | ||||
| 
 | ||||
| #define   PAGE                  0 | ||||
| #define   SECTOR                1 | ||||
| 
 | ||||
| #if defined(STM32F103xB) | ||||
| #define		_EE_SIZE              1024 | ||||
| #define   _EE_ADDR_INUSE        (((uint32_t)0x08000000) | (_EE_SIZE * _EE_USE_FLASH_PAGE_OR_SECTOR)) | ||||
| #define   _EE_FLASH_BANK        FLASH_BANK_1 | ||||
| #define   _EE_PAGE_OR_SECTOR    PAGE | ||||
| #if (_EE_USE_FLASH_PAGE_OR_SECTOR > 127) | ||||
| #error  "Please Enter currect address, maximum is (127)" | ||||
| #endif | ||||
| #endif | ||||
| 
 | ||||
| #if defined(STM32F103x8) | ||||
| #define		_EE_MAX_SIZE          1024 | ||||
| #define   _EE_ADDR_INUSE        (((uint32_t)0x08000000) | (_EE_MAX_SIZE * _EE_USE_FLASH_PAGE_OR_SECTOR)) | ||||
| #define   _EE_FLASH_BANK        FLASH_BANK_1 | ||||
| #define   _EE_PAGE_OR_SECTOR    PAGE | ||||
| #if (_EE_USE_FLASH_PAGE_OR_SECTOR > 63) | ||||
| #error  "Please Enter currect address, maximum is (63)" | ||||
| #endif | ||||
| #endif | ||||
| 
 | ||||
| #if defined(STM32F103xC) | ||||
| #define		_EE_SIZE              2048 | ||||
| #define   _EE_ADDR_INUSE        (((uint32_t)0x08000000) | (_EE_SIZE * _EE_USE_FLASH_PAGE_OR_SECTOR)) | ||||
| #define   _EE_FLASH_BANK        FLASH_BANK_1 | ||||
| #define   _EE_PAGE_OR_SECTOR    PAGE | ||||
| #if (_EE_USE_FLASH_PAGE_OR_SECTOR > 127) | ||||
| #error  "Please Enter currect address, maximum is (127)" | ||||
| #endif | ||||
| #endif | ||||
| 
 | ||||
| #if defined(STM32F103xD) | ||||
| #define		_EE_SIZE              2048 | ||||
| #define   _EE_ADDR_INUSE        (((uint32_t)0x08000000) | (_EE_SIZE * _EE_USE_FLASH_PAGE_OR_SECTOR)) | ||||
| #define   _EE_FLASH_BANK        FLASH_BANK_1 | ||||
| #define   _EE_PAGE_OR_SECTOR    PAGE | ||||
| #if (_EE_USE_FLASH_PAGE_OR_SECTOR > 191) | ||||
| #error  "Please Enter currect address, maximum is (191)" | ||||
| #endif | ||||
| #endif | ||||
| 
 | ||||
| #if defined(STM32F103xE) | ||||
| #define		_EE_SIZE              2048 | ||||
| #define   _EE_ADDR_INUSE        (((uint32_t)0x08000000) | (_EE_SIZE * _EE_USE_FLASH_PAGE_OR_SECTOR)) | ||||
| #define   _EE_FLASH_BANK        FLASH_BANK_1 | ||||
| #define   _EE_PAGE_OR_SECTOR    PAGE | ||||
| #if (_EE_USE_FLASH_PAGE_OR_SECTOR > 255) | ||||
| #error  "Please Enter currect address, maximum is (255)" | ||||
| #endif | ||||
| #endif | ||||
| 
 | ||||
| #if defined(STM32F030x4) || defined(STM32F042x4)  || defined(STM32F070x4) | ||||
| #define		_EE_SIZE              1024 | ||||
| #define   _EE_ADDR_INUSE        (((uint32_t)0x08000000) | (_EE_SIZE * _EE_USE_FLASH_PAGE_OR_SECTOR)) | ||||
| #define   _EE_PAGE_OR_SECTOR    PAGE | ||||
| #if (_EE_USE_FLASH_PAGE_OR_SECTOR > 15) | ||||
| #error  "Please Enter currect address, maximum is (15)" | ||||
| #endif | ||||
| #endif | ||||
| 
 | ||||
| #if  defined(STM32F030x6) || defined(STM32F042x6) || defined(STM32F070x6) | ||||
| #define		_EE_SIZE              1024 | ||||
| #define   _EE_ADDR_INUSE        (((uint32_t)0x08000000) | (_EE_SIZE * _EE_USE_FLASH_PAGE_OR_SECTOR)) | ||||
| #define   _EE_PAGE_OR_SECTOR    PAGE | ||||
| #if (_EE_USE_FLASH_PAGE_OR_SECTOR > 31) | ||||
| #error  "Please Enter currect address, maximum is (31)" | ||||
| #endif | ||||
| #endif | ||||
| 
 | ||||
| #if defined(STM32F030x8) || defined(STM32F042x8) | ||||
| #define		_EE_SIZE              1024 | ||||
| #define   _EE_ADDR_INUSE        (((uint32_t)0x08000000) | (_EE_SIZE * _EE_USE_FLASH_PAGE_OR_SECTOR)) | ||||
| #define   _EE_PAGE_OR_SECTOR    PAGE | ||||
| #if (_EE_USE_FLASH_PAGE_OR_SECTOR > 63) | ||||
| #error  "Please Enter currect address, maximum is (63)" | ||||
| #endif | ||||
| #endif | ||||
| 
 | ||||
| #if defined(STM32F070xB) | ||||
| #define		_EE_SIZE              2048 | ||||
| #define   _EE_ADDR_INUSE        (((uint32_t)0x08000000) | (_EE_SIZE * _EE_USE_FLASH_PAGE_OR_SECTOR)) | ||||
| #define   _EE_PAGE_OR_SECTOR    PAGE | ||||
| #if (_EE_USE_FLASH_PAGE_OR_SECTOR > 63) | ||||
| #error  "Please Enter currect address, maximum is (63)" | ||||
| #endif | ||||
| #endif | ||||
| 
 | ||||
| #if defined(STM32F070xC) | ||||
| #define		_EE_SIZE              2048 | ||||
| #define   _EE_ADDR_INUSE        (((uint32_t)0x08000000) | (_EE_SIZE * _EE_USE_FLASH_PAGE_OR_SECTOR)) | ||||
| #define   _EE_PAGE_OR_SECTOR    PAGE | ||||
| #if (_EE_USE_FLASH_PAGE_OR_SECTOR > 127) | ||||
| #error  "Please Enter currect address, maximum is (127)" | ||||
| #endif | ||||
| #endif | ||||
| 
 | ||||
| 
 | ||||
| #if defined(STM32F405xx) || defined(STM32F407xx) || defined(STM32F415xx) || defined(STM32F417xx) | ||||
| #define		_EE_SIZE              (1024 * 128) | ||||
| #define   _EE_ADDR_INUSE        (((uint32_t)0x08020000) | (_EE_SIZE*(_EE_USE_FLASH_PAGE_OR_SECTOR - 5))) | ||||
| #define   _EE_FLASH_BANK        FLASH_BANK_1 | ||||
| #define   _EE_VOLTAGE_RANGE     _EE_VOLTAGE | ||||
| #define   _EE_PAGE_OR_SECTOR    PAGE | ||||
| #if (_EE_USE_FLASH_PAGE_OR_SECTOR > 11) | ||||
| #error  "Please Enter currect address, maximum is (11)" | ||||
| #endif | ||||
| #if (_EE_USE_FLASH_PAGE_OR_SECTOR < 5) | ||||
| #error  "Please Enter currect address, minimum is (5)" | ||||
| #endif | ||||
| #endif | ||||
| 
 | ||||
| #if (_EE_USE_RAM_BYTE > 0) | ||||
| uint16_t ee_ram[_EE_USE_RAM_BYTE / 2]; | ||||
| #endif | ||||
| 
 | ||||
| //##########################################################################################################
 | ||||
| bool ee_init(void) | ||||
| { | ||||
|   #if (_EE_USE_RAM_BYTE > 0) | ||||
|   return ee_read(0, _EE_USE_RAM_BYTE, NULL);   | ||||
|   #else | ||||
|   return true; | ||||
|   #endif   | ||||
| } | ||||
| //##########################################################################################################
 | ||||
| bool ee_format(bool keepRamData) | ||||
| {	 | ||||
|   uint32_t	error; | ||||
| 	HAL_FLASH_Unlock(); | ||||
| 	FLASH_EraseInitTypeDef	flashErase; | ||||
|   #if _EE_PAGE_OR_SECTOR == PAGE | ||||
| 	flashErase.NbPages = 1; | ||||
|   flashErase.PageAddress = _EE_ADDR_INUSE; | ||||
|   flashErase.TypeErase = FLASH_TYPEERASE_PAGES; | ||||
|   #else | ||||
|   flashErase.NbSectors = 1; | ||||
|   flashErase.Sector =  _EE_ADDR_INUSE; | ||||
|   flashErase.TypeErase = FLASH_TYPEERASE_SECTORS; | ||||
|   #endif | ||||
| 	#ifdef _EE_FLASH_BANK | ||||
| 	flashErase.Banks = _EE_FLASH_BANK; | ||||
| 	#endif | ||||
|   #ifdef _EE_VOLTAGE_RANGE | ||||
|   flashErase.VoltageRange = _EE_VOLTAGE_RANGE; | ||||
|   #endif | ||||
| 	if (HAL_FLASHEx_Erase(&flashErase, &error) == HAL_OK) | ||||
| 	{ | ||||
| 		HAL_FLASH_Lock(); | ||||
| 		if(error != 0xFFFFFFFF) | ||||
| 			return false; | ||||
| 		else | ||||
|     { | ||||
|       #if (_EE_USE_RAM_BYTE > 0) | ||||
|       if (keepRamData == false) | ||||
|         memset(ee_ram, 0xFF, _EE_USE_RAM_BYTE); | ||||
|       #endif | ||||
| 			return true;	 | ||||
|     } | ||||
| 	} | ||||
| 	HAL_FLASH_Lock(); | ||||
| 	return false;	 | ||||
| } | ||||
| //##########################################################################################################
 | ||||
| bool ee_read(uint32_t startVirtualAddress, uint32_t lenHalfWord, uint16_t* data) | ||||
| { | ||||
| 	if ((startVirtualAddress + lenHalfWord) >	(_EE_SIZE / 2)) | ||||
| 		return false; | ||||
| 	for (uint32_t	i = startVirtualAddress ; i < lenHalfWord + startVirtualAddress ; i++) | ||||
| 	{ | ||||
|     if (data != NULL) | ||||
|     { | ||||
|       *data =  (*(__IO uint16_t*)(i + _EE_ADDR_INUSE)); | ||||
|       data++; | ||||
|     } | ||||
|     #if (_EE_USE_RAM_BYTE > 0) | ||||
|     if ( i < _EE_USE_RAM_BYTE) | ||||
|       ee_ram[i] = (*(__IO uint16_t*)(i + _EE_ADDR_INUSE)); | ||||
|     #endif		 | ||||
| 	} | ||||
| 	return true; | ||||
| } | ||||
| //##########################################################################################################
 | ||||
| bool ee_write(uint32_t startVirtualAddress, uint32_t lenHalfWord, uint16_t* data) | ||||
| { | ||||
| 	if ((startVirtualAddress + lenHalfWord) >	(_EE_SIZE / 2)) | ||||
| 		return false; | ||||
|   if (data == NULL) | ||||
|     return false; | ||||
| 	HAL_FLASH_Unlock(); | ||||
|   for (uint32_t i = 0; i < lenHalfWord ; i++) | ||||
| 	{		 | ||||
| 		if (HAL_FLASH_Program(FLASH_TYPEPROGRAM_HALFWORD, ((i + startVirtualAddress)) + _EE_ADDR_INUSE, (uint64_t)(data[i])) != HAL_OK) | ||||
| 		{ | ||||
| 			HAL_FLASH_Lock(); | ||||
| 			return false; | ||||
| 		} | ||||
| 	}	 | ||||
| 	HAL_FLASH_Lock(); | ||||
| 	return true; | ||||
| } | ||||
| //##########################################################################################################
 | ||||
| bool ee_writeToRam(uint32_t startVirtualAddress, uint32_t lenHalfWord, uint16_t* data) | ||||
| { | ||||
|   #if (_EE_USE_RAM_BYTE > 0) | ||||
|   if ((startVirtualAddress + lenHalfWord) >	(_EE_USE_RAM_BYTE / 2)) | ||||
| 		return false; | ||||
|   if (data == NULL) | ||||
|     return false; | ||||
|   memcpy(&ee_ram[startVirtualAddress], data, lenHalfWord);   | ||||
|   return true; | ||||
|   #else | ||||
|   return false; | ||||
|   #endif   | ||||
| } | ||||
| //##########################################################################################################
 | ||||
| bool  ee_writeRamToFlash(void) | ||||
| { | ||||
|   #if (_EE_USE_RAM_BYTE > 0) | ||||
|   if (ee_format(true) == false) | ||||
|     return false; | ||||
|   return ee_write(0, _EE_USE_RAM_BYTE, ee_ram);   | ||||
|   #else | ||||
|   return false; | ||||
|   #endif   | ||||
| } | ||||
| //##########################################################################################################
 | ||||
| uint32_t  ee_maxVirtualAddress(void) | ||||
| { | ||||
|   return (_EE_SIZE / 2);   | ||||
| } | ||||
| //##########################################################################################################
 | ||||
							
								
								
									
										40
									
								
								ee.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										40
									
								
								ee.h
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,40 @@ | |||
| #ifndef __EEPROM_H | ||||
| #define __EEPROM_H | ||||
| 
 | ||||
| /*
 | ||||
|   Author:     Nima Askari | ||||
|   WebSite:    http://www.github.com/NimaLTD
 | ||||
|   Instagram:  http://instagram.com/github.NimaLTD
 | ||||
|   Youtube:    https://www.youtube.com/channel/UCUhY7qY1klJm1d2kulr9ckw
 | ||||
|    | ||||
|   Version:    2.0.0 | ||||
|    | ||||
|   Reversion History: | ||||
|   (2.0.0) | ||||
|   Rewrite again. | ||||
| 
 | ||||
| */ | ||||
| 
 | ||||
| #ifdef __cplusplus | ||||
|  extern "C" { | ||||
| #endif | ||||
| 
 | ||||
| #include <stdbool.h> | ||||
| #include "gpio.h" | ||||
| 
 | ||||
| //################################################################################################################
 | ||||
| bool      ee_init(void); | ||||
| bool      ee_format(bool keepRamData); | ||||
| bool      ee_read(uint32_t startVirtualAddress, uint32_t lenHalfWord, uint16_t* data); | ||||
| bool      ee_write(uint32_t startVirtualAddress, uint32_t lenHalfWord, uint16_t* data); | ||||
| bool      ee_writeToRam(uint32_t startVirtualAddress, uint32_t lenHalfWord, uint16_t* data); | ||||
| bool      ee_writeRamToFlash(void); | ||||
| uint32_t  ee_maxVirtualAddress(void); | ||||
| 
 | ||||
| //################################################################################################################
 | ||||
| 
 | ||||
| #ifdef __cplusplus | ||||
| } | ||||
| #endif | ||||
| 
 | ||||
| #endif | ||||
							
								
								
									
										7
									
								
								eeConfig.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										7
									
								
								eeConfig.h
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,7 @@ | |||
| #ifndef __EECONFIG_H | ||||
| #define __EECONFIG_H | ||||
| 
 | ||||
| #define   _EE_USE_FLASH_PAGE_OR_SECTOR              (63) | ||||
| #define   _EE_USE_RAM_BYTE                          (1024) | ||||
| #define   _EE_VOLTAGE                               FLASH_VOLTAGE_RANGE_3 //  use in some devices
 | ||||
| #endif | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user
	 Nima Askari ----- نیما عسکری
						Nima Askari ----- نیما عسکری