test
Dependencies: mbed BufferedSerial LS7366LIB2 FastPWM
flash.h@0:e12eb40b9fef, 2020-04-23 (annotated)
- Committer:
- lsh2205
- Date:
- Thu Apr 23 00:38:16 2020 +0000
- Revision:
- 0:e12eb40b9fef
test;
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
lsh2205 | 0:e12eb40b9fef | 1 | #ifndef _FLASH_H_ |
lsh2205 | 0:e12eb40b9fef | 2 | #define _FLASH_H_ |
lsh2205 | 0:e12eb40b9fef | 3 | |
lsh2205 | 0:e12eb40b9fef | 4 | // ST32F103RBT6 - FLASH : 128KB, SRAM : 20KB (Medium-density model) |
lsh2205 | 0:e12eb40b9fef | 5 | // flash memory page : 127 (last page) |
lsh2205 | 0:e12eb40b9fef | 6 | // flash memory size : 1KB, unit : Word(4Byte) |
lsh2205 | 0:e12eb40b9fef | 7 | // 0x0801 FC00 - 0x0801 FFFF |
lsh2205 | 0:e12eb40b9fef | 8 | #define FLASH_START_ADDRESS ((uint32_t)0x0801FC00) |
lsh2205 | 0:e12eb40b9fef | 9 | #define FLASH_END_ADDRESS ((uint32_t)0x0801FFFF) |
lsh2205 | 0:e12eb40b9fef | 10 | |
lsh2205 | 0:e12eb40b9fef | 11 | #define FLASH_START_ADDRESS2 ((uint32_t)0x0801F800) |
lsh2205 | 0:e12eb40b9fef | 12 | #define FLASH_END_ADDRESS2 ((uint32_t)0x0801FBFF) |
lsh2205 | 0:e12eb40b9fef | 13 | |
lsh2205 | 0:e12eb40b9fef | 14 | uint32_t flash_address_count = 0; |
lsh2205 | 0:e12eb40b9fef | 15 | |
lsh2205 | 0:e12eb40b9fef | 16 | bool Flash_Head_Check(); |
lsh2205 | 0:e12eb40b9fef | 17 | void Erase_Flash(); |
lsh2205 | 0:e12eb40b9fef | 18 | void Write_Flash(uint32_t data); |
lsh2205 | 0:e12eb40b9fef | 19 | uint32_t Read_Flash(uint32_t address); |
lsh2205 | 0:e12eb40b9fef | 20 | |
lsh2205 | 0:e12eb40b9fef | 21 | bool Flash_Head_Check() |
lsh2205 | 0:e12eb40b9fef | 22 | { |
lsh2205 | 0:e12eb40b9fef | 23 | uint32_t flash_data[5]; |
lsh2205 | 0:e12eb40b9fef | 24 | for(uint32_t i = 0; i < 5; i++) |
lsh2205 | 0:e12eb40b9fef | 25 | { |
lsh2205 | 0:e12eb40b9fef | 26 | flash_data[i] = Read_Flash(i * 4); |
lsh2205 | 0:e12eb40b9fef | 27 | } |
lsh2205 | 0:e12eb40b9fef | 28 | |
lsh2205 | 0:e12eb40b9fef | 29 | if ( (char)flash_data[0] == 'F' |
lsh2205 | 0:e12eb40b9fef | 30 | && (char)flash_data[1] == 'L' |
lsh2205 | 0:e12eb40b9fef | 31 | && (char)flash_data[2] == 'A' |
lsh2205 | 0:e12eb40b9fef | 32 | && (char)flash_data[3] == 'S' |
lsh2205 | 0:e12eb40b9fef | 33 | && (char)flash_data[4] == 'H') |
lsh2205 | 0:e12eb40b9fef | 34 | { |
lsh2205 | 0:e12eb40b9fef | 35 | return true; |
lsh2205 | 0:e12eb40b9fef | 36 | } |
lsh2205 | 0:e12eb40b9fef | 37 | else |
lsh2205 | 0:e12eb40b9fef | 38 | { |
lsh2205 | 0:e12eb40b9fef | 39 | return false; |
lsh2205 | 0:e12eb40b9fef | 40 | } |
lsh2205 | 0:e12eb40b9fef | 41 | } |
lsh2205 | 0:e12eb40b9fef | 42 | |
lsh2205 | 0:e12eb40b9fef | 43 | |
lsh2205 | 0:e12eb40b9fef | 44 | void Erase_Flash() |
lsh2205 | 0:e12eb40b9fef | 45 | { |
lsh2205 | 0:e12eb40b9fef | 46 | static FLASH_EraseInitTypeDef flash_struct; // Flash erase struct |
lsh2205 | 0:e12eb40b9fef | 47 | uint32_t PageError = 0; // Page error state |
lsh2205 | 0:e12eb40b9fef | 48 | |
lsh2205 | 0:e12eb40b9fef | 49 | flash_struct.TypeErase = FLASH_TYPEERASE_PAGES; // Erase type : Page |
lsh2205 | 0:e12eb40b9fef | 50 | flash_struct.PageAddress = FLASH_START_ADDRESS; // Flash start address |
lsh2205 | 0:e12eb40b9fef | 51 | flash_struct.NbPages = 1; // Number of page |
lsh2205 | 0:e12eb40b9fef | 52 | |
lsh2205 | 0:e12eb40b9fef | 53 | HAL_FLASH_Unlock(); // Flash control unlock |
lsh2205 | 0:e12eb40b9fef | 54 | if(HAL_FLASHEx_Erase(&flash_struct, &PageError) != HAL_OK) // Flash erase function & result, HAL_OK = true |
lsh2205 | 0:e12eb40b9fef | 55 | { |
lsh2205 | 0:e12eb40b9fef | 56 | //pc.printf("Flash erase error!\n\r"); |
lsh2205 | 0:e12eb40b9fef | 57 | } |
lsh2205 | 0:e12eb40b9fef | 58 | HAL_FLASH_Lock(); // Flash control lock |
lsh2205 | 0:e12eb40b9fef | 59 | flash_address_count = 0; // Flash address count variable reset |
lsh2205 | 0:e12eb40b9fef | 60 | } |
lsh2205 | 0:e12eb40b9fef | 61 | |
lsh2205 | 0:e12eb40b9fef | 62 | |
lsh2205 | 0:e12eb40b9fef | 63 | void Write_Flash(uint32_t data) |
lsh2205 | 0:e12eb40b9fef | 64 | { |
lsh2205 | 0:e12eb40b9fef | 65 | if(Read_Flash(flash_address_count * 4)) |
lsh2205 | 0:e12eb40b9fef | 66 | { |
lsh2205 | 0:e12eb40b9fef | 67 | HAL_FLASH_Unlock(); |
lsh2205 | 0:e12eb40b9fef | 68 | HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD, FLASH_START_ADDRESS + (flash_address_count * 4), data); |
lsh2205 | 0:e12eb40b9fef | 69 | HAL_FLASH_Lock(); |
lsh2205 | 0:e12eb40b9fef | 70 | } |
lsh2205 | 0:e12eb40b9fef | 71 | flash_address_count++; |
lsh2205 | 0:e12eb40b9fef | 72 | } |
lsh2205 | 0:e12eb40b9fef | 73 | |
lsh2205 | 0:e12eb40b9fef | 74 | uint32_t Read_Flash(uint32_t address) |
lsh2205 | 0:e12eb40b9fef | 75 | { |
lsh2205 | 0:e12eb40b9fef | 76 | uint32_t val = 0; |
lsh2205 | 0:e12eb40b9fef | 77 | address = address + FLASH_START_ADDRESS; |
lsh2205 | 0:e12eb40b9fef | 78 | val = *(__IO uint32_t*)address; |
lsh2205 | 0:e12eb40b9fef | 79 | |
lsh2205 | 0:e12eb40b9fef | 80 | return val; |
lsh2205 | 0:e12eb40b9fef | 81 | } |
lsh2205 | 0:e12eb40b9fef | 82 | |
lsh2205 | 0:e12eb40b9fef | 83 | |
lsh2205 | 0:e12eb40b9fef | 84 | #endif |