.
ROMSLOT_STM32F4.cpp@2:ecbff7f1e453, 2016-04-09 (annotated)
- Committer:
- va009039
- Date:
- Sat Apr 09 15:30:12 2016 +0900
- Revision:
- 2:ecbff7f1e453
add Nucleo-F401RE.
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
va009039 |
2:ecbff7f1e453 | 1 | // ROMSLOT_STM32F4.cpp 2016/4/9 |
va009039 |
2:ecbff7f1e453 | 2 | #if defined(TARGET_STM32F4) |
va009039 |
2:ecbff7f1e453 | 3 | #include "ROMSLOT.h" |
va009039 |
2:ecbff7f1e453 | 4 | |
va009039 |
2:ecbff7f1e453 | 5 | static const uint32_t FLASH_SECTOR_SIZE = 0x20000; // 128 Kbytes |
va009039 |
2:ecbff7f1e453 | 6 | |
va009039 |
2:ecbff7f1e453 | 7 | ROMSLOT::ROMSLOT() { |
va009039 |
2:ecbff7f1e453 | 8 | base = 0x20000; |
va009039 |
2:ecbff7f1e453 | 9 | } |
va009039 |
2:ecbff7f1e453 | 10 | |
va009039 |
2:ecbff7f1e453 | 11 | uint32_t ROMSLOT::New(uint32_t size) { |
va009039 |
2:ecbff7f1e453 | 12 | uint32_t addr = base; |
va009039 |
2:ecbff7f1e453 | 13 | base += (size + FLASH_SECTOR_SIZE - 1) / FLASH_SECTOR_SIZE * FLASH_SECTOR_SIZE; |
va009039 |
2:ecbff7f1e453 | 14 | return addr; |
va009039 |
2:ecbff7f1e453 | 15 | } |
va009039 |
2:ecbff7f1e453 | 16 | |
va009039 |
2:ecbff7f1e453 | 17 | static bool is_base(uint32_t addr) { |
va009039 |
2:ecbff7f1e453 | 18 | return addr % FLASH_SECTOR_SIZE == 0; |
va009039 |
2:ecbff7f1e453 | 19 | } |
va009039 |
2:ecbff7f1e453 | 20 | |
va009039 |
2:ecbff7f1e453 | 21 | static uint32_t sector(uint32_t addr) { |
va009039 |
2:ecbff7f1e453 | 22 | MBED_ASSERT(addr >= 0x20000 && addr <= 0x60000); |
va009039 |
2:ecbff7f1e453 | 23 | uint32_t s = (addr - 0x20000) / FLASH_SECTOR_SIZE + 5; // sector 5,6 und 7 |
va009039 |
2:ecbff7f1e453 | 24 | return s; |
va009039 |
2:ecbff7f1e453 | 25 | } |
va009039 |
2:ecbff7f1e453 | 26 | |
va009039 |
2:ecbff7f1e453 | 27 | bool ROMSLOT::Write(uint32_t addr, const uint8_t buf[], uint32_t size) { |
va009039 |
2:ecbff7f1e453 | 28 | uint32_t data; |
va009039 |
2:ecbff7f1e453 | 29 | MBED_ASSERT(addr % sizeof(data) == 0); |
va009039 |
2:ecbff7f1e453 | 30 | MBED_ASSERT(size % sizeof(data) == 0); |
va009039 |
2:ecbff7f1e453 | 31 | if (memcmp((uint8_t*)addr, buf, size) == 0) { // skip ? |
va009039 |
2:ecbff7f1e453 | 32 | return true; |
va009039 |
2:ecbff7f1e453 | 33 | } |
va009039 |
2:ecbff7f1e453 | 34 | HAL_FLASH_Unlock(); |
va009039 |
2:ecbff7f1e453 | 35 | bool result = true; |
va009039 |
2:ecbff7f1e453 | 36 | for(uint32_t n = 0; n < size; n += sizeof(data)) { |
va009039 |
2:ecbff7f1e453 | 37 | if (is_base(addr + n)) { |
va009039 |
2:ecbff7f1e453 | 38 | FLASH_EraseInitTypeDef Erase; |
va009039 |
2:ecbff7f1e453 | 39 | Erase.TypeErase = FLASH_TYPEERASE_SECTORS; |
va009039 |
2:ecbff7f1e453 | 40 | Erase.VoltageRange = FLASH_VOLTAGE_RANGE_1; |
va009039 |
2:ecbff7f1e453 | 41 | Erase.NbSectors = 1; |
va009039 |
2:ecbff7f1e453 | 42 | Erase.Sector = sector(addr + n); |
va009039 |
2:ecbff7f1e453 | 43 | uint32_t PageError = 0; |
va009039 |
2:ecbff7f1e453 | 44 | HAL_StatusTypeDef status = HAL_FLASHEx_Erase(&Erase, &PageError); |
va009039 |
2:ecbff7f1e453 | 45 | MBED_ASSERT(status == HAL_OK); |
va009039 |
2:ecbff7f1e453 | 46 | if (status != HAL_OK) { |
va009039 |
2:ecbff7f1e453 | 47 | result = false; |
va009039 |
2:ecbff7f1e453 | 48 | break; |
va009039 |
2:ecbff7f1e453 | 49 | } |
va009039 |
2:ecbff7f1e453 | 50 | } |
va009039 |
2:ecbff7f1e453 | 51 | memcpy(&data, buf + n, sizeof(data)); |
va009039 |
2:ecbff7f1e453 | 52 | HAL_StatusTypeDef status = HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD, addr + n, data); |
va009039 |
2:ecbff7f1e453 | 53 | MBED_ASSERT(status == HAL_OK); |
va009039 |
2:ecbff7f1e453 | 54 | if (status != HAL_OK) { |
va009039 |
2:ecbff7f1e453 | 55 | result = false; |
va009039 |
2:ecbff7f1e453 | 56 | break; |
va009039 |
2:ecbff7f1e453 | 57 | } |
va009039 |
2:ecbff7f1e453 | 58 | } |
va009039 |
2:ecbff7f1e453 | 59 | HAL_FLASH_Lock(); |
va009039 |
2:ecbff7f1e453 | 60 | return result; |
va009039 |
2:ecbff7f1e453 | 61 | } |
va009039 |
2:ecbff7f1e453 | 62 | #endif // TARGET_STM32F4 |
va009039 |
2:ecbff7f1e453 | 63 |