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