![](/media/cache/img/default_profile.jpg.50x50_q85.jpg)
test
Dependencies: mbed BufferedSerial LS7366LIB2 FastPWM
Diff: flash.h
- Revision:
- 0:e12eb40b9fef
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/flash.h Thu Apr 23 00:38:16 2020 +0000 @@ -0,0 +1,84 @@ +#ifndef _FLASH_H_ +#define _FLASH_H_ + +// ST32F103RBT6 - FLASH : 128KB, SRAM : 20KB (Medium-density model) +// flash memory page : 127 (last page) +// flash memory size : 1KB, unit : Word(4Byte) +// 0x0801 FC00 - 0x0801 FFFF +#define FLASH_START_ADDRESS ((uint32_t)0x0801FC00) +#define FLASH_END_ADDRESS ((uint32_t)0x0801FFFF) + +#define FLASH_START_ADDRESS2 ((uint32_t)0x0801F800) +#define FLASH_END_ADDRESS2 ((uint32_t)0x0801FBFF) + +uint32_t flash_address_count = 0; + +bool Flash_Head_Check(); +void Erase_Flash(); +void Write_Flash(uint32_t data); +uint32_t Read_Flash(uint32_t address); + +bool Flash_Head_Check() +{ + uint32_t flash_data[5]; + for(uint32_t i = 0; i < 5; i++) + { + flash_data[i] = Read_Flash(i * 4); + } + + if ( (char)flash_data[0] == 'F' + && (char)flash_data[1] == 'L' + && (char)flash_data[2] == 'A' + && (char)flash_data[3] == 'S' + && (char)flash_data[4] == 'H') + { + return true; + } + else + { + return false; + } +} + + +void Erase_Flash() +{ + static FLASH_EraseInitTypeDef flash_struct; // Flash erase struct + uint32_t PageError = 0; // Page error state + + flash_struct.TypeErase = FLASH_TYPEERASE_PAGES; // Erase type : Page + flash_struct.PageAddress = FLASH_START_ADDRESS; // Flash start address + flash_struct.NbPages = 1; // Number of page + + HAL_FLASH_Unlock(); // Flash control unlock + if(HAL_FLASHEx_Erase(&flash_struct, &PageError) != HAL_OK) // Flash erase function & result, HAL_OK = true + { + //pc.printf("Flash erase error!\n\r"); + } + HAL_FLASH_Lock(); // Flash control lock + flash_address_count = 0; // Flash address count variable reset +} + + +void Write_Flash(uint32_t data) +{ + if(Read_Flash(flash_address_count * 4)) + { + HAL_FLASH_Unlock(); + HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD, FLASH_START_ADDRESS + (flash_address_count * 4), data); + HAL_FLASH_Lock(); + } + flash_address_count++; +} + +uint32_t Read_Flash(uint32_t address) +{ + uint32_t val = 0; + address = address + FLASH_START_ADDRESS; + val = *(__IO uint32_t*)address; + + return val; +} + + +#endif